Linux内核配置与编译

时间:2021-04-06 16:35:32

1.内核配置

    编译内核之前要先配置。为了正确、合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,主要有以下4个方面需要考虑。

    ● 尺寸小。自己定制内核可以使代码尺寸减小,运行将会更快。
    ● 节省内存。由于内核部分代码永远占用物理内存,定制内核可以使系统拥有更多的可用物理内存。
    ● 减少漏洞。不需要的功能编译进入内核可能会增加被系统攻击者利用的机会。
    ● 动态加载模块。根据需要动态地加载模块或者卸载模块,可以节省系统内存。但是,将某种功能编译为模块方式会比编译到
       内核内的方式速度要慢一些。

    Linux内核源代码支持20多种体系结构的处理器,还有各种各样的驱动程序。因此,在编译前必须根据特定平台配置内核源代码。Linux内核有上千个配置选项,配置相当复杂。所以,Linux内核源代码组织了一个配置系统。

    Linux内核配置系统可以生成内核配置菜单,方便内核配置。配置系统主要包含Makefile、Kconfig和配置工具,可以生成配置接口。配置接口是通过工具来生成的,工具通过Makefile编译执行,选项则是通过各级目录的Kconfig文件定义的。

    Linux内核配置命令有make config、make menuconfig和make xconfig,它们分别是字符接口、ncurses光标菜单和X-window图形窗口的配置接口。字符接口配置方式需要回答每一个选项提示,逐个回答内核上千个选项几乎是行不通的;图形窗口的配置接口很好,光标菜单也方便实用。例如,执行make xconfig,主菜单接口如图1.5所示。

Linux内核配置与编译
图1.5 配置内核

    2.内核编译

    (1)下载内核源码。

    从http://www.kernel.org/pub/Linux/kernel/v2.6/Linux-2.6.14.tar.bz2下载Linux-2.6.14内核(或者更高的版本)至/source/kernel目录。解开压缩包,并进入内核源码目录,具体过程如下:

    $ tar jxvf Linux-2.6.14.tar.bz2
    $ cd Linux-2.6.14

    (2)修改内核目录树根下的Makefile,指明交叉编译器:

    $ vim Makefile

    找到ARCH和CROSS_COMPILE,修改:

    ARCH = arm 
    CROSS_COMPILE = arm-linux-gcc

    (3)设置环境变量:

    $ export PATH=$PATH:/usr/local/arm/3.3.2/bin

    (4)配置内核产生.config文件:

    $ cp arch/arm/configs/smdk2410_defconfig .config

    (5)输入内核配置命令,进行内核选项的选择,命令如下:

    $ make menuconfig

    命令执行成功以后,会看到如图1.6所示的界面。其实我们在图1.5中看到过同样功能的界面,那个图也是内核选项配置界面,只不过那个界面在X-window下才能执行。

Linux内核配置与编译
图1.6 内核选项配置界面

    在各级子菜单项中,选择相应的配置时,有3种选择,它们代表的含义分别如下。

    ● Y:将该功能编译进内核。
    ● N:不将该功能编译进内核。
    ● M:将该功能编译成可以在需要时动态插入到内核中的模块。

    如果使用的是make xconfig,使用鼠标就可以选择对应的选项。如果使用的是make menuconfig,则需要使用回车键进行选取。

    在每一个选项前都有个括号,有的是中括号,有的是尖括号,还有的是圆括号。用空格键选择时可以发现,中括号中要么是空,要么是“*”;而尖括号中可以是空、“*”和“M”。这表示前者对应的项要么不要,要么编译到内核中;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。

    在编译内核的过程中,最麻烦的事情就是配置这步工作了。初次接触Linux内核的开发者往往弄不清楚该如何选取这些选项。实际上,在配置时,大部分选项可以使用其默认值,只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其他部分关系较远且不经常使用的部分功能代码编译成为可加载模块,这有利于减小内核的长度,减少内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关系紧密而且经常使用的部分功能代码直接编译到内核中。

    (6)执行下面的命令开始编译:

    $ make zImage

    在编译过程中会出现一些错误,可以看到错误发生在/drivers/video/console中。有时是因为我们选择了“VGA text console”选项,去掉这个选项即可。这个选项在“Device Driver”→“Graphics Support”→“console display driver support”下。

    总之,这类错误是由于内核配置不当引起的,不需要修改内核源码。

    如果按照默认的配置,没有改动的话,编译后系统会在arch/arm/boot目录下生成一个zImage文件,这个文件就是刚刚生成的内核文件。我们需要把它加载到开发板中运行,加以验证。

    (7)下载Linux内核。加载到开发板的方式是通过U-Boot提供的网络功能,直接下载到开发板的内存中。首先把内核复制到tftp服务器的根目录下(见tftp配置文件说明)。在我们的实验中,这个目录在/tftpboot下,所以我们在内核源码目录中直接执行下面命令:

    $ cp arch/arm/boot/zImage /tftpboot

    启动开发板,在U-Boot界面下输入下面一组命令:

    FS2410# printenv (查看当前开发板的环境变量)
    FS2410# setenv ipaddr 192.168.1.134 (设置开发板的IP地址为192.168.1.134)
    FS2410# setenv serverip 192.168.1.23 (设置开发主机的IP地址为192.168.1.23)
    FS2410# setenv bootargs console=ttySAC0,115200 (设置终端为串口1,波特率115200)
    FS2410# saveenv (保存环境变量)
    FS2410# ping 192.168.1.23 (测试网络是否畅通)

    如果网络畅通,执行下面的命令下载内核:

    FS2410#tftp 30008000 zImage (把Linux内核下载到开发板内存的30008000地址处)
    FS2410#go 30008000 (启动内核)

    此时可以在超级终端中观察到内核的启动现象,不过内核在此时还不会成功启动,因为还需要做一些其他的移植工作。

    本文选自华清远见嵌入式培训教材《从实践中学嵌入式Linux应用程序开发》