uClinux操作系统移植
--------------------------------------------------------------------------------
来源:BIPLIP.com 作者:沈沙
(复旦大学电子工程系沈沙,欢迎转载,转载时请保留此行作者信息)
l uClinux简介
l 硬件体系结构简介
l 编译环境和编译工具。
l uClinux启动过程
l 系统源码的修改
1. uClinux简介
uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"针对微控制领域而设计的Linux系统"。
uclinux是个源码开放的操作系统,面向没有MMU(Memory Management Unit)的硬件平台。他是linux的一个变种,主要的区别在于两者的内存管理机制和进程调度管理机制,同时为了适应嵌入式应用的需求,他的采用了romfs文档系统,并对linux上的c语言库glibc做了简化。
2. 硬件体系结构简介
运行uClinux的硬件平台主要包括如下几个部分:cpu(ARMv4指令集兼容)、uart、memory controller、定时器、flash存储器,sdram存储器,中断控制器和DMA。
3. 编译环境和编译工具
uclinux操作系统源码绝大部分是用c语言研发的,有一些和硬件直接相关的代码则用特定于某一CPU体系结构的汇编来实现。这些源码只能用GNU的gcc编译工具来进行编译、链接。
GNU gcc能够运行于Linux/Unix操作系统上。假如要在Windows平台上运行gcc,则必须安装Cygwin。Cygwin能够在Windows中安装一个linux的运行环境,这样就能够在windows下运行原本只能在linux下运行的程式。
为了在PC上编译得到运行于目标CPU上的操作系统内核,还必须安装一个合适的交叉编译器。Gcc 提供了现成的针对MIPS、ARM、M68K、Sharc、PowerPC的交叉编译器。假如没有现成的交叉编译器,则需要自行设计。GNU网站提供了一些如何研发新的交叉编译器的文章。研发一个新的编译器,一般需要如下几个步骤:
(1)、编写机器描述脚本。采用gcc的RTL(Register Tansfer Language)语言描述针对某一CPU体系结构的机器指令和寻址方式、CPU浮点处理方式、endianess、c语言中各种数据类型的位宽、寄存器的个数和使用规则、堆栈和函数调用规则等体系结构的细节。
(2)、设计代码生成器。Gcc在对c语言源文档进行了词法和语法分析后,将产生一种中间格式文档(intermediate representation)。为了把这种中间格式文档转化为针对具体CPU体系结构的机器码,需要自行设计一个代码生成器。
(3)、设计汇编器
(4)、设计链接器
4. uClinux启动过程
uClinux系统的启动能够分为两个步骤:
(1). 运行bootloader初始化程式
SRAM、SDRAM等存储设备属于挥发性的存储器,掉电以后其中的内容就会全部丢失,所以必须把操作系统的内核映像存放在Flash等不挥发性存储介质上。但是操作系统在运行时,需要动态的创建一些如数据段、堆栈、页表(针对使用虚拟地址的操作系统)等内容,所以需要在RAM中运行操作系统。因此,就需要一个引导程式把操作系统的内核映像从Flash存储器拷贝到RAM中,然后再从RAM中执行操作系统的内核。Bootloader就是能够完成这样一种功能的程式。
从本质上来讲,bootloader不属于操作系统内核。他采用汇编语言编写,因此针对不同的cpu体系结构,这一部分代码不具备可移植性。在移植操作系统时,这部分代码必须加以改写。
具体来讲,bootloader在系统启动时主要完成以下几项工作:
· 将操作系统内核从flash拷贝到sdram中,假如是压缩格式的内核,还要将之解压缩。
· 改写系统的memory map,原先flash起始地址映射为0地址,这时需要将RAM的起始地址映射为0。
· 配置堆栈指针并将bss段清零。将来执行c语言程式和调用子函数时要用到。
· 改变pc值,使得cpu开始执行真正的操作系统内核。
(2) 运行操作系统内核
bootloader程式执行完上述的各项工作后,通过一条跳转指令,转而执行ini目录下c语言源文档main.c中的函数start_kernel()。因为在此之前bootloader已创建好一个初始化环境,
c函数能够开始执行了。整个操作系统内核的初始化工作从这里才算是真正开始。这个函数的长度比较短,代码如下:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
asmlinkage void __init start_kernel(void)
{
char * command_line;
unsigned long mempages;
extern char saved_command_line[];
/*
* Interrupts are still disabled. Do necessary setups, then
* enable them
*/
lock_kernel();
printk(linux_banner);
setup_arch(&command_line);
printk("Kernel command line: %sn", saved_command_line);
--------------------------------------------------------------------------------
来源:BIPLIP.com 作者:沈沙
(复旦大学电子工程系沈沙,欢迎转载,转载时请保留此行作者信息)
l uClinux简介
l 硬件体系结构简介
l 编译环境和编译工具。
l uClinux启动过程
l 系统源码的修改
1. uClinux简介
uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"针对微控制领域而设计的Linux系统"。
uclinux是个源码开放的操作系统,面向没有MMU(Memory Management Unit)的硬件平台。他是linux的一个变种,主要的区别在于两者的内存管理机制和进程调度管理机制,同时为了适应嵌入式应用的需求,他的采用了romfs文档系统,并对linux上的c语言库glibc做了简化。
2. 硬件体系结构简介
运行uClinux的硬件平台主要包括如下几个部分:cpu(ARMv4指令集兼容)、uart、memory controller、定时器、flash存储器,sdram存储器,中断控制器和DMA。
3. 编译环境和编译工具
uclinux操作系统源码绝大部分是用c语言研发的,有一些和硬件直接相关的代码则用特定于某一CPU体系结构的汇编来实现。这些源码只能用GNU的gcc编译工具来进行编译、链接。
GNU gcc能够运行于Linux/Unix操作系统上。假如要在Windows平台上运行gcc,则必须安装Cygwin。Cygwin能够在Windows中安装一个linux的运行环境,这样就能够在windows下运行原本只能在linux下运行的程式。
为了在PC上编译得到运行于目标CPU上的操作系统内核,还必须安装一个合适的交叉编译器。Gcc 提供了现成的针对MIPS、ARM、M68K、Sharc、PowerPC的交叉编译器。假如没有现成的交叉编译器,则需要自行设计。GNU网站提供了一些如何研发新的交叉编译器的文章。研发一个新的编译器,一般需要如下几个步骤:
(1)、编写机器描述脚本。采用gcc的RTL(Register Tansfer Language)语言描述针对某一CPU体系结构的机器指令和寻址方式、CPU浮点处理方式、endianess、c语言中各种数据类型的位宽、寄存器的个数和使用规则、堆栈和函数调用规则等体系结构的细节。
(2)、设计代码生成器。Gcc在对c语言源文档进行了词法和语法分析后,将产生一种中间格式文档(intermediate representation)。为了把这种中间格式文档转化为针对具体CPU体系结构的机器码,需要自行设计一个代码生成器。
(3)、设计汇编器
(4)、设计链接器
4. uClinux启动过程
uClinux系统的启动能够分为两个步骤:
(1). 运行bootloader初始化程式
SRAM、SDRAM等存储设备属于挥发性的存储器,掉电以后其中的内容就会全部丢失,所以必须把操作系统的内核映像存放在Flash等不挥发性存储介质上。但是操作系统在运行时,需要动态的创建一些如数据段、堆栈、页表(针对使用虚拟地址的操作系统)等内容,所以需要在RAM中运行操作系统。因此,就需要一个引导程式把操作系统的内核映像从Flash存储器拷贝到RAM中,然后再从RAM中执行操作系统的内核。Bootloader就是能够完成这样一种功能的程式。
从本质上来讲,bootloader不属于操作系统内核。他采用汇编语言编写,因此针对不同的cpu体系结构,这一部分代码不具备可移植性。在移植操作系统时,这部分代码必须加以改写。
具体来讲,bootloader在系统启动时主要完成以下几项工作:
· 将操作系统内核从flash拷贝到sdram中,假如是压缩格式的内核,还要将之解压缩。
· 改写系统的memory map,原先flash起始地址映射为0地址,这时需要将RAM的起始地址映射为0。
· 配置堆栈指针并将bss段清零。将来执行c语言程式和调用子函数时要用到。
· 改变pc值,使得cpu开始执行真正的操作系统内核。
(2) 运行操作系统内核
bootloader程式执行完上述的各项工作后,通过一条跳转指令,转而执行ini目录下c语言源文档main.c中的函数start_kernel()。因为在此之前bootloader已创建好一个初始化环境,
c函数能够开始执行了。整个操作系统内核的初始化工作从这里才算是真正开始。这个函数的长度比较短,代码如下:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
asmlinkage void __init start_kernel(void)
{
char * command_line;
unsigned long mempages;
extern char saved_command_line[];
/*
* Interrupts are still disabled. Do necessary setups, then
* enable them
*/
lock_kernel();
printk(linux_banner);
setup_arch(&command_line);
printk("Kernel command line: %sn", saved_command_line);
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




