交叉編譯內核驅動


一、需要准備的文件
a) 客戶提供 Kernel 編譯后輸出目錄中的 .config , Module.symvers 文件。此編譯目錄必須和當前機器中
運行的 Kernel 版本一致。
b) 下載和運行機器中 kernel 版本完全一致的 kernel 源碼。
例如進入機器后: uname -a
Linux localhost 4.14.69-quilt-2e5dc0ac-g4540970 #2 SMP PREEMPT Wed Mar 13 12:57:38
CST 2019 x86_64
則需要下載 kernel 4.14.69 https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/ lnux i -
4.14.69.tar.xz


二、准備 kernel 環境
a) 解壓下載的 kernel 源碼,例如 ~/workspace/linux-4.14.69
b) 創建用於編譯的 kernel 輸出目錄 KERNEL_TARGET_DIR ,例如 ~/workspace/linux-headers-
4.14.69
c) 將客戶提供的 .config, Module.symvers 文件復制到 KERNEL_TARGET_DIR
d) 設置好交叉編譯鏈 , CROSS_COMPILE=...
e) 檢查 kernel 輸出目錄中 .config 文件中 CONFIG_LOCALVERSION 值 , 如有需要 , 修改成運行機器上
uname -a 輸出的值 , 例如 quilt-2e5dc0ac
f) 進入 kernel 源碼目錄 , 執行
make CROSS_COMPILE=xxx O=$KERNEL_TARGET_DIR oldconfig
注 : 下載的代碼和目標機器對應的 kernel 代碼配置會有出入 ,configure 過程中可以直接選用默認的配
置 .
g) 執行 make CROSS_COMPILE=xxx O=$KERNEL_TARGET_DIR modules_prepare
執行完以上命令后 , 在 KERNEL_TARGET_DIR 下可以看到以下文件目錄 :
├── arch
├── include
├── kernel
├── Makefile
├── Module.symvers
├── scripts
├── source -> /home/michael/workspace/linux-4.14.69
└── tools
以下是參考的腳本 :
unset LD_LIBRARY_PATH
. /opt/poky/2.4.2/environment-setup-corei7-64-poky-linux
KERNEL_TARGET_DIR=~/workspace/linux-headers-4.14.69
PREBUILT_DIR=~/workspace/target_symbols
rm -rf $KERNEL_TARGET_DIR/*
make CROSS_COMPILE=x86_64-poky-linux- O=$KERNEL_TARGET_DIR mrproper
cp $PREBUILT_DIR/Module.symvers $KERNEL_TARGET_DIR
cp $PREBUILT_DIR/.config $KERNEL_TARGET_DIR
make CROSS_COMPILE=x86_64-poky-linux- O=$KERNEL_TARGET_DIR oldconfig -j4
make CROSS_COMPILE=x86_64-poky-linux- O=$KERNEL_TARGET_DIR modules_prepare -j4
三、編譯驅動
正常編譯驅動 Module, 只是 kernel 路徑要指定為上述的 KERNEL_TARGET_DIR 目錄:
make CROSS_COMPILE=xxx -C ~/workspace/linux-headers-4.14.69 M=`pwd`
四、常見問題
高版本 kernel 上可能配置了對可加載模式的簽名機制, 這樣所有的 module 在加載之前需要先要進行簽名. 可以
查看當前運行機器中的 module 文件中看出:hexdump -C ./vendor/lib/modules/bcmdhd.ko |tail
001172f0 8c 39 c2 88 c6 c9 72 cd 17 59 68 ca 90 84 f9 76 |.9....r..Yh....v|
00117300 05 90 09 ab ef ac ac 88 da e3 01 6d 11 18 70 5e |...........m..p^|
00117310 c2 10 7e 08 a0 7d 5f ff 58 47 b6 38 7a e3 89 ee |..~..}_.XG.8z...|
00117320 46 e8 37 1b 31 0a 7d d1 b6 1f 82 e8 d2 30 ab 8e |F.7.1.}......0..|
00117330 3e 83 a8 4d ef d9 e6 4a ca f2 e3 76 87 6a a6 7c |>..M...J...v.j.||
00117340 f8 20 36 43 30 6c 25 44 d1 3f bd 2e b6 f2 70 21 |. 6C0l%D.?....p!|
00117350 7e 1e 00 89 e4 69 00 00 02 00 00 00 00 00 00 00 |~....i..........|
00117360 02 9e 7e 4d 6f 64 75 6c 65 20 73 69 67 6e 61 74 |..~Module signat|
00117370 75 72 65 20 61 70 70 65 6e 64 65 64 7e 0a
|ure appended~.|
或者從客戶提供的.config 文件看是否配置了 CONFIG_MODULE_SIG:
CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_FORCE=y
CONFIG_MODULE_SIG_ALL=y
# CONFIG_MODULE_SIG_SHA1 is not set
# CONFIG_MODULE_SIG_SHA224 is not set
# CONFIG_MODULE_SIG_SHA256 is not set
# CONFIG_MODULE_SIG_SHA384 is not set
CONFIG_MODULE_SIG_SHA512=y
CONFIG_MODULE_SIG_HASH="sha512"
可以通過以下方式對 modules 簽名 :
RUNTIME_KERNEL_DIR 為存放客戶提供的有關簽名的密鑰 / 證書的目錄 ,
${RUNTIME_KERNEL_DIR}/scripts/sign-file sha512 ${RUNTIME_KERNEL_DIR}/certs/signing_key.pem $
{RUNTIME_KERNEL_DIR}/certs/signing_key.x509 bcmdhd.ko
如果簽名后仍然提示沒有可用的簽名信息 , 可以讓客戶先將 kernel configure 中的 CONFIG_MODULE_SIG
禁用, 重新燒錄新的 kernel.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM