- UID
- 1029342
- 性别
- 男
|
3.2 内核移植的基本策略
在Linux2.6内核支持下,Linux已经在许多典型的硬件平台上实现移植,其中包括:I386、ARM、MIPS、ALPHA、PowerPC、SPARC、SH等。但是对于基于特定硬件体系设计的硬件平台,需要从头对Linux进行移植。此外还有部分体系的硬件平台,Linux只对其中部分的CPU或目标板提供了支持,如果使用了Linux尚未支持的CPU或目标板,也需要对Linux内核进行移植工作。通常可以采用以下两种方法进行Linux内核移植工作:
(1)从头设计。即采用“自底向上”的设计方法,从硬件的需求考虑逐步的采用分析、设计、编码、测试。这种方法比较适合针对一种全新的硬件平台开展移植工作。(2)修改已有的代码。如前所述,Linux已经可以在多种体系结构中运行,那么,我们可以参考相近的体系结构的代码,只修改与我们的目标硬件平台不同的部分即可。这种方法的难点在于开发人员除了要了解目标硬件平台外。还必须对已支持的软硬件有一个较好的理解。本次研究的移植工作就是采用了这种开发方法。
3.3 内核移植方法
对于系统移植而言,Linux实际上是由两个比较独立的部分所构成,即内核部分和系统部分。通常启动一个Linux系统的过程为:一个不隶属于任何操作系统的加载程序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码,这样就完成了加载程序的工作。此后Linux要将自己的剩余部分全部加载到内存,初始化所有的设备,在内存中建立好所需的数据构(有关进程、设备、内存等)。此时,内核已经可以控制所有硬件设备。而后转入系统部分,操作并使用这些硬件设备。接下来内核加载根设备并启动init守护进程,init守护进程会根据配置文件加载文件系统、配置网络、服务进程及终端等。一旦终端初始化完毕,我们就会看到系统的欢迎界面了。概括说来,一部分内核初始化和控制绝大部分硬件设备,为内存管理、进程管理、设备读写等做好一切准备工作;另一部分系统加载必需的设备,配置各种环境以便用户可以使用整个系统。
图2所示为Linux内核硬件相关结构。可以看出,Linux内核中与具体硬件平台相关的结构主要分为两个部分:与具体的处理器结构相关的部分,包括中断处理、内存操作以及进程控制等;与具体外设关系密切的部分,包括硬件驱动与I/O设备。
内核移植由五个功能部分组成:进程管理(包括调度和通信)、内存管理、设备驱动、虚拟文件系统与网络,它们之间存在复杂的调用关
系。前三部分按从前到后的顺序,越靠前代表它们与硬件设备的相关程度越高,后面的虚拟文件系统和网络则几乎与平台无关,它们由设备管理中所支持的驱动程序来提供底层支持。因此,在做内核移植的时候,需要改动的就是进程管理、内存管理和设备管理中被独立出来的那部分即硬件相关部分的代码。在Linux内核源代码树中,这部分代码全部在areh目录下,主要是被内核直接调用的底层支持部分。这些代码重写了内核所需调用的所有函数,因为接口函数是固定的,所以这里更像是为硬件平台编写API。
3.4 内核移植过程
首先在通用计算机上编写程序,然后通过交叉编译生成可在目标平台上运行的二进制代码格式,最后再下载到目标平台计算机的特定位置上运行。Linux内核移植过程如下:
(1)建立移植所必须的交叉开发环境。需准备两台计算机,一台用作修改编译Linux内核,另一台用作移植Linux内核。
(2)编写和修改Linux内核。在通用计算机上修改和编写新的内核代码,编译出新的Linux内核。
(3)调试新的Linux内核。将编译后生成的新Linux内核加载到目标计算机上进行运行和调试,这个调试的过程就是交叉调试。
调试器是一个单独运行着的进程,它通过操作系统提供的调试接口来控制被调试的进程。在Linux内核移植过程中,调试时采用的是在宿主机和目标机之间进行的交叉调试。交叉调试有多种方法,它有一些典型特点:
◇调试器和被调试进程通常运行在不同的机器上(注:Linux内核作为操作系统内核,不同于普通进程,但在交叉调试中作为被调试对象,与普通进程没有区别),一般调试器运行在PC或者工作站主机(宿主机)上,而被调试的进程则运行在各种专业调试板(目标机)上。调试器通过某种通信方式与被调试进程建立联系,如串口、并口、网络、DBM或者专用的通信方式。本次移植采用了串口和JTAG两种方式与目标机进行通信。
◇在目标机上一般会具备某种形式的调试代理,它负责与调试器共同配合完成对目标机上运行着的进程的调试。这种调试代理可能是某些支持调试功能的硬件设备(如 DBI2000),也可能是某些专门的调试软件(如 gdbserver)。本次移植使用的是GDB—Stub。
◇如果目标机是某种形式的系统仿真器,通过在宿主机上运行目标机的仿真软件,整个调试过程可以在一台计算机上运行。虽然此时物理上只有一台计算机,但逻辑上仍然存在着宿主机和目标机的区别。本次移植没有使用系统仿真器。调试时,作为调试器的GDB运行在宿主机上,相应的GDB—Stub运行在目标机上。GDB通过串口或者网络与GDB—Stub进行通信,发出指令控制、访问运行在目标硬件平台上的新的Linux内核,读取Linux内核的当前状态,并能够改变Linux内核的运行状态。
经过多次移植测试后,就在基于ARM920T核的53C24lO处理器为核心处理器的ARM9平台上成功移植了Linux操作系统。
4 结束语
文中阐述了在基于ARM920T核的53C2410处理器为核心的ARM9平台上移植Linux操作系统的环境、方案和过程,对移植的难点进行了重点分
析,这对ARM9平台上的嵌入式Linux移植具有较好的实用价值和参考价值,同时对于其它平台上的嵌入式Linux移植的方法也具有一定的借鉴意义。 |
|