Linux内核剪裁实验
实验目的:
1. 配置、编译Linux内核;
2. 了解Linux内核结构。
实验原理:
- Linux内核的配置系统由三个部分组成,分别是:
l Makefile:分布在 Linux 内核源代码中的 Makefile,定义 Linux 内核的编译规则;
l 配置文件(config.in):给用户提供配置选择的功能;
l 配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于 Ncurses 图形界面以及基于 Xwindows 图形界面的用户配置界面,各自对应于 Make config、Make menuconfig 和 make xconfig&make gconfig)。
- 本实验采用的内核版本是 2.6.22 ,配置工具采用2.6版本提供的makegconfig。内核源程序的文件按树形结构进行组织的,这样的结构有利于我们了解Linux内核结构。
实验内容:
- 配置、编译Linux内核
l 内核配置主要是对内核的功能模块进行选择及参数设定,首先进入内核源码根目录,使用“make gconfig”命令,屏幕上显示如下界面,
make gconfig 是the GTK+ graphical kernel configuration tool for Linux,它提供了完全的鼠标操作,图形化、列表式的显示方便了内核配置过程。
l 在上面界面中我们可以看到,内核配置主要包括五大项,分别是:
General setup, Loadable module support, Processor type and features, Power management options, Bus options, Networking, Devices drivers, File systems等等。
l Processor type and features包括Subarchitecture Type和Processor family等选项,如下,
l Loadable module support下可以设置模块编译选项,如下,
l Ramdisk设置如下,
l kernel .config support
l 上面是串口设置界面;
l 配置完成后,保存配置。退出gconfig后,执行cp .config /arch/arm/config/pxagconfig命令,再执行命令:make pxagconfig,make;生成内核映像文件zImage,对于ARM系列的CPU,此文件位于arch/arm/boot目录下。
l 内核模块在用gcc编译时,需要使用特定的参数和宏定义,在旧的内核版本中,需要在Makefile中手动设置这些设定,而在2.6版中引入了kbuild,将外部内核模块的编译与内核源码树的编译统一起来了。查看kbuild文件可以看到:
Kbuild for top-level directory of the kernel
This file takes care of the following:
1) Generate asm-offsets.h
2) Check for missing system calls
- 了解Linux内核结构
Linux内核源码主目录下主要包括以下目录:
arch
arch子目录包括所有与体系结构相关的内核代码。它的每一个子目录都代表一个支持的体系结构。例如:arm下面就是arm体系架构的处理器目录,包含我们使用的PXA处理器。
include
include子目录包括编译内核所需要的大部分头文件。与ARM相关的头文件在include/asm-arm子目录下。
init
这个目录包含内核的初始化代码,但不是系统的引导代码,包含main.c和Version.c文件。这是研究Linux内核的起点。
mm
这里包含所有独立于CPU体系结构的内存管理代码,如页式存储管理内存的分配和释放等。而与体系结构相关的代码在arch/arm/mm中。
Kernel
这里包括主要的内核代码,此目录写的文件实现大多数Linux系统的内核函数,其中最重要的文件是sched.c。与Xscale体系结构相关的代码在arch/arm-pxa/kernel。
Drives
此目录用于放置系统所有的设备驱动程序,每种驱动程序个占一个子目录。
/block:
块设备驱动程序。块设备包括IDE和scsi设备。其初始化过程参加drivers/block/genhd.c中的device_setup()函数,该函数不仅初始化硬盘还初始化了网络。
/char:字符设备驱动程序。如串口、鼠标等。
/cdrom:包含Linux所有的CD-ROM代码。
/pci:PCI卡驱动程序代码,包含PCI子系统映射和初始化代码等。
scsi:包含所有的SCSI代码已经Linux所支持的所有的SCSI设备驱动程序代码。
net:网络设备驱动程序。
sound:声卡设备驱动程序。
lib目录放置内核的库代码;
net目录包含内核与网络的相关的代码;
ipc目录包含内核进程通信的代码;
fs目录是所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统,如JFFS2;
scripts目录包含用于配置内核的脚本文件等。
每个目录下一般都有depend文件和一个makefile文件,它们是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件之间的相互依托关系很有帮助。有的目录下有readme文件,它是对相应的目录下的文件的一些说明,同样有利于内核的理解。
security 目录是2.6版本新增加的,它包含系统安全配置文件。
注意到2.6版去掉了rules.make文件,在2.4版的该文件中我们可以看到这样的语句:This file contains rules which are shared between multiple Makefiles。可以看出,2.6版的Makefiles文件组织较2.4版发生了变化。
实验结论:
Linux内核的剪裁应该根据具体需求配置,不同的需求会有不同的配置,这就要求对Linux的内核结构有一个系统的了解。