核心内容摘要
Asimov推出“Here Be Dragons”DIY人形机器人套件:1.5万美元打破开源门槛
Linux内核编译从menuconfig配置到zImage生成全流程
核心概念先搞懂
1 关键术语解释术语核心作用zImage压缩后的Linux内核镜像Image原始镜像 解压程序体积小、启动快适用于嵌入式设备menuconfigLinux内核提供的图形化配置工具通过菜单选择启用/禁用内核功能/模块生成.config配置文件.config内核编译的核心配置文件记录menuconfig的选择结果编译时内核会根据该文件裁剪功能Kconfig定义menuconfig的菜单选项如是否启用某驱动决定配置界面的显示逻辑Makefile内核编译的规则文件定义哪些文件需要编译、依赖关系与Kconfig配合实现“配置→编译”联动交叉编译器用于跨平台编译如Ubuntu x86编译ARM架构内核本文使用arm-linux-gnueabihf-gcc
2 镜像文件区别避坑关键Image未压缩的内核原始镜像体积大可直接执行zImageImage的压缩版本带自解压程序嵌入式开发首选uImage在zImage基础上添加64字节头信息用于U-Boot识别需U-Boot支持。
前期准备
1 工具与环境工具/环境要求内核源码适配IMX6的Linux内核如Linux-
5.
y需支持IMX6ULL/IMX6DL等型号交叉编译器arm-linux-gnueabihf-gcc需添加到系统环境变量可通过which arm-linux-gnueabihf-gcc验证Ubuntu主机
1
04/
2
04均可需安装编译依赖sudo apt-get install make gcc libncurses5-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf开发板IMX6系列如IMX6ULL需确保内核配置与开发板硬件匹配
2 内核源码准备将内核源码压缩包拷贝到Ubuntu主机如/home/linux/kernel目录解压并修改权限避免编译时权限不足# 解压源码替换为实际内核文件名sudotar-xvf linux-
5.
xx.tar.gz -C /home/linux/kernel/# 进入源码目录cd/home/linux/kernel/linux-
5.
xx# 修改权限所有用户可读写执行简化操作sudochmod0777 -R.
核心步骤从配置到编译zImage
1 步骤1拷贝默认配置文件内核源码提供了适配不同开发板的默认配置文件位于arch/arm/configs/目录无需从零配置直接复用后修改更高效# 格式make ARCH架构 CROSS_COMPILE交叉编译器 默认配置文件名makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- imx_alientek_emmc_defconfigARCHarm指定目标架构为ARMIMX6是ARM Cortex-A7架构CROSS_COMPILEarm-linux-gnueabihf-指定交叉编译器前缀imx_alientek_emmc_defconfigIMX6开发板的默认配置文件需根据实际开发板型号替换如imx6ull_14x14_evk_defconfig执行后源码目录会生成.config文件包含默认的内核配置。
2 步骤2menuconfig图形化配置裁剪内核通过menuconfig裁剪不需要的功能如无用驱动、文件系统、网络协议减小内核体积makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- menuconfig执行后会进入图形化界面操作规则如下上下键选择菜单选项左右键切换“Select/Exit/Help”等功能空格键启用*编译进内核/禁用空不编译/模块M编译为.ko模块动态加载/搜索指定选项如输入“SPI”快速定位SPI驱动配置配置完成后选择“Save”保存配置覆盖.config再选择“Exit”退出。
常用配置场景以IMX6为例启用驱动如SPI、I2C、LCD、ADC等外设驱动需与开发板硬件匹配禁用无用功能如PCIE、蓝牙、WiFi等开发板无的硬件驱动文件系统支持启用ext
FAT32用于挂载SD卡/NFS网络协议保留TCP/IP禁用IPv
蓝牙协议等按需选择。
3 步骤3编译生成zImage配置完成后执行编译命令内核会根据.config文件编译所需模块最终生成zImage# 多线程编译-j1616线程根据CPU核心数调整如4核用-j4makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- all -j16编译时间取决于CPU性能和内核配置一般5~30分钟生成位置编译成功后zImage会保存在arch/arm/boot/目录下验证进入该目录查看是否存在zImage存在则编译成功。
拓展向内核添加自定义文件demo.c若需在 kernel 中新增自定义驱动/模块如demo.c需修改Kconfig和Makefile让menuconfig识别并编译步骤如下
1 步骤1创建自定义文件在drivers/char/目录字符设备驱动目录下创建demo.c示例内容简单字符设备框架#includelinux/module.h#includelinux/fs.h#includelinux/cdev.hstaticintdemo_open(structinode*inode,structfile*filp){printk(demo device open!\n);return0;}staticstructfile_operationsdemo_fops{.ownerTHIS_MODULE,.opendemo_open,};staticdev_tdev_num;staticstructcdevdemo_cdev;staticint__initdemo_init(void){alloc_chrdev_region(dev_num,0,1,demo);cdev_init(demo_cdev,demo_fops);cdev_add(demo_cdev,dev_num,
;printk(demo module init!\n);return0;}staticvoid__exitdemo_exit(void){cdev_del(demo_cdev);unregister_chrdev_region(dev_num,
;printk(demo module exit!\n);}module_init(demo_init);module_exit(demo_exit);MODULE_LICENSE(GPL);MODULE_DESCRIPTION(Demo Character Device);
2 步骤2修改drivers/char/Makefile在drivers/char/Makefile末尾添加一行关联配置选项与文件# 格式obj-$(CONFIG_选项名) 文件名.o obj-$(CONFIG_DEMO) demo.o含义若menuconfig中CONFIG_DEMO被启用y或M则编译demo.o。
3 步骤3修改drivers/char/Kconfig在drivers/char/Kconfig中添加菜单选项让menuconfig显示该配置# 新增DEMO选项放在合适位置如“Character devices”菜单下 config DEMO tristate Demo Character Device Support help This is a demo for adding custom character device to kernel. If you want to enable demo module, select Y/M.tristate支持“编译进内核Y/模块M/禁用N”三种状态help选项说明menuconfig中按?可查看。
4 步骤4menuconfig启用DEMO选项重新执行menuconfig找到“Character devices”菜单启用“Demo Character Device Support”makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- menuconfig选择Y编译进内核或M编译为模块保存退出。
5 步骤5重新编译内核makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- all -j16若选择Ydemo.o会被链接到内核zImage中包含该模块若选择M会生成demo.ko模块文件位于drivers/char/可后续通过insmod动态加载。
五、
常见问题排查
1 编译报错“权限不足”解决方案执行sudo chmod 0777 -R 内核源码目录或用sudo make编译不推荐可能导致文件权限混乱。
2 menuconfig找不到新增的DEMO选项检查Kconfig修改确保语法正确如tristate拼写、缩进规范重新生成配置删除.config重新拷贝默认配置后再执行menuconfig。
3 zImage未生成在arch/arm/boot目录确认编译命令必须带all参数make all仅make可能只编译部分模块检查编译日志查看是否有编译错误如语法错误、依赖缺失修复后重新编译。
4 交叉编译器识别失败检查环境变量执行echo $PATH确认交叉编译器所在目录已添加验证编译器执行arm-linux-gnueabihf-gcc -v能输出版本信息则正常。
六、