- UID
- 133947
- 性别
- 男
|
与其它操作系统相比,Linux最大的特点:它是一款遵循GPL的操作系统,我们可以自由 地使用、修改、和扩展它。正是由于这一特色,Linux受到越来越多人士的青睐。于是, 一个经常会被探讨的问题出现了,即关于Linux系统的移植。对于操作系统而言,这种移 植通常是跨平台的、与硬件相关的,即硬件系统结构、甚至CPU不同。下面就让我们来看 看在Linux系统移植方面,我们都需要做些什么。 一、Linux系统移植的两大部分 对于系统移植而言,Linux系统实际上由两个比较独立的部分组成,即内核部分和系 统部分。通常启动一个Linux系统的过程是这样的:一个不隶属于任何操作系统的加载程 序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码。加载程 序的工作就完了,此后Linux要将自己的剩余部分全部加载到内存(如果有的话,视硬件 平台的不同而不同),初始化所有的设备,在内存中建立好所需的数据结构(有关进程 、设备、内存等)。到此为止Linux内核的工作告一段落,内核已经控制了所有硬件设备 。至于操作和使用这些硬件设备,则轮到系统部分上场了。内核加载根设备并启动init 守护进程,init守护进程会根据配置文件加载文件系统、配置网络、服务进程、终端等 。一旦终端初始化完毕,我们就会看到系统的欢迎界面了。小结一下: (1)内核部分初始化和控制所有硬件设备(严格说不是所有,而是绝大部分),为内存 管理、进程管理、设备读写等工作做好一切准备。 (2)系统部分加载必需的设备,配置各种环境以便用户可以使用整个系统。 二、系统移植所必需的环境 在进一步叙述之前,我们有必要提一下做系统移植所必需的环境。 首先,需要一个新版本的gcc。对于一个准备系统移植的程序员而言,“新”到什么 程度应该心里有数。做跨平台编译,gcc也许是最好的选择。另外,Linux内核依赖许多 gcc特有的特性,非它不可。如果你已经会使用gcc并实地操练过多回,那你只需要再进 一步巩固一下跨平台编译的操作即可。两种编译环境是可用的:非目标平台上的Linux或 目标平台上的非Linux系统,除非你的开发平台过于特殊,否则你一定能够找到你能用的 gcc。 其次,编译链接库是必需的,而且必须是目标平台的编译链接库。通常这是一个枯 燥、繁琐、又丝毫没有成就感的过程。幸运的话,会有现成的链接库可以用。否则,你 需要自己用gcc建立它。 最后,需要目标平台的所有文档,越多越好。如果有一定的开发支持/仿真环境,L oader(加载程序)则最好,这些可以帮助你减少移植过程中浪费在琐事上的时间。 三、Linux系统移植 接下来我们从内核和系统两个方面描述一下移植中的关键。 (1) 内存移植 Linux系统采用了相对来说并不是很灵活的单一内核机制,但这丝毫没有影响Linux 系统的平台无关性和可扩展性。Linux使用了两种途径分别解决这些问题,很干净利落, 丝毫不拖泥带水,而且十分清晰易懂。分离硬件相关代码和硬件无关代码,使上层代码 永远不必关心低层换用了什么代码,如何完成了操作。不论对x86上还是在Alpha平台上 分配一块内存,对上层代码而言没什么不同。硬件相关部分的代码不多,占总代码量的 很少一部分。所以对更换硬件平台来说,没有什么真正的负担。另一方面,Linux使用内 核机制很好地解决了扩展的问题,一堆代码可以在需要的时候轻松地加载或卸下,象随 身听,需要的时候带上,不需要时则锁在抽屉里。 Linux内核可以视为由五个功能部分组成:进程管理(包括调度和通信)、内存管理 、设备管理、虚拟文件系统、网络。它们之间有着复杂的调用关系,但幸运的是,在移 植中不会触及到太多,因为Linux内核良好的分层结构将硬件相关的代码独立出来。何谓 硬件相关,何谓无关?以进程管理为例,对进程的时间片轮转调度算法在所有平台的Li nux中都是一样的,它是与平台无关的;而用来在进程中切换的实现在不同的CPU上是不 同的,因此需要针对该平台编写代码,这就是平台相关的。上面所讲的五个部分的顺序 不是随便排的,从前到后分别代表着它们与硬件设备的相关程度。越靠前越高,后面的 两个虚拟文件系统和网络则几乎与平台无关,它们由设备管理中所支持的驱动程序提供 底层支持。因此,在做系统移植的时候,需要改动的就是进程管理、内存管理和设备管 理中被独立出来的那部分即硬件相关部分的代码。在Linux代码树下,这部分代码全部在 arch目录下。 如果你的目标平台已经被Linux核心所支持的话,那么你是幸运的,因为已经没有太 多的工作让你去做。只要你的交叉编译环境是正确的,你只需要简单的配置、编译就可 以得到目标代码。否则,需要你去编写,或修改一些代码。只需修改平台相关部分的代 码即可。但需要对目标平台,主要是对CPU的透彻理解。在Linux的代码树下,可以看到 ,这部分的典型代码量为:2万行左右C代码和2千行左右的汇编(C代码中通常包含许多 伪汇编指令,因此实际上纯C代码要少很多),这部分工作量是不可小看的。它包含了对 绝大多数硬件的底层操作,涉及IRQ、内存页表、快表、浮点处理、时钟、多处理器同步 等问题,频繁的端口编程意味着需要你将目标平台的文档用C语言重写一遍。这就是为什 么说目标平台的文档极其重要。 |
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!) |
|