日期:2014-05-16  浏览次数:20734 次

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的内核结构有一个系统的了解。