Linux内核配置和编译
Linux源代码
基于CBT平台的内核源代码压缩包:Linux-2.6.35.7.tar.bz2
将linux-2.6.35.7.tar.bz2复制到/JY-CBT/目录。在终端窗口进入到/JY-CBT/目录下输入解压命令,完成内核源码文件的解压过程。在/JY-CBT/目录下建立Linux-2.6.35.7文件夹,内含内核源码文件。
将/JY-CBT/Linux-2.6.35.7/目录称为内核源码根目录。
[root@/jy-cbt]# tar -jxvf Linux-2.6.35.7.tar.bz2
[root@/jy-cbt]# ls
Linux-2.6.34.14 Linux-2.6.35.7 yaffs2
序 号 |
目 录 名 |
描 述 |
1 |
arch |
与体系结构相关的代码全部放在这里,我们使用的是其中的 arm 目录。 |
2 |
Documentation |
这里存放着内核的所有开发文档,其中的文件会随版本的演变发生变化。通过阅读这里的文件可获得内核最新的开发资料。 |
3 |
Drivers |
包括所有驱动程序,下面又含多个子目录,分别存放各个分类驱动程序源代码。 |
4 |
Drivers/char |
包含大量与驱动程序有关代码。如:通用 tty 层,console.c 定义了 Linux 终端类型,vt.c中定义了虚拟控制台等等。第6章中所用到的一些驱动程序源码也放在该目录下。 |
5 |
Driver/block |
其中存放所有的块设备驱动程序,也保存了一些设备无关的代码。 |
6 |
Drives/ide |
专门存放针对IDE设备的驱动。 |
7 |
Drivers/scsi |
存放 SCSI 设备的驱动程序,当前的 cd 刻录机、扫描仪、U 盘等设备都依赖这个 SCSI 的通用设备。 |
8 |
Drivers/net |
存放网络接口适配器的驱动程序,还包括一些线路规程的实现,但不实现实际的通信协议,这部分在顶层目录的 net 目录中实现。 |
9 |
Drivers/video |
保存了所有帧缓冲区视频设备的驱动程序,整个目录实现了一个单独的字符设备驱动。 |
10 |
Drivers/video |
针对无线电和视频输入设备的代码,如目前流行的 usb 摄像头。 |
11 |
ipc |
system V 的进程间通信的原语实现,包括信号量、共享内存。 |
12 |
kernel |
存放了除网络、文件系统、内存管理之外的所有其他基础设施,包括进程调度 sched.c,进程建立 fork.c,定时器的管理 timer.c,中断处理,信号处理等。 |
13 |
lib |
包括一些通用支持函数,类似于标准 C 的库函数。如:vsprintf 等函数。 |
14 |
mm |
内存管理代码,包括所有与内存管理相关的数据结构的实现代码。 |
15 |
net |
包含了套接字抽象和网络协议的实现,每一种协议都建立了一个对应目录。 |
16 |
fs |
所支持的的文件系统源文件,随后将使用yaffs2文件系统 |
17 |
script |
存放脚本文件,主要用于配置内核。 |
内核配置
Linux 内核的裁剪过程即配置内核参数的过程,通过对配置内容菜单的选择完成。内核存放于宿主机Linux环境的/JY-CBT/Linux-2.6.35.7/目录。
在该目录下运行以下三个命令中的任一个,可生成相应配置文件(.config)。
(1)make config //以命令行,逐行完成配置过程。
(2)make menuconfig //通过menuconfig菜单,完成配置过程。
(3)make xconfig //2.6.X 以上,基于内核用QT 图形库。
方便起见,先使用附带的配置文件CBT210-20121115_deconfig_3g_zc301.config
make menuconfig 命令默认打开当前目录下的.config配置文件,所以在终端窗口中执行cp命令,将已配置好的文件复制到.config文件。
[root@/jy-cbt/Linux-2.6.35.7]# cp
cbt210_20121115_deconfig_3g_zc301 ./.config
cp: overwrite `./.config'? y
[root@/jy-cbt/Linux-2.6.35.7]# make menuconfig
在Kernel的配置选项过程中,具有‘[*]’前缀的选项,其对应功能代码将被编译进内核,最终内核将支持该功能,由于该代码的加入,内核代码尺寸将变大。
将无用的选项去掉的过程,也称为内核的裁剪过程。
在Kernel的配置选项过程中,针对内核功能代码的添加和裁剪过程被称为内核的定制过程。
主要包括两部分:
--板级设备的管理和使用。
--应用系统应具有的功能,以及为应用程序提供的运行环境。
1.内核配置选项主菜单
2.General setup(通用配置选项)
3.Enable loadable module support(允许加载模块支持选项)
4.Enable the block layer(允许大块设备和文件)
5.System Type(系统类型)
6.FIQ Mode Serial Debugger(基于FIQ模式串口调试 默认不选)
7.Bus support(总线定制,默认不选)
8.Kernel Features(内核特性)
9. Boot options --->(内核引导操作)
10.CPU Power Management --->(CPU电源管理)
11.Floating point emulation --->(浮点操作模拟)
12.Userspace binary formats --->(支持文件类型:ELF,MISC)
13.Power management options --->(电源管理操作)
14.Networking support --->(网络支持)
15.Device Drivers(设备驱动)
16.File systems --->(文件系统)
17.Kernel hacking --->(内核黑客设置选项)
18.Security options --->(安全选项)
19.Cryptographic API --->(密码编译机制)
20.Library routines --->(库例程)
Kconfig 和Makefile 文件
Kconfig文件分布在2.6 内核源码根目录下的多个子目录中。通过Kconfig文件可以将内核配置菜单中的选项和其对应的源文件相互关联。
使用make menuconfig 会打开依赖于Kconfig文件的内核配置菜单,随后完成内核参数选项配置过程,结束时将配置参数保存到.config(隐藏文件,存放于内核源码根目录下)中。
在内核编译时,内核源码根目录下的主Makefile调用这个.config,了解内核的配置情况,通过Kconfig访问到配置选项对应的源文件存放目录,依照当前目录下Makefile文件定义规则将源文件编译链接到内核,使内核能够支持该功能选项。
例子:
内核编译(uImage)
1.生成内核镜像文件zImage
Linux在 2.6 之后的内核中只需使用 make命令,即可完成内核的编译,最终在内核源码根目录的/arch/arm/boot 目录下生成内核的镜像文件zImage。
[root@localhost Linux-2.6.35.7]# make
[root@localhost Linux-2.6.35.7]# ls arch/arm/boot/zImage
arch/arm/boot/zImage
[root@localhost Linux-2.6.35.7]#
2.生成 uImage 格式的内核镜像
在第4章中介绍到了ARM平台bootloader使用的是 U-Boot,U-Boot默认引导内核文件格式为 uImage。因此内核编译过程结束且生成zImage格式的内核文件后,还需使用U-Boot提供的工具mkimage将zImage内核文件转化为uImage格式。
(1)mkimage命令格式。工具软件mkimage的使用方法和配置参数的注释可参见第4章的4.4.4一节。使用如下命令完成格式转化,在内核源码根目录下生成uImage格式的内核镜像uImage内核文件。
[root@localhost Linux-2.6.35.7]# ./mkimage -A arm -T kernel -C none -O linux -a 0x21000000 -e 0x21000040 -d arch/arm/boot/zImage -n 'Linux-2.6.35.7 ' uImage
Image Name:
Linux-2.6.35.7
Created:
Wed Jul 11 20:42:41 2012
Image Type:
ARM Linux Kernel Image (uncompressed)
Data Size:
4313468 Bytes = 4212.37 kB = 4.11 MB
Load Address: 21000000
Entry Point:
21000040
[root@localhost Linux-2.6.35.7]#
-A:指定嵌入式操作系统运行的CPU架构arm微处理器。
-T:指定被压缩文件zImage为操作系统内核文件(kernel)。
-C:指定不对zImage压缩。
-O:指定操作系统类型为linux。
-a:指定压缩后的uImage在SDRAM中的加载地址为0x21000000。
-e:指定内核运行地址为0x21000040。这个地址就是-a参数指定的值加上0x40。(这之间的0x40个字节是mkimage添加的文件头信息,信息格式参见相关文件资料了)。
-d:指定制作映象的源文件为arch/arm/boot/zImage。
-n:指定运行mkimage后生成的映象文件名 为uImage。