嵌入式技术
编译嵌入式Linux内核都是通过make的不同命令来实现的,它的执行配置文件是Makefile。Linux内核中不同的目录结构里都有相应的Makefile,而不同的Makefile又通过彼此之间的依赖关系构成统一的整体,共同完成建立依存关系、建立内核等功能。
内核的编译根据不同的情况会有不同的步骤,但其中主要分别为3个步骤:内核配置、建立依存关系、建立内核,其他的为一些辅助功能,如清除文件等。如果在实际编译时若出现错误,可以考虑采用其他辅助功能。下面首先分别讲述这3步为主要的步骤。
1.内核配置
第一步内核配置中的选项主要是用户用来为目标板选择处理器架构的选项,不同的处理器架构会有不同的处理器选项,比如ARM就有其专用的选项如“Multimedia capabilities port drivers”等。因此,在此之前,必须确保在根目录中Makefile里“ARCH”的值已设定了目标板的类型,如:
ARCH:= arm
接下来就可以进行内核配置了,内核支持4种不同的配置方法,这几种方法只是与用户交互的界面不同,其实现的功能是一样的。每种方法都会通过读入了一个默认的配置文件,即根目录下“.config”隐藏文件(用户也可以手动修改该文件,但不推荐使用)来实现。
当然,用户也可以自己加载其他配置文件,也可以将当前的配置保存为其他名字的配置文件。这4种方式如下所示:
·make config:基于文本的为传统的配置界面,不推荐使用。
·make menuconfig:基于文本选单的配置界面,字符终端下推荐使用。
·make xconfig:基于图形窗口模式的配置界面,Xwindow下推荐使用。
·make oldconfig:自动读入“.config”配置文件,并且只要求用户设定前次没有设定过的选项。
在这4种模式中,make menuconfig使用为广泛,下面就以make menuconfig为例进行讲解,如图1.1所示。
图1.1 make menuconfig配置界面
从该图中可以看出,Linux内核允许用户对其各类功能逐项配置,一共有18类配置选项,这里就不对这18类配置选项进行一一讲解了,需要的读者可以参见相关选项的help。在menuconfig的配置界面中是纯键盘的操作,用户可使用上下键和“Tab”键移动光标以进入相关子项,如图1.2所示进入了“System Type”子项,该子项是一个重要的选项,主要用来选择处理器的类型。
可以看到,每个选项前都有个括号,按空格键或“Y”键表示包含该选项,按“N”表示不包含该选项。
另外,读者可以注意到,这里的括号有3种:中括号、尖括号和圆括号。读者用空格键选择相应的选项时可以发现:中括号里要么是空,要么是“*”;尖括号里可以是空、“*”和“M”,分别表示包含选项、不包含选项和编译成模块;圆括号的内容是要求用户在所提供的几个选项中选择一项。
此外,要注意2.6和2.4内核在串口命名上的一个重要区别,在2.4内核中“COM1”对应的是“ttyS0”,而在2.6内核中“COM1”对应“ttySAC0”,因此在启动参数的子项要格外注意,如图1.3所示,否则串口打印不出信息。
图1.2 System Type子项
图1.3 启动参数配置子项
一般情况下,使用厂商提供的默认配置文件都能正常运行,所以用户初次使用时可以不用对其进行额外的配置,以后使用需要其他功能时再另行添加,这样可以大大减少出错的几率,有利于错误定位。在完成配置之后,就可以保存退出,如图1.4所示。
图1.4 保存退出
2.建立依赖关系
由于内核源码树中的大多数文件都与一些头文件有依赖关系,因此要顺利建立内核,内核源码树中的每个Makefile就必须知道这些依赖关系。建立依赖关系往往发生在第一次编译内核的时候,它会在内核源码树中每个子目录产生一个“.depend”文件,运行“make dep”即可。
3.建立内核
建立内核可以使用“make zImage”或“make bzImage”,这里建立的为压缩的内核映像。通常在Linux中,内核映像分为压缩的内核映像和未压缩的内核映像。其中,压缩的内核映像通常名为zImage,位于“arch/$(ARCH)/boot”目录中。而未压缩的内核映像通常名为vmlinux,位于源码树的根目录中。
到这一步就完成了内核源代码的编译,之后,读者可以使用上一小节所讲述的方法,把内核压缩文件下载到开发板上运行。
小知识:在嵌入式Linux的源码树中通常有以下几个配置文件,“.config”、“autoconf.h”、“config.h”。其中“.config”文件是make menuconfig默认的配置文件,位于源码树的根目录中;“autoconf.h”和“config.h”是以宏的形式表示了内核的配置,当用户使用make menuconfig做了一定的更改之后,系统自动会在“autoconf.h”和“config.h”中做出相应的更改,它们位于源码树的“/include/linux/”下。
全部0条评论
快来发表一下你的评论吧 !