首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>Linux 嵌入式>文章内容
嵌入式Linux:uClinux操作系统移植讲解
来源:www.mnrc.com.cn 作者:riechelr_hl 发布时间:2007-06-06  

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)

共3页: 上一页 1 [2] [3] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·嵌入式Linux系统下图形库讲解及
·Qt/Embedded在嵌入式Linux中的应
·嵌入式系统 Boot Loader 技术内
·嵌入式 用户图形接口uC/GUI的简
·基于GTK+和X的GUI在嵌入式Linux
·嵌入式Linux系统下的MiniGUI研究
·Linux串口上网的简单实现 (图解)
·在Ubuntu上建立Arm Linux的开发
·嵌入式Linux操作系统启动信息完
·Linux 2.6 内核的嵌入式系统应用
·嵌入式Linux在Blackfin处理器上
·嵌入式uClinux的内核结构和开发
  相关文章
·精华:学习嵌入式Linux的笔记和
·嵌入式Linux在Blackfin处理器上
·基于嵌入式Linux平台的多协议路
·Linux 2.6 内核的嵌入式系统应用
·嵌入式系统中的模块动态加载技术
·嵌入式Linux操作系统启动信息完
·嵌入式操作系统的两种远程调试方
·嵌入式Linux操作系统的网络存储
·RTOS设备驱动向嵌人式Linux的移
·在嵌入式Linux增加自己的设备驱
·嵌入式Linux系统的动态电源管理
·嵌入式程序员应知道的几个基本问

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!