实验四 内核编译实验

  • 格式:doc
  • 大小:1.92 MB
  • 文档页数:16

Linux 内核编译实验

【实验目的】

1、了解Linux 内核源代码的目录结构及各目录的相关内容

2、了解Linux 内核各配置选项内容和作用

3、掌握Linux 内核配置文件config.in 的作用

4、掌握Linux 内核的编译过程

5、掌握将新增内核代码加入到Linux 内核结构中的方法

【实验原理】

1、内核源代码目录介绍

Linux 内核源代码可以从网上下载(/pub/linux/v2.4)。一般主机平

台的Linux (如红旗Linux)源代码在根目录下的/usr/src/linux 目录下。内核源代码的文件按树

形结构进行组织的,在源代码树最上层的可以看到如下的一些目录:

(1)、arch:arch 子目录包括所有与体系结构相关的内核代码。arch 的每一个子目录都代表

一个Linux 所支持的体系结构。例如:arm 目录下就是arm 体系架构的处理器目录,包含我

们使用的PXA 处理器。

(2)、include:include 子目录包括编译内核所需要的头文件。与ARM 相关的头文件在

include/asm-arm 子目录下。

(3)、init:这个目录包含内核的初始化代码,但不是系统的引导代码,其中所包含main.c

和Version.c 文件是研究Linux 内核的起点。

(4)、mm:该目录包含所有独立于CPU 体系结构的内存管理代码,如页式存储管理内存

的分配和释放等。与ARM 体系结构相关的代码在arch/arm/mm 中。

(5)、Kernel:这里包括主要的内核代码,此目录下的文件实现大多数Linux 的内核函数,

其中最重要的文件是sched.c。与Xscale 体系结构相关的代码在arch/arm-pxa/kernel 目录中。

(6)、Drives:此目录存放系统所有的设备驱动程序,每种驱动程序各占一个子目录。

(a)、/block:块设备驱动程序。块设备包括IDE 和scsi 设备。

(b)、/char:字符设备驱动程序。如串口、鼠标等。

(c)、/cdrom:包含Linux 所有的CD-ROM 代码。

(d)、/pci:PCI 卡驱动程序代码,包含PCI 子系统映射和初始化代码等。

(e)、/scsi:包含所有的SCSI 代码以及Linux 所支持的所有的SCSI 设备驱动程序代码。

(f)、/net:网络设备驱动程序。

(g)、/sound:声卡设备驱动程序。

(7)、lib 目录放置内核的库代码;

(8)、net 目录包含内核与网络的相关的代码;

(9)、ipc 目录包含内核进程通信的代码;

(10)、fs 目录是所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持

一个文件系统,如JFFS2;

(11)、scripts 目录包含用于配置内核的脚本文件等。每个目录下一般都有depend 文件和一

个makefile 文件,他们是编译时使用的辅助文件,仔细阅读这两个文件对弄清各个文件之间

的相互依托关系很有帮助。

2、内核的配置的基本结构

Linux 内核的配置系统由四个部分组成

(1)、Makefile:分布在Linux 内核源码中的Makefile,定义Linux 内核的编译规则;顶层

Makefile 是整个内核配置、编译的总体控制文件;

(2)、配置文件(config.in):给用户提供配置选择的功能;.config:内核配置文件,包括由

用户选择的配置选项,用来存放内核配置后的结果;

(3)、配置工具:包括对配置脚本中使用的配置命令进行解释的配置命令解释器和配置用户

界面(基于字符界面:make config;基于Ncurses 图形界面:make menuconfig;基于xWindows

图形界面:make xconfig)

(4)、Rules.make:规则文件,被所有的Makefile 使用。

2.1 编译规则Makefile

利用make menuconfig(或make config、make xconfig)对linux 内核进行配置后,系统

将产生配置文件(.config)。在编译时,顶层Makefile 将读取.config 中的配置选择。

顶层Makefile 完成产生核心文件(vmlinux )和内核模块(module)两个任务,为了

达到此目的,顶层Makefile 递归进入到内核的各个子目录中,分别调用位于这些子目录中

的Makefile,然后进行编译。至于到底进入哪些子目录,取决于内核的配置。顶层Makefile

中的include arch/$(ARCH)/Makefile 指定特定CPU 体系结构下的Makefile,这个Makefile

包含了特定平台相关的信息。

各个子目录下的Makefile 同样也根据配置文件(.config)给出的配置信息,构造出当

前配置下需要的源文件列表,并在文件最后有include $(TOPDIR)/Rules.make。

顶层Makefile 定义并向环境中输出了许多变量,为各个子目录下的Makefile 传递一

些变量信息。有些变量,比如SUBDIRS,不仅在顶层Makefile 中定义并且赋初值,而且

在arch/*/Makefile 还作了扩充。现对部分主要变量介绍如下:

(1)、版本信息:

有关版本信息变量有VERSION、PATCHLEVEL、SUBLEVEL, EXTRAVERSION,

KERNELRELEASE。

版本变量信息定义了当前内核的版本, 比如VERSION=2 、PATCHLEVEL=4 、

SUBLEVEL=18 、EXATAVERSION=-rmk7 , 它们共同构成内核的发行版本

KERNELRELEASE:2.4.18-rmk7。

(2)、CPU 体系结构变量ARCH

在顶层Makefile 的开头,用ARCH 定义目标CPU 的体系结构,比如ARCH:=arm

等。许多子目录的Makefile 中,要根据ARCH 的定义选择编译源文件的列表。

(3)、路径信息变量TOPDIR、SUBDIRS

TOPDIR 变量定义了Linux 内核源代码所在的根目录。例如,各个子目录下的Makefile

通过$(TOPDIR)/Rules.make 就可以找到Rules.make 的位置。

SUBDIRS 变量定义了一个目录列表,在编译内核或模块时,顶层Makefile 根据

SUBDIRS 变量决定需要进入哪些子目录。SUBDIRS 变量的值取决于内核的配置,在顶层

Makefile 中SUBDIRS 赋值为kernel drivers mm fs net ipc lib;根据内核的配置情况,

arch/*/Makefile 中对SUBDIRS 的值进行了扩充以满足特定CPU 体系结构的要求。

(4)、内核组成信息变量:HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS

(5)、编译信息变量:CPP, CC, AS, LD, AR,CFLAGS,LINKFLAGS

CROSS_COMPILE 定义了交叉编译器前缀arm-linux-,表明所有的交叉编译工具都是

以arm-linux- 开头的,所以在各个交叉编译器工具之前都加入了$(CROSS_COMPILE)变量

引用,以组成一个完整的交叉编译工具文件名,比如arm-linux-gcc。

CFLAGS 定义了传递给C 编译器的参数。

LINKFLAGS 是链接生成vmlinux 时所使用的参数。LINKFLAGS 在arm/*/Makefile

中定义。

(6).配置变量CONFIG_*(*表示通配符)

配置文件(.config)中有许多的配置变量等式,用来说明用户配置的结果。例如

CONFIG_MODULES=y 表明用户选择了Linux 内核的模块功能。

配置文件(.config)被顶层Makefile 包含后,就形成许多的配置变量,每个配置变量

具有四种不同的值:

(a)、y 表示本编译选项对应的内核代码被静态编译进Linux 内核;

(b)、m 表示本编译选项对应的内核代码被编译成模块;

(c)、n 表示不选择此编译选项;

(d)、如果根本就没有选择,那么配置变量的值为空。

2.2、配置文件config.in

除了Makefile 的编写外,另外一个重要的工作就是把新增功能加入到Linux 的配置选

项中来提供功能的说明,让用户有机会选择新增功能项。Linux 所有选项配置都需要在

config.in 文件中用配置语言来编写配置脚本,然后顶层Makefile 调用scripts/Configure,

按照arch/arm/config.in 来进行配置。命令执行完后生成保存有配置信息的配置文件

(.config)。下一次再做make config 时将产生新的.config 文件,原.config 被改名

为.config.old。

3、编译内核的常用命令

精简Linux 内核常用命令包括:Make Config,dep,clean,mrproper,zImage,bzImage,

Modules,Modules_Install

(1)、Make config:内核配置,调用./scripts/Configure 按照arch/i386/config.in 来进行配置。

命令执行后产生文件.config,其中保存着配置信息。下次在做make config 时将产生新

的.config 文件,原文件config 更名为config.old

(2)、make dep:寻找依存关系。产生两个文件. depend 和.hdepend,其中.hdepend 表示每

个.h 文件都包含其他哪些嵌入文件。而.depend 文件有多个,在每个会产生目标文件(.o)文件

的目录下均有,它表示每个目标文件都依赖于哪些嵌入文件(.h)

(3) 、make clean:清除以前构核所产生的所有的目标文件,模块文件,核心以及一些临时

文件等,不产生任何文件

(4)、make rmproper:删除所有以前在构核过程所产生的所有文件,及除了做make clean

外,还要删除.config,.depend 等文件,把核心源码恢复到最原始的状态。下次构核时必须

进行重新配置;

(5)、make,make zImage, make bzImage: