以处理器平台为例,详细分析了嵌入式内核的配置与编译系统,并给出了生成内核映像的配置与编译方法,最后通过一个例子讲述了如何将用户开发的源代码加入到内核中,并增加相应的可供选择的配置菜单选项,可根据用户选择情况决定是否被编译进的内核映像文件啪中。关键词,配置,依赖关系,编译规则,内核映像一、引言是一种实用性很强的现代操作系统,它可以稳定地运行在86、0、等多种平台上,是目前支持硬件平台最多的操作系统。最大的特点在于它是开放源码的,任何人只要遵循,就可以对内核进行修改并发布给他人使用。 所有这些特点成为了嵌入式系统开发员首选的操作系统,开发者可以根据自己特殊的硬件系统及应用需求对“内核进行配置,并将自己开发的源代码加入到“内核,从而满足不同的嵌入式系统的应用需求。本文以开发平台为例,深入分析“内核的配置与编译系统。二、选择为了得到适合目标系统的内核,先从游戏公测:..上下载合适的内核,假设选择下载了一2.4.18版本,再从:..1..上下载相应的补丁2.4.18一5,打上补丁后就得到了所需的支持处理器的内核一2.4.18一珊5。当然如果想得到真正能够运行在自己特定的嵌入式系统板上的内核,还需要在此基础上做许多的移植工作三、配置1.配置选项配置选项是在输入配置命令后根据自己的系统需求进行选择的,选择表示要将该功能编译进内核中,选择表示要编译成内核模块,选择表示不将该功能编译进内核。具体的配置选项这里就不进行一一介绍了,根据提供的帮助信息很容易理解。 这里需要说明的是:如果某选项在配置菜单中是可选择的,这并不意味着目标系统就支持该功能,当然大部分可供选择的选项是目标系统支持的;同样,配置菜单中没有的选项并不一定就表示目标系统不支持该功能,原因可能是该功能还未在目标系统上测试过,或者是维护人员未将该功能选项加入到各级系统配置文件的.中。所有这些可访问上面给出的下载补丁网站来确定。 2.配置方法血:通过提示,依次设定每个选项为、或。蚯:也是通过提示的方式,它要求手动设定在.血中没有设定的选项,而血则不管在.曲中是否设定过都要求用户重新设定。眦瓶:显示以为基础的、终端式的配置菜单。如果.曲文件存在,则会根据该文件来设定默认值。 一般情况下我们会选择该方法进行配置。:显示以为基础的配置菜单。同样,如果.文件存在,则会根据该文件来设定默认值。不管选择哪种方法,在对内核配置选项进行选择设定后,都会在内核顶层目录下生成一个隐藏的.:曲文件,它包含了所有配置选项的用户选择信息。当下一次曲时,会生成一个新的.文件,原来的文件被更名为..。3.配置文件(1)文件该文件被顶层包含,.及子目录中的,。实用第一智慧密集..............................。............。 。 ....。 ................。..。并未包含这个文件,它是通过在顶层曲中设置并出变量来向下传递的,比如=.曲。(2)瑚血.文件该文件提供了总体的内核配置菜单选项,具体的子配置菜单选项需在其他各级子目录下的曲.中描述。当用户开发了新功能程序并需将其相关的配置选项加入到“的配置菜单中,以供用户需要此功能时进行选择,这时要在各级目录下的.文件中用配置语言来编写相应的配置脚本。具体的配置语言的语法可参考一1—.文件。(3)吐同.曲一样,该文件也是在施后产生,它是根据内核配置情况由一些预处理语句组成。几乎所有的源文件都会通过.来嵌入.文件。当配置选项发生变化时,会更新吐,如果按照通常方法,使用在每个子目录下生成依赖文件.,将造成所有源代码的重新编绎。为了优化过程,减少不必要的重新编绎,开发了专用的及卜工具。在目录下有工具及—的源代码,编译后生成相应的工具。用来取代来生成.文件,它在处理源文件时,将忽略呶岱.头文件,直接查找源文件中具有“』特征的宏定义。例如,如果有“0-”这样的行,它就会在.文件中输出(叩肌幽.),—工具以·.为输入文件,利用.中的“0』标记,生成与相对应的文件。例如,如果眦.中有-。这样的行,它就会生成.文件,其内容只有一行:0-,表示不支持设备。 心下的文件名只在.文件中出现,内核源文件是不会嵌入它们的。 这样的话,每重新配置一次内核,就会运行工具卜一次,来检查旧的子文件的内容,以确定是否需要更新它们。 这样,不管锄眦.修改日期如何,只要其配置不变,就不会重新编绎内核。四、编译这是本文讲述的重点。 “吸内核的编译系统比较复杂,主要从下面几个方面进行分析阐述。1..文件.文件中包含了各级目录下的共同遵循的编译规则,比如将文件编绎成目标文件的规则、将汇编文件生成目标文件的规则等。各级子目录下的通过语句.将其包含,用以识别各.中所定义的一些变量,比如.曲文件中有0—~32410=,则在中—0-~532410就成为—变量。 下面分析一下.中的变量所代表的意义:(1)—,—,—,一变量—表示需编译到“内核中的目标文件名集合,—表示需要编译成模块的目标文件名集合,—表示不需要编译的文件,一表示为空。(2)0—,-每个中都有一个0—或'变量,0—或吐~的生成规则在.中规定。 目标文件0二表示由—链接(1)而成,后缀为.,静态库文件是由—打包而成,后缀为.2.分析根据配置文件.旆构造出需要进入的子目录及其下需要编译的源文件列表,然后对该源文件列表分别进行编译,并把目标代码链接到一起,最终形成内核二进制文件。各级子目录下都有文件,分别控制其所在目录下的源代码编译。(1)顶层分析该幽为内核编译的总体控制文件,它的主要任务是生成内核二进制文件和内核模块。以内核文件砌的生成规则为例,分析一下顶层如何进入子目录并调用其下的各娟。在顶层中的生成规则设定如下::..|《)..0一一—』))一一—一从上面可以看出内核是由、.、-.、Ⅳ0、组成。其中—1、在顶层—中定义,例如在该中的定义如下:720—+=—.—.一(”+=.:=(—)在俐中定义,该¨是针对特定平台的,它包含了与平台相关的一些信息.:=一..从内核的产生过程所依赖的目标文件及变量可以看出,欲生成,顶层会根据.血文件中的配置,分别进入8、及等各个子目录并调用其中的,从而生成.、.、.等。如果这时我们选择了系统支持设备,那么一=Ⅳ—,就会进入目录并根据该目录下的来生成.。 所有的这些目标文件构成了和,从而构成内核中的和。其它的变量7、等的产生过程类似。通过上例总结一下之间的调用关系:在顶层中定义了变量,在编译内核或模块时,顶层根据的值来决定进入哪些子目录。.的值取决于内核的配置,在顶层中将.赋值为:=1,根据内核的配置情况,在瑚中对变量的值进行了扩充。假设现在进入了玛目录,在该目录下的出会根据其中的变量—的值来决定进入下的哪个子目录进行编译,—的定义如下:—:=。这是默认需要进入的子目录,根据需要可以对其进行扩充。比如我们在曲的配置菜单中选择了系统支持设备,在.中(0)的值就为,因此在该中可以通过一(0)+=语句对—进行扩充。 也就是还需要进入瑁子目录下进行。然后在璐曲中根据变量—来定义玛下需要编译的源文件:一(-)+=...8..也就是需要编译.、.源文件最新传奇等。 当然根据配置也可以对需要编译的源文件进行扩充,比如我们选择了系统支持文件系统,通过下面语句则还需要对拍.文件进行编译:一(—)+=.。 另外,顶层中定义并出了许多环境变量,子目录中的可以使用这些变量。前面已经提到了一些,比如、0、等。 这里需要补充一点:73当进行交叉编译时,需在顶层中修改变量0工0的值,将其改为用户自己的交叉编译器所在的目录,比如0=2.95.3—(2)子6分析子面比较简单,它负责控制该娟所在目录下的子目录及其源文件的编译。五、配置、编译内核的步骤1.叩:如果内核已经过多次编译,该命令可将内核源代码恢复到“干净”的初始状态。2.肌曲:配置内核。 在顶层中有对应的执行语句::.一|(—)|.也就是当执行该命令时,顶层会调用该目录下的脚本程序来解释.文件,执行完后产生配置文件.,它保存了配置变量。对于特定的嵌入式应用系统,并不会用到所提供的“内核的所有部分,这就需要对内核进行裁减。所谓裁减就是只将应用系统需要用到的部分功能保留,将其它不需要的功能去掉,这样会节省系统资源,并减少系统出错的机率。所有这些都需要在8所弹出的菜单选项中进行取舍,选择方法很简单,就是将光标移到每个选项上,通过空格键进行选择切换,当出现+时,表示系统需要此功能,当出现时,表示系统需要此功能并把它作为模块进行编译,当出现时技术,表示系统不需要此功能,在编译时并不会将该功能编译进内核。3.:建立依赖关系。内核源码树中大多数文件都会与一些头文件有依存关系。要建立内核,各个必须知道这些依存关系。执行该命令后会在内核源码树中每个子目录里产生一个隐藏的.文件,此文件中含有子目录下各文件所依存的头文件清单。4.8或:编译内核。不管用哪个命令,在顶层目录下都会生成文件,为未经压缩的内核映像,代表,即表示它支持虚拟内存。使用或都会在珊下产最新传奇生内核映像名为的文件,它是经过压缩的内核映像,不同之处在于:前者生成的内核为不超过512的小内核映像;后者是眦的简,。实用第一智慧密集。写,它不受大小限制,生成的内核映像可以比前者更大一些。5.如果需要编译内核模块,则用命令。上面的步骤在生成内核映像的过程中不一定全部使用,根据经验一般只需、两步即可,然后将下生成的内核映像文件烧写到嵌入式应用系统的板子上。六、实例经过上面的分析,应该对嵌入式内核的配置与编译系统有了比较深入的认识。下面通过一个简单的例子说明如何将开发者自己开发的内核代码加入到内核中,并且增加相应的可供用户选择的配置选项,一旦用户选择了这些选项就可以将相应的代码编译进最终生成的内核映像中去。这个例子中用到了配置语言及其编程,以及的编写,在例子中都做了相应的解释。这里使用的内核是杭州立宇泰电子有限公司提供的与开发板配套的基于32410的源码包(内核版本为2.4.18,其它公司提供的源码包和下面的操作过程类似).珊050929.,将其拷贝到目录下,然后解压:、唧』50929.,在当前目录下会生成解压后的源码目录,以下的操作都是在目录下进行。1.确定源代码的放置位置本例是向内核中增加一个新的驱动程序.因此应该将该驱动所包含的代码加入到.目录下,下面是其代码目录树:一一.一一一一一一,、一一.一一.二一2.2.配置文件肌曲.通过在该配置文件的最后加入一行曲瓶.,将子功能的配置菜单及其选项加入到“内核的配置菜单系统中。因为血.是总的配置菜单,所有在眦之后出现的菜单及其选项均在该文件中设置。3.配置文件曲.74静』、-”、4=”1:—-2』、—2!=””:—)22因为是内核驱动中的一项新功能,因此创建了一个相应的菜单,接着会显示.新开传奇选项选择,当选择了该选项(』=)时,会出现选项供用户选择。同理,当选择了血及12(配置菜单中已存在)选项后,会出现.选项供用户选择。关键字类型只接受、,并将其值赋给后面的变量0』,关键字可接受、,¨表示.1刚上的值依赖于02及0.2二者的值,只要二者中有一个为,则其值亦为。 4.“内容样释|样:=-』:=—:=(—)=:=.—:=2.一《州)+=.一(—2)+=2.一《州)十=).:):—:—..%.目录下最终生成的文件为.将2.放在—列表中,是因为.中使用了输出符号(可以是变量或者是函数),以供其它内核模块调用.根据用户的选择构建—、—列表.然后将该列表中的目标文件连接成—..同时根据选择确定是否进入目录进行,—.—表示需要进入该列表中的目录进行编译5.(1内容女一:样:=—:=(—):=(—):=.一-只—)+=..:—女.%叫理,在(1“(1卜.生成文件.。6.群.样一《—)+=;.存陔中加入一(0)+=语句,这样在内核编译时才能够进入录进行编译。 7.顶层一(—)+=—.一(州—)十=;.:=《—)在该目录下加入上面所示两条语句。如果用户在配置菜单中选择了选项与(选该选项的前提是以和12选项都被选择上),那么0和』』的值都为,.和胁.就都位于—列表中,然后又被包括在列表中(通过语句:=(Ⅳ—))。前面已经讲过,)内核映像文件中包括,所以.和.最终就可以被链接到“中。七、结语本文深入分析了嵌入式内核的配置与编译系统,基于此分析,开发者可以根据自己的硬件对“内核进行不同的配置,也可以根据需要将自己开发的源代码加入网民推荐这网游到内核中,并增加相应的可供选择的配置选项,使其成为内核的一部分。 通过了解内核的配置与编译系统,还有助于分析内核编译时的出错信息,从而做出相应的处理。。
|