linux交叉编译裁剪内核记录

时间:2023-03-09 09:01:40
linux交叉编译裁剪内核记录

刚开始学习嵌入式内核编译,因为要修改内核的默认配置,因此这里把自己的学习记录写下来,方便以后查阅,也给别人一个参考,有什么写的不对的或者更好的方法,请指正~

开发板有usb从口,现在想要让开发板作为一款打印机设备来被PC机识别(因为以后要用此开发板作为一款一体打印机的主控板)但是内核默认提供的usb gadget设备驱动是大容量存储设备驱动(将默认编译好的内核下载到板子里,用usb连接pc显示大容量存储设备;而且我们可以在编译好的内核文件目录/drivers/usb/gadget/下看到内核选择编译了storage.c文件,其他文件不做编译,这就是配置文件的作用了),因此这里要修改内核配置文件,重新编译内核使其作为usb从设备的打印机。

首先要将开发板的内核文件解压到任意目,然后进入内核根目录

看到内核目录下是没有默认的.config配置文件的

linux交叉编译裁剪内核记录

就需要自己去按照记得硬件平台选择配置文件,复制到根目录下即可,我在arch/arm/config目录下找到自己的配置文件linux交叉编译裁剪内核记录

修改配置文件有三种方法,

命令:make xconfig

  • qconf: 全新的基于QT的配置接口,2.6版本内核
  • 更易使用(切记阅读 help -> introduction: useful options!)
  • 具有文件浏览功能,更易的加载配置文件

命令:make menuconfig

  • 老式字符界面,依然很管用。你够自信,完全可以手写配置文件!

命令:make oldconfig

  • 用于升级早期发布内核的配置文件
  • 对一些绝对符号(obsolete symbols)发出警告
  • 询问新符号的配置值

我用的是make menuconfig,如下。

linux交叉编译裁剪内核记录

这里我们要修改设备驱动,进入device drivers 找到usb gardet 设备驱动 将大容量存储设备修改为printer即可。

大家可以看到usb支持很多驱动,这里内核代码都已经实现,但是为了在嵌入式设备里使用,自然要裁剪内核,所以很多内容都没有安装,因此需要开发人员自己手动设置后在编译内核。我们这里选择 USB Gadget Suppot 即可

linux交叉编译裁剪内核记录

这里也可以看到内核默认支持usb从设备为大容量存储设备。

linux交叉编译裁剪内核记录

选择了作为打印机从设备后,大容量自动取消了,显然是多选一的选项。

linux交叉编译裁剪内核记录

修改后,退出,编译内核,因为是在arm板上编译,自然要选择交叉编译环境。

Make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage

执行这条命令后(以前没有修改配置文件,执行后自动编译内核,等十几分钟即可),但是这次终端重新提示内核配置问题,包括是否支持2TB大文件,硬件平台等等。对于硬件平台和内核知识缺乏的人确实不好选择。我试了很多次没有成功。因为我们的配置文件是写好的,只是修改了一点,为什么会出现这些问题,确实我也不懂。重新修改了很多次配置文件问题依旧,

linux交叉编译裁剪内核记录

最后得出结论就是只要是用menucpnfig或者xconfig打开了配置文件,就不能自动编译了,注意这里我编译是编译arm平台的内核。于是我试了直接编译pc机内核,make 不加任何参数,表示按照本机的硬件平台和编译器来编译,结果通过了,自动编译

linux交叉编译裁剪内核记录

因此我想到是不是我修改配置文件时也和平台有关,事实却是如此,这里显示的是x86平台的配置文件,因为我打开时没有加入ARCH=arm的参数linux交叉编译裁剪内核记录

果然是这样,网上说的修改配置文件的命令很多是基于当前的pc硬件环境,对于我要定制到arm平台的内核裁剪来说,修改配置文件需要在命令中加入 ARCH=arm 这句话,否则修改完的配置文件是基于x86平台。我们执行Make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage ,make工具读取不到自己的arm平台配置文件,自然要显示内核配置选项,这就是我遇到的问题(整整5个多小时,全花在这上边了,基础还是太薄弱)。

因此我们需要重新修改下配置文件,修改的时候第一步需要这样。

Make ARCH=arm menuconfig

linux交叉编译裁剪内核记录

然后按照前文的修改定制自己的内核即可。退出,保存,Make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage即可。

linux交叉编译裁剪内核记录

编译开始,静等即可。

本来是很小的问题,结果花了整整一下午,基础还是最重要的~