最近买了周立功老师的imx287A的开发板开始学习linux,什么都不懂学习的过程好难啊,每天看点,先不管对错把自己的理解记下来,有错的以后再回来改。
编译过程,首先./config-kernel,config-kernel是致远提供的一个脚本,脚本中指定了SOC架构为ARM、编译器为arm-fsl-linux-gnueabi-gcc这个是致远电子提供的编译器,然后根据你输入的数字执行不同处理器的默认配置,比如我的287A会执行make ARCH=arm CROSS_COMPILE=linux-gnueabi-gcc EasyArm-imx287A_defconfig 这条指令对内核进行配置,将配置结果保存在.config隐藏文件中,。然后就可以执行make uImage执行编译,编译器执行主目录下的Makefile根据.config文件决定哪些设备文件编译进内核,哪些设备文件编译成模块,哪些设备文件不执行编译,最后在arch/arm/boot目录下生成uImage镜像文件。
按照手册把镜像文件、boot、文件系统通过TF卡烧写到板子上就可以启动了。在板子上/dev目录下可以看到开启了一个调试串口ttyAM0、三个应用串口ttySP0、ttySP1、ttySP2.我想把这个三个串口都关掉怎么做呢?
执行make menuconfig,在Device Drivers/Character devices/Serial/ drivers/ 页下,如果把i.MXS Application serialport support 这行打开----选择这样然后按键盘上的Y键表示编译进内核,就会展开下边的子菜单。展开后发现在这个菜单下只有i.MXS AUART4 spport 这一个选项,没有auart0的选项。怎么办?
根据前边的目录,在源码drivers/serial目录下有个Kconfig,一层层的Kconfig文件构成了make menuconfig的界面内容,如果想要在当前目录下包含其他的内容,可以用source 引入其他目录下的Kconfig文件。比如drivers/serial下的Kconfig生产了配置287调试串口和应用串口的一个界面,这个界面的上一级界面标题是“Character devices”,那肯定是有一个命名标题为“Character devices”的Kconfig文件使用sourcr引用了串口的配置界面,从标题看出来应该是drivers/char/目录下的Kconfig,打开这个看这个文件的是不是有 menu
“Character devices”这一行,是不是通过source "drivers/serial/Kconfig"对串口配置界面进行了引用。“Character devices”界面的上一级界面是 “Device Drivers”猜测应该是drivers目录下的Kconfig对“Character devices”界面进行了引用,可以去验证,确实是存在的。
回到前边的问题,在make menuconfig串口配置界面中没有i.MXS AURT0 support i.MXS AURT1 support i.MXS AURT2 support的配置向怎么办?在源码drivers/serial/Kconfig 文件中仿照存在的串口4配置一下保存下就可以了。
配置怎么生效后模块是怎么编译进入内核或者模块的?下边的叙述可能有不合适的地方;还记得开头执行的shell文件cong-kernel吗?这个shell文件中会调用EasyARM-iMX287A_deconfig文件,这个文件中包含的是对整个源码系统的默认配置,执行make EasyARM-iMX287A_deconfig 指令会将默认的配置写入的顶级目录下的.config文件,执行make menuconfig命令,用一级一级的Kconfig文件根据.config的内容对可视化界面中的选项进行配置。对比一下发现,可视化菜单中的选项和顶级目录下.config的内容基本上是一对一对应下来的。假如.config中有串口0默认配置为CONFIG_MXS_AUART0_DEVICE_ENABLE=y,但是可视化配置界面中没有对串口0的选项,这个对.config或可视化界面的生成有太大影响吗?没有太大影响,只是不能进行可视化配置了而已,想要可视化配置参照上边加入可视化配置的选项。在可视化菜单中对配置的更改会反应到顶级目录下的.config文件中,文件的内容也修改。.config隐藏文件内容中的配置都是全局变量,源码下的任何一个文件都是可以引用的。我发现配置界面中,有多个菜单对串口0进行了配置定义,但是只要其中一处的状态更改了比如有Y改为了N,都会对.confg产生改变,而且在.config中的位置都是菜单最前边的。
make uImage命令会对顶级目录下Makefile文件进行编译,Makefile文件会根据.config中的配置选择编译进入内核、编译成模块还是不编译。同样Makefile的隐形规则,会遍历目录下所有的Makefile文件进行编译、链接,生成最后的内核镜像文件。
内核的启动,uboot对内核的加载进行引导,内核加载到正确位置从指定位置读出一些环境变量的配置,然后调用main.c开始启动内核,main.c中的start_kernel()函数开始进行一些列的操作。根据内核中的芯片架构、芯片类型等等初始化模块、总线等等,开启init进程。