系。前三部分按从前到后的顺序,越靠前代表它们与硬件设备的相关程度越高,后面的虚拟文件系统和网络则几乎与平台无关,它们由设备管理中所支持的驱动程序来提供底层支持。因此,在做内核移植的时候,需要改动的就是进程管理、内存管理和设备管理中被独立出来的那部分即硬件相关部分的代码。在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内核的运行状态。