交叉编译内核驱动

一、需要准备的文件
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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值