版权声明:本文章参考了《Linux内核官方文档》。未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!
1 内核配置及编译
1.1 配置内核
$make mrproper
——该命令确保目录下没有相关的文件和配置,如果已经编译过linux内核,建议使用该命令
每个选项要么是二选一yes或no,要么是三选一yes、no、module。yes表示把代码编译进内核映像,module表示以模块方式编译。
$ make ARCH=xxx config
——逐一遍历每个选项$ make ARCH=xxx menuconfig
——使用ncurse图形界面$ make ARCH=xxx gconfig
——使用图形界面工具,要求装有GTK+$ make ARCH=xxx xconfig
——要求装有Qt$ make ARCH=xxx defconfig
——直接使用默认配置
内核配置好后,配置项存放在源代码内核源码根目录的.config
文件中,可以直接修改该文件,修改后应该更新用$ make oldconfig
更新配置。
选项CONFIG_IKCONFIG_PROC
把压缩过的内核配置文件放在/proc/config.gz
中,如果当前内核启用了该选项,则可以直接克隆该配置。
如果不想在命令行输入ARCH=XXX,则可以直接在顶层Makefile中进行修改。
1.2 编译内核
make clean
或make distclean
,清楚之前编译产生的文件。make clean
仅仅是清除之前编译的可执行文件及配置文件。make distclean
要清除所有生成的文件。
$make ARCH=xxx zImage或bzImage xxxxxx
,编译内核,xxxxxx为make编译选项与参数,2.6版本之前每次编译需要运行$make dep
。$make ARCH=xxx modules xxxxxx
,编译模块,xxxxxx为编译选项。如果想减少编译时的垃圾信息可以使用
$make XXXX > 文件名
: 把编译细节、警告、错误输出到指定文件。$make XXXX > /dev/null
:不记录任何编译信息
如果不想在命令行输入ARCH=XXX和CROSS_COMPILE=XXX,则可以直接在顶层Makefile中进行修改。
1.3 安装内核
#make modules_install
,安装模块make install
,安装内核
2 内核配置过程详解
Linux内核的配置系统由三个部分组成,分别是:
Makefile
——分布在 Linux 内核源代码根目录及各层目录中,定义 Linux 内核的编译规则;Kconfig
——分布在 Linux 内核源代码根目录及各层目录中,给用户提供配置选择的功能;scripts
——分布在 Linux内核源代码根目录下,包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig)。
当我们使用
make menuconfig
这个命令时(其它配置命令类似):- 首先由make编译生成
scripts/kconfig/mconf.c
生成scripts/kconfig/mconf
。(xconfig对应qconf,gconfig对应gconf,config对应conf) - 然后执行
scripts/kconfig/mconf Konfig
- mconf程序读取内核根目录下的Kconfig文件,Kconfig载入了
arch/$SRCARCH/Kconfig
,arch/$SRCARCH/Kconfig
又分别载入各目录下的Kconfig文件,以此递归下去,最后生成主配置界面以及各级配置菜单。$SRCARCH
是由顶层Makefile中定义的,它等于$ARCH
,而$ARCH
由Makefile或make的命令行参数指定。 - 在完成配置后,mconf会将配置保存在Linux内核源代码根目录下的
.config
文件中。
- 首先由make编译生成
当我们使用
make defconfig
这个命令时:- 系统直接将
arch/$SRCARCH/configs
(该目录存放内核的默认配置文件)下的对应的默认配置文件拷贝到Linux内核源代码根目录下的.config
文件。
- 系统直接将
3 内核编译过程详解
- 在输入编译命令后,make首先调用脚本来读取
.config
文件,并根据内容载入对应文件到include/config/
,并将一些配置项写入include/config/auto.conf
。 - 脚本程序将
include/config/auto.conf
中的配置项CONFIG_XXXX=y|m|xxx
翻译为宏定义#define CONFIG_XXXX[_MODULE] 1|xxx
,并写入include/generate/autoconf.h
中。 - autoconf.h作用就是将.config翻译为C语言当中能识别的头文件,以便在以后使用的时候作为宏定义出现,以实现条件编译。
- make根据Makefile执行编译。
4 在内核中添加程序
- 将源代码拷贝到内核源码的相应目录
- 修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;
- 修改对应目录下的Makefile文件完成编译选项的添加
obj-$(CONFIG_symbol)+= filename.o
;
版权声明:本文章参考了《Linux内核官方文档》。未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!