uClinux简介

简介: 1. uClinux简介uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"针对微控制领域而设计的Linux系统"。uclinux是一个源码开放的操作系统(http://www.uclinux.org/),面向没有MMU(Memory Management Unit

1. uClinux简介
uClinux这个英文单词中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"针对微控制领域而设计的Linux系统"。

uclinux是一个源码开放的操作系统(http://www.uclinux.org/),面向没有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在系统启动时主要完成以下几项工作:
(1) 将操作系统内核从flash拷贝到sdram中,如果是压缩格式的内核,还要将之解压缩。
(2) 改写系统的memory map,原先flash起始地址映射为0地址,这时需要将RAM的起始地址映射为0。
(3) 设置堆栈指针并将bss段清零。将来执行c语言程序和调用子函数时要用到。
(4) 改变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: %s  " , 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_shift) {
 unsigned 
int  size;
 
/*  only text is profiled  */
 prof_len 
=  (unsigned  long & _etext  -  (unsigned  long & _stext;
 prof_len 
>>=  prof_shift;
 
 size 
=  prof_len  *   sizeof (unsigned  int +  PAGE_SIZE - 1 ;
 prof_buffer 
=  (unsigned  int   * ) alloc_bootmem(size);
 }

 kmem_cache_init();
 sti();
 calibrate_delay();
#ifdef CONFIG_BLK_DEV_INITRD
 
if  (initrd_start  &&   ! initrd_below_start_ok  &&
 initrd_start 
<  min_low_pfn  <<  PAGE_SHIFT) {
 printk(KERN_CRIT 
" initrd overwritten (0x%08lx < 0x%08lx) -  "
 
" disabling it.  " ,initrd_start,min_low_pfn  <<  PAGE_SHIFT);
 initrd_start 
=   0 ;
 }

#endif
 mem_init();
 kmem_cache_sizes_init();
 pgtable_cache_init();

 mempages 
=  num_physpages;

 fork_init(mempages);
 proc_caches_init();
 vfs_caches_init(mempages);
 buffer_init(mempages);
 page_cache_init(mempages);

#if  defined(CONFIG_ARCH_S390)
 ccwcache_init();

#endif
 signals_init();
#ifdef CONFIG_PROC_FS
 proc_root_init();

#endif

#if  defined(CONFIG_SYSVIPC)
 ipc_init();

#endif
 check_bugs();
 printk(
" POSIX conformance testing by UNIFIX  " );

 
/*  
 * We count on the initial thread going ok 
 * Like idlers init is an unlocked kernel thread, which will
 * make syscalls (and thus be locked).
 
*/
 smp_init();
 rest_init();
}

5. 系统源码的修改

移植一个操作系统到新的硬件平台,比较好的办法是寻找一个架构相近并且已经做好操作系统移植的硬件平台。然后,对原先的操作系统做一定修改。系统源码修改的工作量取决于自行设计的硬件平台与现有的硬件平台之间差异程度。此设计中的硬件平台与三星4510芯片较为接近,并且也可以下载到针对4510b的uclinux系统源码。所以可以从此源码入手,根据我们的硬件平台与4510b的不同之处,在源码中找到相应的文件并加以修改。下面介绍如何修改系统源码。


需要修改的系统源码主要有如下几处:
(1) bootloader相关代码。此代码位于/uClinux/linux-2.4.x/arch/armnommu/boot/compressed/目录下名为head.s的文件中。此处程序用汇编语言实现,需要修改的地方主要是设置memory map的代码,与memory controller的硬件实现相关。
(2) UART相关代码。UART相关代码位于/uClinux/linux-2.4.x/drivers/char目录下的serial.c
(3) 定时器相关代码。uClinux中有如下函数调用star_kernel()->time_init()->setup_timer(),需要修改setup_timer()函数中的相关代码。
(4) 中断控制器相关。/uClinux/linux-2.4.x/arch/armnommu/irq.c

除了上述的代码,还有其他多处需要修改。在修改源代码时,可按照uclinux启动和执行顺序依次修改整个平台。熟悉linux内核源码结构对操作系统移植有很大帮助。
 

相关文章
|
JSON 网络协议 机器人
ROSBridge简介以及理解使用(下)
ROSBridge简介以及理解使用(下)
1451 0
|
6月前
|
存储 算法 内存技术
多媒体系统简介
一、多媒体系统简介 多媒体系统是指能够处理和展示多种媒体信息的计算机系统。它可以处理和播放音频、视频、图像等多种形式的媒体数据,并提供交互式的操作和用户界面。多媒体系统广泛应用于娱乐、教育、广告、通信等领域。 多媒体系统通常由以下几个组成部分构成: 1. 媒体输入设备:用于将外部的媒体数据输入到计算机系统中,如麦克风、摄像头、扫描仪等。 2. 媒体处理软件:用于对媒体数据进行处理和编辑的软件,如音频编辑软件、视频编辑软件、图像处理软件等。 3. 媒体存储设备:用于存储媒体数据的设备,如硬盘、光盘、闪存等。 4. 媒体输出设备:用于将处理后的媒体数据输出到外部设备或显示器上,如音箱、显示器、投影
151 0
|
并行计算 API 调度
TOPI 简介
TOPI 简介
113 0
|
XML 监控 Devops
CUNIT简介
CUNIT简介
342 0
CUNIT简介
|
存储 编解码
H264简介
H.264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的,而它的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer),其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。
H264简介
|
Java 测试技术 开发工具
AssertJ简介
JUnit和Hamcrest 学Java的一定知道JUnit吧,它是一个著名的Java单元测试框架。我们在使用JUnit测试的时候,一般情况下会使用它的Assert类下的各种assertXXX方法。
1574 0
|
网络协议 开发工具 Android开发
AndroidDevTools简介
来源:http://www.androiddevtools.cn/ Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.
2859 0
|
C# 编译器 存储
|
Web App开发 存储 安全