Linux内核配置机制与编译过程分析
1. 内核配置系统的基本结构
内核配置系统由以下三个部分组成:
(1)Makefile:分布在内核源代码根目录及各层目录中,定义了内核编译的规则;
(2)配置文件:一般在/kernel/arch/$ARCH/configs中,/kernel/arch目录下的每个架构都有对应的默认配置文件;
(3)配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解析)、配置用户界面(字符界面、Ncurses图形界面、Xwindows图形界面,各自对应make config、make menuconfig、make xconfig)
2. 内核配置与编译的步骤
(1)make distclean :清除临时文件、中间文件和配置文件;
(2)make xxx_config(默认配置文件):得到内核的当前配置文件.config;
(3)make menuconfig(或config、xconfig):进入配置用户界面,进行内核的详细配置;
(4)make all:编译内核。
注意:使用make命令时,先确认Makefile文件中的编译工具链是否定义正确。
CROSS_COMPILE?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
make xxx_config,即make x210ii_qt_defconfig,其作用是将/kernel/arch/$ARCH/configs目录下的默认配置文件x210ii_qt_defconfig拷贝至内核根目录下,并重新命名为.config,即.config文件为内核的当前配置文件。
2.1 make xxx_config(配置文件名)解析
不同架构下的配置文件不同,有$ARCH变量指定架构,从而读取相应的配置文件。$ARCH在Makefile中指定。
ARCH?= arm
make menuconfig,生成一个内核配置的界面。menuconfig涉及到一下几个文件:
2.2 make menuconfig(或config、xconfig)解析
(1)内核源码根目录下的scripts文件夹
menuconfig文字式图形界面是由ncurses库、/kernel/scripts目录下面的脚本文件支持生成的。
(2)/arch/$ARCH/Kconfig,各层目录下的Kconfig文件
menuconfig图形界面中的所有表项都来自Kconfig文件。
(3)内核源码根目录下的.config文件、/kernel/include/generated/autoconfig.h文件
menuconfig图形界面中所有表项的设置值都从.config文件中读取。menuconfig界面中的修改部分会同步至.config文件中;同时还会将所有的配置选项以宏的形式保存在/kernel/include/generated/autoconfig.h中,内核源码会根据其中的宏进行条件编译。
................................................................................................. #define CONFIG_SND_S5PV2XX_SOC_WM8976 1 #define CONFIG_IP_NF_TARGET_REDIRECT 1 #define CONFIG_CRC32 1 #define CONFIG_I2C_BOARDINFO 1 #define CONFIG_NF_NAT_PROTO_SCTP 1 #define CONFIG_HAVE_AOUT 1
根据配置过程中生成的/kernel/include/generated/autoconfig.h文件,内核源码会根据其中的宏进行条件编译。(4)内核根目录下、各层子目录下的Makefile文件
.................................................................................................... obj-$(CONFIG_IDE)+= ide/ obj-$(CONFIG_SCSI)+= scsi/ obj-$(CONFIG_ATA)+= ata/ obj-$(CONFIG_MTD)+= mtd/ obj-$(CONFIG_SPI)+= spi/ obj-y+= net/ obj-$(CONFIG_ATM)+= atm/ obj-$(CONFIG_FUSION)+= message/ obj-$(CONFIG_FIREWIRE)+= firewire/ .....................................................................................................
menuconfig图形界面用来配置内核选项。
3. menuconfig图形界面的使用方法
(1)上下方向键,浏览菜单目录;
(2)enter键,执行选中项;
(3)esc键,返回至上一页面;
(4)/键,搜索表项;
(5)?键,显示帮助信息;
(5)Y、N、M代表表项的三种配置情况。
Y:将选中的表项编入内核;
N:将选中的表项从内核去除;
M:将选中的表项模块化,即将这个表项编译为一个单独的内核模块.ko文件,不链接入内核,Linux启动会可动态加载或卸载该模块。
[ ]表项不能实现模块化,< >表项可以实现模块化。表项前的括号里,*表示编入,空白表示去除,M表示模块化。