Linux内核配置和编译详解

  版权声明本文章参考了《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 cleanmake 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/Kconfigarch/$SRCARCH/Kconfig又分别载入各目录下的Kconfig文件,以此递归下去,最后生成主配置界面以及各级配置菜单。$SRCARCH是由顶层Makefile中定义的,它等于$ARCH,而$ARCH由Makefile或make的命令行参数指定。
    • 在完成配置后,mconf会将配置保存在Linux内核源代码根目录下的.config文件中。
  • 当我们使用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内核官方文档》。未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!


猜你喜欢

转载自blog.csdn.net/liao20081228/article/details/81286695