嵌入式Linux: uClinux操作体系移植
这个英文单词中u表明Micro,小的意思,C表明Control,操控的意思,所以
uclinux是一个源码敞开的操作体系,面向没有MMU(MemoryManagementUnit)的硬件渠道。它是linux的一个变种,首要的不同之处在于两者的内存管理机制和进程调度管理机制,一起为了习惯嵌入式运用的需求,它的选用了romfs文件体系,并对linux上的c言语库glibc做了简化。
uclinux操作体系源码绝大部分是用c言语开发的,有一些与硬件直接相关的代码则用特定于某一CPU体系结构的汇编来完结。这些源码只能用GNU的gcc编译东西来进行编译、链接。
为了在PC上编译得到运转于方针CPU上的操作体系内核,还必定得装置一个适宜的穿插编译器。Gcc供给了现成的针对MIPS、ARM、M68K、Sharc、PowerPC的穿插编译器。假设没有现成的穿插编译器,则需求自行规划。GNU网站供给了一些怎么开发新的穿插编译器的文章。开发一个新的编译器,一般要如下几个过程:
(1)、编写机器描绘脚本。选用gcc的RTL(RegisterTansferLanguage)言语描绘针对某一CPU体系结构的机器指令与寻址方法、CPU浮点解决方法、endianess、c言语中各种数据类型的位宽、寄存器的个数和运用规矩、仓库和函数调用规矩等体系结构的细节。
(2)、规划代码生成器。Gcc在对c言语源文件进行了词法和语法分析后,将发生一种中心格局文件(intermediaterepresentation)。为了把这种中心格局文件转化为针对详细CPU体系结构的机器码,需求自行规划一个代码生成器。
SRAM、SDRAM等存储设备归于挥发性的存储器,掉电今后其间的内容就会悉数丢掉,所以有必要把操作体系的内核镜像存放在Flash等不挥发性存储介质上。可是操作体系在运转时,需求动态的创立一些如数据段、仓库、页表(针对运用虚拟地址的操作体系)等内容,所以要在RAM中运转操作体系。因而,就需求一个引导程序把操作体系的内核镜像从Flash存储器拷贝到RAM中,然后再从RAM中履行操作体系的内核。Bootloader就应该完结这样一种功用的程序。
从本质上来讲,bootloader不归于操作体系内核。它选用汇编言语编写,因而针对不同的cpu体系结构,这一部分代码不具有可移植性。在移植操作体系时,这部分代码有必要加以改写。
。将操作体系内核从flash拷贝到sdram中,如果是紧缩格局的内核,还要将之解紧缩。
。改写体系的memorymap,原先flash开端地址映射为0地址,这时需求将RAM的开端地址映射为0.
。设置仓库指针并将bss段清零。将来履行c言语程序和调用子函数时要用到。
bootloader程序履行完上述的各项作业后,经过一条跳转指令,转而履行ini目录下c言语源文件main.c中的函数start_kernel()。由于在此之前bootloader现已创立好一个初始化环境,
c函数能开端履行了。整个操作体系内核的初始化作业从这儿才算是真实开端。这个函数的长度比较短,代码如下:asmlinkagevoid__initstart_kernel(void)