[摘至嵌入式LINUX开发(英文版)]
linux内核编译系统
1. .config文件
.config文件是编译一个linux镜像文件的蓝图脚本,负责保存对于特定系统的内容配置。.config文件放在了linux文件树下的顶层文件中。需要注意备份自己的.config文件,使用像make mrproper命令会将内核恢复到未配置状态,导致.config文件被删除。
在.config文件中会包含诸如以下的内容
#
CONFIG_USB=m
# CONFIG_USB_DEBUG is not set
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_BANDWIDTH is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
我们知道linux内核是一个单一结构的内核,即整个内核是被静态编译和链接成为一个可执行整体的。但是,我们依然可以编译和动态的链接一些源文件,使之成为运行中的linux的一种可装载模块。可装载模块通常用来实现各类的驱动程序。在linux启动之后,会启动一个专门的应用程序用于装卸这些可装载的模块。
所以,观察上面的.config文件的部分内容,(=m)这样的内容标识了该部分将被编译成为动态的可装载的模块。(=y)则表示了该部分会被编译和链接到内核里面。我们可以使用相应的config命令来实现对内核的配置,例如config直接在命令行配置,menuconfig用菜单方式配置,xconfig图形界面配置等等。对内核配置完成之后,可以选择保存配置的内容,保存的内容会立即更新到.config文件当中,如果没有.config文件,将被立即创建。.config参数文件将直接被包含到makefile文件当中。
2. makefile目标文件
由于存在makefile,使得我们编译这样大型的系统的时候可以变得轻松而容易,makefile包含的目标有很多,可以使用命令make help查询。一般在编译嵌入式linux内核的时候会考虑使用make zImage 或者make uImage以适应uboot。zImage是一个压缩内核,可以适应嵌入式系统对内核体积大小的要求。
3. Kernel配置
Kconfig文件基本上蕴含在了300多个内核子目录下面,使用Kconfig文件可以增删内核功能,并不是直接的增删相应模块,而只是使相应的模块的配置选项出现在内核配置菜单当中。之前的配置组件例如gconf会读取Kconfig的内容,然后整合显示在菜单里面。
例如一段增加linux对cs8900网卡驱动的实例如下:
Config ARM_CS8900
tristate "CS8900 support"
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
---help---
Support for CS8900A chipset based Ethernet cards. If you have a network (Ethernet) card of this type, say Y and read the
Ethernet-HOWTO, available from as well as .
To compile this driver as a module, choose M here and read
The module will becalled cs8900.o.
2.修改driver/net/arm目录下的Makefile文件,在最后添加:
obj-$(CONFIG_ARM_CS8900)+=cs8900.o
在更改完Kconfig文件之后,还需要在相应的Makefile文件中实现对Kconfig文件中的配置的支持。事实上config内核主要做的工作即是完成众多的宏编译开关的打开和关闭,而剩下的编译则需要考量这些编译开关的状态来实现不同的编译动作。