Linux内核移植实验指导书
1 Linux内核移植前准备
对于嵌入式Linux系统来说,有各种体系结构的处理器和硬件平台,并且用户需要根据需求自己定制硬件板。只要是硬件平台发生变化,即使非常小,可能也需要做一些移植工作。内核移植是嵌入式Linux系统中最常见的一项工作。当然,移植嵌入式 Linux系统并不意味着该内核使用了任何特定的链接库或用户工具,建立嵌入式系统并不需要特别的内核。嵌入式系统中使用的内核与工作站或服务器上使用的内核主要的不同在于内核的配置方面。Linux 内核移植是在 Linux原内核基础上,通过对平台的选择设计来实现针对特定系统的内核版本。 Linux内核的移植包含启动代码的修改、内核的链接及装入、参数传递、内核引导几个部分。其基本过程如下:
1)首先,获取某一版本的Linux内核源码,根据具体目标平台对源码进行必要的改写(主要是修改体系结构相关部分);
2)然后添加一些外设的驱动(如网卡驱动,USB驱动),打造一款适合于目标平台(可
以是嵌入式便携设备也可以是其它体系结构的 PC 机)的新操作系统,也就是常说的内核配置或内核定制;
3)对该系统进行针对目标平台的交叉编译,生成一个内核映象文件(如 zImageuImagebzImage);
4)最后通过一些手段(如TFTP)把该映象文件烧写到目标平台中。
本实验将对 Linux 内核移植的一些相关概念、知识进行介绍,希望学员可以对 Linux 内核的移植理解得更透彻。
1.1 Linux内核源码
Linux内核移植工作主要是修改跟硬件平台相关的代码,一般不涉及  Linux 内核通用的程序,移植的难度也取决于两种硬件平台的差异。通常对  Linux 源码的改写工作难度较大,它要求你不仅对 Linux内核结构要非常熟悉,还要求你对目标平台的硬件结构非常熟悉。同时还要求你对相关版本的汇编语言较熟悉因为与体系结构相关的部分源码往往是用汇编写
的。
本小节虽然并不对具体的内核代码进行修改, 但是与其相关的一些基础和概念还是有必
要简单介绍一下。
1BSP包开发
Linux对于特定的硬件平台的软件就叫作 BSPBoard Support Package)。基于上面描
述的困难,这部分工作一般由目标平台提供商来完成。比如说针对目前嵌入式系统中最流行
ARM平台,它的这部分工作就是由英国ARM公司的工程师完成的,我们所要做的就是从其网站上下载相关版本Linux内核的补丁(Patch)。把它打到我们的Linux内核上,再进行后续操作就行。针对某些特定的硬件平台可能并没有平台开发商提供的BSP,这就需要我们自己参考类似的BSP来开发程序。
所幸的是,Linux内核已经支持了各种体系结构的很多种目标板,我们很容易从中到
跟自己硬件类似的目标板。参考内核已经支持的目标板来移植BSP,就如同使用模板开发
程序一样。当然,我们选择的参考板不能仅凭兴趣或爱好来选取,选择参考板也有一定的原
则。具体的原则如下:
参考板与开发板具有相同的处理器,至少类似的处理器;
参考板和开发板具有相同的外围接口电路,至少基本接口相同;
■ Linux内核已经支持参考板,至少有非官方的补丁或者BSP 
参考板Linux设备驱动工作正常,至少已经驱动基本接口。
到了参考板后,还要仔细分析内核代码以及参考板的BSP,分析平台相关的部分代码实现;分析内核编译组织方式;分析内核启动的初始化程序;分析驱动程序的实现;弄清楚
哪些设备有驱动程序,哪些还没有等等。然后才能开始动手修改内核源代码。
2)内核源码分析
我们需要进行 Linux内核移植,那么首先,我们得下载一个干净的内核源码树,这里实验下载的内核源代码版本为 Linux2.6.24.4。解压后,先来看看Linux内核源代码目录树结构。 
2)内核源码分析
我们需要进行 Linux内核移植,那么首先,我们得下载一个干净的内核源码树,这里本实验下载的内核源代码版本为 Linux2.6.24.4。解压后,先来看看 Linux内核源代码目录树结构。 
linux内核文件放在哪
1-1 Linux内核子目录结构
目录名
描述
arch
存放各种与硬件体系结构相关的代码,每种体系结构一个相应的目录,每个目录下都包括了该体系结构相关的代码,包括内存管理,启动代码,浮点数仿真等等。
block
部分块设备驱动程序。
crypto
常用加密和散列算法(如 AESSHA等) ,还有一些压缩和 CRC 校验算法。
drivers
所有的设备驱动程序,里面每一个子目录对应一类驱动程序,比如drivers/block/为块设备驱动程序,drivers/char/为字符设备驱动程序,drivers/mtd/NOR FlashNAND Flash等存储设备的驱动程序。
fs
提供对各种文件系统的支持。每个子目录对应一种文件系统,比如fs/fat32/
include
内核头文件,有基本文件(存放在include/linux/目录下)、各种驱动或功能部件的头文件(比如include/media/include/mtd/include/net/)、各种体系相关的头文件(比如include/asm-arm/)。当配置内核后,include/asm/是某个include/asm-xxx/(比如include/asm-arm/)的链接。
init
内核的初始化代码(不是系统的引导代码),其中的main.c文件中的star_kernel函数是内核引导后运行的第一个函数
ipc
进程间通信的代码
kernel
内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel 目录下。
lib
各种库文件代码。
mm
内存管理代码,和平台相关的一部分代码放在 arch/*/mm目录下。
net
网络相关代码,实现了各种常见的网络协议。
scripts
用于配置内核文件的脚本文件
sound
音频设备的驱动程序
usr
用户代码
Documentation
内核文档
在以上布局中,linux内核主要分为特定于体系结构的部分和与体系结构无关的部分。
Linux启动的第一阶段,内核与体系结构相关部分(arch目录下)首先执行,在这部分它要做的工作有:内核解压缩、解压缩内核重定位;内存硬件初始化检测;参数表的分析;初始化页表目录的制作等工作,然后把控制权转给内核中与系统结构无关部分。所以操作系统内核移植中要改动的代码主要集中在与体系结构相关的启动初始化部分。 从上面的目录结构介绍可知,如果要添加新的开发板或者寻体系结构相关的文件首先就是到 arch 目录下去寻。在 arch 目录中我们可以看到有许多子目录,它们往往是用芯片命名的,表示是针对该芯片体系结构的代码。为 ARM系列芯片编译内核,就应修改  ARM目录下的相关文件。 Linux 移植过程中内容非常多,涉及的知识量也很大,而且由于平台的不同,和内核版本的不同所涉及的内容往往也有很大不同。所以以上给出内容也仅作为读者参考之用。具体操作时还应收集相关平台及内核版本的详细资料,才能展开相应工作。限于篇幅本实验也无法做更深入的介绍。
1.2 图形化内核配置选项
Linux源码的顶层目录运行 make  menuconfig,便会出现如下图所示的图形化配置菜单:
1-1 内核配置选项主菜单
上图显示的是一个主菜单,主菜单中还包含了很多子菜单,通过敲键盘的键可以
选择不同的子菜单,再敲回车键,进入这些子菜单,可以看到该子菜单下的一些功能选项,如我们进入 System Type这个子菜单,便可以看到如图 1-2 所示的界面:
1-2 内核配置选项子菜单
在对各个选项进行配置时,有三种方式,它们分别代表的含义如下: 
Y:将该功能编译进内核;
N:不将该功能编译进内核;
M:将该功能编译成可以在需要时动态插入到内核中的模块
至于某个选项具体配置成哪一种方式,可以通过空格键进行选取。所有选项前都有一个
括号,有的是中括号,有的是尖括号,还有圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*""M"这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。
内核配置好后,读者可以通过 Esc 键或是 Exit 选项离开内核配置菜单。内核配置系统
将会提示是否要储存新的配置。选择Yes,离开内核配置系统的时候,会将新的配置储存到
新的.config文件。这除了会建立.config文件,也会建立一些的头文件和符号链接。选择 No
离开内核配置系统的时候,并不会储存任何变更。除了主要的配置选项,内核所支持的架构通常会包含特定开发板的标准样版配置。比如ARM开发板,以 s3c2410为例,在 arch/arm/configs目录下便有一个s3c2410_defconfig的配置文件,运行 make s3c2410_defconfig命令,内核配置系统将自动调用该配置文件,并且将该文件中各选项的配置存储到.config文件中去,下次执行 make menuconfig时就会载入这些配置。
2 Linux内核移植
2.1 获取linux源码
linux-2.6.24.4的内核源码可以从上下载。
linux-2.6.24.4.tar.bz2拷贝到/gdut2410/kernel/目录下,解压,就可以得到完整的Linux内核源码包:
进入/gdut2410/kernel目录下
[root@BC  /]# cd /gdut2410/kernel
2.2 解压内核源代码
解压内核
[root@BC kernel]# tar -jxvf linux-2.6.24.4.tar.bz2
进入内核目录
[root@BC kernel]# cd linux-2.6.24.4
2.3 指定交叉编译器
修改顶层目录的 Makefile,执行命令
[root@BC linux-2.6.24.4]# vi Makefile
193行设置下面两行:
ARCH := arm
CROSS_COMPILE := /gcc-3.4.6-glibc-2.3.6/arm-linux/bin/arm-linux-

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。