uClinux操作系统移植,看看

sky1215dd

sky1215dd

2016-01-29 18:34

uClinux操作系统移植,看看,uClinux操作系统移植,看看
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); parse_options(command_line); trap_init(); init_IRQ(); sched_init(); softirq_init(); time_init(); /* * HACK ALERT! This is early. We're enabling the console before * we've done PCI setups etc, and console_init() must be aware of * this. But we do want output early, in case something goes wrong. */ console_init(); #ifdef CONFIG_MODULES init_modules(); #endif if (prof
展开更多 50%)
分享

猜你喜欢

uClinux操作系统移植,看看

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
uClinux操作系统移植,看看

操作系统移植是什么

服务器
操作系统移植是什么

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

访问操作系统

autocad教程
访问操作系统

访问操作系统教程

autocad教程
访问操作系统教程

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

操作系统有哪些

电脑入门
操作系统有哪些

Darwin操作系统简介

服务器
Darwin操作系统简介

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Photoshop教程:打造粉色非主流可爱MM

Photoshop教程:打造粉色非主流可爱MM

互斥型信号量和二进制信号量

互斥型信号量和二进制信号量
下拉加载更多内容 ↓