`
txf2004
  • 浏览: 7042367 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

uClinux简介

阅读更多

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函数可以开始执行了。整个操作系统内核的初始化工作从这里才算是真正开始。这个函数的长度比较短


代码如下:

asmlinkagevoid__initstart_kernel(void)
{

char*command_line;
unsigned
longmempages;

externcharsaved_command_line[];


/*
*Interruptsarestilldisabled.Donecessarysetups,then
*enablethem

*/
lock_kernel();
printk(linux_banner);
setup_arch(
&command_line);
printk(
"Kernelcommandline:%s",saved_command_line);
parse_options(command_line);
trap_init();
init_IRQ();
sched_init();
softirq_init();
time_init();


/*
*HACKALERT!Thisisearly.We'reenablingtheconsolebefore
*we'vedonePCIsetupsetc,andconsole_init()mustbeawareof
*this.Butwedowantoutputearly,incasesomethinggoeswrong.

*/
console_init();
#ifdefCONFIG_MODULES
init_modules();

#endif

if(prof_shift){
unsigned
intsize;

/*onlytextisprofiled*/
prof_len
=(unsignedlong)&_etext-(unsignedlong)&_stext;
prof_len
>>=prof_shift;

size
=prof_len*sizeof(unsignedint)+PAGE_SIZE-1;
prof_buffer
=(unsignedint*)alloc_bootmem(size);
}

kmem_cache_init();
sti();
calibrate_delay();
#ifdefCONFIG_BLK_DEV_INITRD

if(initrd_start&&!initrd_below_start_ok&&
initrd_start
<min_low_pfn<<PAGE_SHIFT){
printk(KERN_CRIT
"initrdoverwritten(0x%08lx<0x%08lx)-"

"disablingit.",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);

#ifdefined(CONFIG_ARCH_S390)
ccwcache_init();

#endif
signals_init();
#ifdefCONFIG_PROC_FS
proc_root_init();

#endif

#ifdefined(CONFIG_SYSVIPC)
ipc_init();

#endif
check_bugs();
printk(
"POSIXconformancetestingbyUNIFIX");


/*
*Wecountontheinitialthreadgoingok
*Likeidlersinitisanunlockedkernelthread,whichwill
*makesyscalls(andthusbelocked).

*/
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内核源码结构对操作系统移植有很大帮助。

分享到:
评论

相关推荐

    嵌入式uclinux简介

    嵌入式uCLinux是一种专为微控制器设计的轻量级Linux操作系统,它在标准Linux的基础上进行了优化,以适应资源有限的嵌入式环境。uCLinux中的“u”代表Micro,意指微型,而“C”则代表Control,表明其主要用于控制系统...

    uclinux核心手册-中文

    1. **第一章:uCLinux简介** - 这一章会介绍uCLinux的历史、特点以及它与标准Linux的区别。它会阐述uCLinux如何适应没有MMU(内存管理单元)的处理器环境,以及其对内存管理的特殊处理。 2. **第二章:嵌入式系统与...

    S3C44B0 调试笔记 uClinux部分

    #### 一、uClinux简介与背景 uClinux是一种专门针对嵌入式系统的轻量级Linux发行版,它为不具备MMU(内存管理单元)的处理器提供了Linux环境。由于S3C44B0X处理器不包含MMU,因此uClinux成为了其理想的开发环境。...

    uClinux下驱动开发入门精华

    1. **uClinux简介** uClinux是为了适应资源有限的嵌入式环境而创建的,它去掉了对MMU的依赖,因此可以在没有硬件内存管理的微处理器上运行。这使得uClinux成为许多小型、低成本嵌入式设备的理想选择。 2. **驱动...

    ADSP-BF533 uCLINUX操作系统移植

    uCLINUX简介 - **定义**: uCLINUX是一种适用于嵌入式系统的轻量级操作系统。 - **特点**: - 支持多种处理器架构。 - 针对嵌入式应用进行了优化,体积更小。 - 保留了Linux的强大特性,如高稳定性、网络功能和...

    uClinux 內核配置傻瓜教程

    #### 一、uClinux简介 uClinux是一种专为无MMU(内存管理单元)的嵌入式处理器设计的Linux操作系统变种,它能够运行在诸如ARM7等低端处理器上。由于这些处理器通常不支持虚拟内存管理,因此uClinux采用了特殊的内存...

    uClinux移植和分析

    #### 一、uClinux简介及移植背景 uClinux是一种针对嵌入式设备的Linux发行版,特别适用于那些资源有限(如内存)的系统。由于其轻量级的设计,uClinux成为了许多嵌入式项目的首选操作系统之一。与标准Linux不同的是...

    uClinux系统的移植

    1. **uClinux 简介** - uClinux是专为没有MMU(内存管理单元)的微控制器设计的Linux版本,它简化了内存管理和进程调度机制。 - uClinux的特点包括romfs文件系统,这是为嵌入式应用优化的轻量级文件系统,以及对...

    uclinux手册

    一、uCLinux简介 uCLinux是Linux内核的一个分支,主要针对没有MMU(Memory Management Unit,内存管理单元)的处理器设计。在这样的硬件平台上,传统的Linux内核无法运行,因为MMU是Linux内存管理的基础。uCLinux...

    UC OS和UCLinux比较

    #### UC/OS与UCLinux简介 - **UC/OS**:UC/OS(通常被称为μC/OS)是一款面向小型控制系统的实时操作系统(RTOS)。它以其高效、小巧、实时性能强而著称。UC/OS的核心功能包括任务调度与管理、时间管理、任务间同步...

    嵌入式uclinux及应用开发

    1. **UCLinux简介**:UCLinux是Linux内核的一个分支,它去除了对MMU的依赖,可以在没有内存保护的系统上运行。这使得UCLinux成为微控制器和其他资源受限环境的理想选择。 2. **嵌入式系统开发**:理解嵌入式系统的...

    uclinux_introduction

    ### uClinux简介 本文档基于“Introduction to uClinux”这一英文电子书进行提炼与扩展,该电子书由Michael Opdenacker编写,并遵循GNU自由文档许可协议发布。本章节将深入探讨uClinux的核心概念、特点及其应用场景...

    uclinux在nios ii处理器上的移植

    1. **uCLinux简介**:uCLinux是Linux的一个分支,专为没有MMU的嵌入式系统设计,通过避免对虚拟内存的依赖,实现了在资源有限的硬件上运行。 2. **Nios II处理器**:Nios II是Altera公司开发的32位RISC处理器核,常...

    uClinux—一种嵌入式Linux系统.pdf

    - **uClinux简介**: uClinux是专为微控制器领域设计的一种嵌入式Linux系统。它是一个遵循GNU/GPL公约的开放源代码项目,目前由Lineo公司维护。 - **内存管理**: - uClinux的一个显著特点是它不支持虚拟存储器,这...

    AN_Getting+started+uClinux+with+LPC22xx.pdf

    uClinux简介 uClinux是一种为没有内存管理单元(MMU)的微控制器设计的Linux变种。它是一款开源软件,遵循GNU公共许可证发布。uClinux操作系统包括了针对2.0、2.4和2.6版本的Linux内核以及一系列用户应用程序、库...

    hello world on uClinux&& skyeye

    #### 一、uClinux简介 uClinux 是一个针对无MMU微控制器的Linux发行版,它为嵌入式系统提供了一个功能强大且高度可定制的操作环境。它基于标准的Linux内核,并通过一系列的技术手段实现了对没有MMU(Memory ...

Global site tag (gtag.js) - Google Analytics