uCLinux开发介绍
- 格式:doc
- 大小:2.23 MB
- 文档页数:20
ARM设计的uClinux及其应用摘要:本文讨论了基于ARM的嵌入式操作系统uClinux及其应用开发设计及实现。
在32位ARM核的微处理器S3C4510B的硬件平台上结合嵌入式实时操作uClinux.完成了系统的硬件设计uClinux的编译、移植,最后实现了应用程序的添加。
关键词:ARM;实时操作系统uClinux;S3C4510B;ARM7TDMI1嵌入式操作系统uClinux及其应用开发嵌入式软件平台由以下部分组成:系统引导程序、嵌入式操作系统内核、文件系统。
系统引导程序通常也称为BootLoad&mdas摘要:本文讨论了基于ARM的嵌入式操作系统uClinux及其应用开发设计及实现。
在32位ARM核的微处理器S3C4510B的硬件平台上结合嵌入式实时操作uClinux.完成了系统的硬件设计uClinux的编译、移植,最后实现了应用程序的添加。
关键词:ARM;实时操作系统uClinux;S3C4510B;ARM7TDMI1 嵌入式操作系统uClinux及其应用开发嵌入式软件平台由以下部分组成:系统引导程序、嵌入式操作系统内核、文件系统。
系统引导程序通常也称为BootLoad—er ,代码量虽少,但是作用非常大,相当于PC上的BOIS,负责将操作系统内核固化到Flash中和系统初始化工作.然后将系统控制权交给操作系统。
文件系统是嵌入式软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分,它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。
1.1 BootLoader程序系统引导程序BootLoader是嵌入式系统加电后执行的第一个程序,一般应写入Flash存储器中并从起始物理地址0x0开始。
在应用实际中BootLoader的功能主要有:① 将uCLinux内核和文件系统烧写到目标板中;②系统初始化;③系统的内存映射;④加载uClinux内核1.2 嵌入式操作系统uCiinuxuClinux就是Micro—Control—Linux,是针对控制领域的嵌入式linux操作系统,它是从Linux 2.0/2.4内核派生而来,沿袭了主流Linux 的绝大部分特性,适合不具备内存管理单元(MMU)的微处理器/微控制器(例如ARM7TDMI),它也是一个完全符合GNU/GPL公约的操作系统,完全开放代码。
嵌入式uClinux的内核结构和开发环境时间:2009-05-12 23:27来源:Linux Website 作者:admin 点击: 900次1 引言嵌入式操作系统是嵌入式系统的灵魂,而且在同一个硬件平台上可以嵌入不同的嵌入式操作系统。
比如ARM7TDMI内核,可以嵌入Nucleus、VxWorks、uClinux等操作系统。
在此主要对uClinux的1 引言嵌入式操作系统是嵌入式系统的灵魂,而且在同一个硬件平台上可以嵌入不同的嵌入式操作系统。
比如ARM7TDMI内核,可以嵌入Nucleus、VxWorks、uClinux 等操作系统。
在此主要对uClinux的进行介绍,嵌入式uClinux操作系统主要有三个基本部分组成:引导程序、uClinux内核(由内存管理、进程管理和中断处理等构成)和文件系统。
uClinux可以通过定制使内核小型化,还可以加上GUI(图形用户界面)和定制应用程序,并将其放在ROM、RAM、FLASH或Disk On Chip中启动。
由于嵌入式uClinux操作系统的内核定制高度灵活性,开发者可以很容易地对其进行按需配置,来满足实际应用需要。
又由于uClinux是源代码公开,因此开发人员只有了解内核原理就可以自己开发部分软件,例如增加各类驱动程序。
下面将详细分析嵌入式操作系统uClinux。
2 嵌入式uCinux内核结构uClinux内核结构如图1所示:图1代表了内核的功能结构,与Linux基本相同,不同的只是对内存管理和进程管理进行改写,以满足无MMU处理器的要求。
uClinux是Linux 操作系统的一种,是由Linux2.0内核发展来的,是专为没有MMU的微处理器(如ARM7TDMI、Coldfire 等)设计的嵌入式Linux操作系统。
另外,由于大多数内核源代码都被重写,uClinux的内核要比原Linux 2.0内核小的多, 但保留了Linux 操作系统的主要优点:稳定性,优异的网络能力以及优秀的文件系统支持。
组名U5G参赛编号A358文档编号DOC-2日期2007-1-26作者王志勇uCLinux操作系统开发文档一.uClinux操作系统简介在本设计中采用的STR 710处理器不带有MMU,故操作系统选用uClinux.uClinux, Micro-Control-Linux,即"针对微控制领域而设计的Linux系统"。
1.uClinux的内存管理对于uClinux来说,其设计针对没有MMU的处理器,即uClinux不能使用处理器的虚拟内存管理技术。
uClinux仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。
在加载应用程序时程序分页加载。
但是由于没有MMU管理,所以实际上uClinux采用实存储器管理策略(real memeory management)。
这一点影响了系统工作的很多方面。
uClinux系统对于内存的访问是直接的,(它对地址的访问不需要经过MMU,而是直接送到地址线上输出),所有程序中访问的地址都是实际的物理地址。
操作系统对内存空间没有保护(这实际上是很多嵌入式系统的特点),各个进程实际上共享一个运行空间(没有独立的地址转换表)。
2.uClinux的内核加载方式uClinux的内核有两种可选的运行方式:可以在flash上直接运行,也可以加载到内存中运行。
这种做法可以减少内存需要。
Flash运行方式:把内核的可执行映象烧写到flash上,系统启动时从flash的某个地址开始逐句执行。
这种方法实际上是很多嵌入式系统采用的方法。
内核加载方式:把内核的压缩文件存放在flash上,系统启动时读取压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运行速度可能更快(ram的存取速率要比flash高)。
3.uClinux的根(root)文件系统uClinux系统采用romfs文件系统,这种文件系统相对于一般的ext2文件系统要求更少的空间。
空间的节约来自于两个方面,首先内核支持romfs文件系统比支持ext2文件系统需要更少的代码,其次romfs文件系统相对简单,在建立文件系统超级块(superblock)需要更少的存储空间。
嵌入式uClinux应用程序的NFS开发
在目标机上可以运行uClinux了,接着就需要开发完成特定任务的应用程序了。
由于嵌入式uClinux的特殊开发环境(主机目标机),其应用程序的开发模式也有多种。
一种是在主机上编写程序,然后编译、连接、调试,成功后将程序和内核一同编译并下载到目标板。
这种模式中不利于开发的问题有:主机和目标机的运行环境(如指令集,函数库等)不同。
另一种是通过网线或串口线将目标机和主机连起来,直接在目标机上开发调试。
这种模式使用NFS将主机的特定目录mount到目标机上,对主机的操作就是对目标机的操作。
采用NFS模式可以方便应用程序的开发,减少映像文件的下载次数和对flash的烧写次数。
这对于缩短开发周期,提高开发效率,加快产品的上市时间相当重要。
1 NFS的简要介绍。
uCLinux嵌入式系统开发环境建立
1.Linux 是一种很受欢迎的操作系统
uClinux 这个英文单词u 中的表示小Micro. 小的意思,C 表示Control,控制的意思.所以uClinux 就是Micro-control-Linux,字面上的理解就是针对微控制领域而设计的Linux 系统.
uClinux 以其优异的性能、免费开放的代码等优点,博得众多嵌入式开
发者的青睐,和过去基于简单RTOS 甚至没有使用任何操作系统的嵌入式程序设计相比,基于Linux 这样的成熟的,高效的、健壮的、可靠的、模块化的、
易于配置的操作系统来开发自己的应用程序,无疑能进一提高效率,并具有很
好的可移植性。
基于UCLINUX 的嵌入式系统开发涉及到三个方面:开发环境
的建立,配置UCLINUX 内核和bootloader 以及应用程序的设计,本文将从这
几个方面来阐述的基于UCLINUX 的嵌入式系统的设计。
2.开发环境的建立
开发环境的建立也就是工具链,设置工具链在主机机器上创建一个用于
编译将在目标上运行的内核和应用程序的构建环境?这是因为目标硬件可能没
有与主机兼容的二进制执行级别。
包括Gcc:编译器,可以做成交驻编译的形式,即在宿主机上开发编译目标上可运行的二进制文件。
Binutils:一些畏助工具,
包括objdump(可以反编译二进制文件),as(汇编编译器),id(连接器)等等。
Gdb:调试器,可使用多种交叉方式,gdb-bdm(背景调试工具), gdbserver(使用以太网络调试)。
Glibc-所有用户应用程序都将链接到的C 库。
避免使用任何C 库函数的内核和其它应用程序可以没有该库的情况下进行编译。
uCLinux开发介绍严永红Linux是当前一种非常受欢迎的操作系统,它与UNIX系统兼容,并开放源代码。
它包含所有现代操作系统所具有的一切特性,包括多任务,虚拟内存,代码共享,按需载入,内存管理,以及TCP/IP网络。
并且,它遵循POSIX标准,只要是遵循POSIX API的应用程序很容易被移植。
目前,随着嵌入式系统的蓬勃发展。
Linux也已对嵌入式系统的开发产生具大影响。
大多数流行的CPU都被移植上去,ARM, PowerPC , MIPS, 68K, SPARC, Alpha, SH 等等. 这些CPU都含有一种叫做内存管理单元(MMU)的硬件,来支持标准Linux所需要的虚拟内存。
但在嵌入式世界里,还有很多CPU是没有MMU的,象ARM7、68328等等。
uClinux 正是为了解决这种没有MMU的CPU而产生的。
在uCLinux这个英文单词中,u表示Micro,小的意思,C表示Control,控制的意思,连起来就是Micro-Control-Linux, ―运行在微控制器上的Linux.‖针对这种没有MMU的CPU架构,uCLinux采用了一种平板式(Flat)的内存模型来去除对MMU的依赖, 并且改变了用户程序的加载方式,开发了运用于uCLinux的C函数库--uCLibc. 由于这些变化,一般的Linux开发工具(例如GDB)在开发uCLinux时会碰到一些困难,包括内核的移植,驱动程序及应用程序的调试。
针对这样状况。
Hitool System公司开发了Hitool for uClinux开发套件,来帮助用户开发基于uClinux的系统。
Hitool for uClinux与其它的Linux开发工具相比,有几个优点:A.整个开发过程只在Windows环境下完成,包括内核的配臵、编译,应用程序的编译,文件系统的生成,内核的调试,用户程序的调试。
B.可以采用多种调试方式,既可以采用JTAG方式来调试,也可通过网口用Hitool自己的监控程序(MDB)来调试。
通过JTAG方式, 调试可以调试内核和驱动程序, 也同时可以调应用程序. 一般的开发工具做不到这一点。
对于那些只要调试应用程序的客户, 就可以采用MDB的方式.采用这种方式,你不但不需要仿真器,而且在调试一个应用时,不会影响别的应用的运行。
C.提供了一个内核的追踪工具(Trace)来帮助用户分析整个系统。
在本章中,我们将结合这个工具来对uClinux做一些介绍。
(在现在Hitool for uClinux 套件中,提供对两种ARM-7评估板的支持,一个是Micetek的EV4.0,采用Atmel40800 CPU).另一种是Micetek的EV4510b,采用Samsung的4510b CPU。
一uClinux 简介目前,uClinux往往基于两个linux内核版本,2.0.38 是一个比较成熟的版本,2.4.x 是最新的版本. Hitool 套件同时提供了对他们的支持.一般uClinux的内核大小在500k左右,如果加上一些基本的应用,也就在900k左右.非常适合于嵌入式系统.uClinux架构如图1所示,一些重要的模块在下面描述:图1: uClinux架构1.(启动过程)BootstrapBootstrap负责用来起动Linux内核,包括chip Selector初始化,系统堆栈的初始化,把压缩的Linux映像从Flash中解压到RAM中,并把控制权交给内核的初始化例程。
这部分工作是与你的硬件高度相关的,所以这部分的代码要尽量精简。
2.内核初始化(Kernel Initialization)内核初始化的入口地址是:start_kernel(在init/main.c中), 它初始化内核的其它部分,包括异常(trap)、中断(IRQ)、内存页(Page)、调度(Scheduling)、驱动程序等等。
并启动“init”进程进入多任务环境。
3.系统调用处理/异常处理:当“init‖程序运行后,内核对整个系统的运行不再进行直接控制,而是通过系统调用给应用程序提供服务和响应外部及内部的异步事件,例如:程序错误,硬件中断等。
用户程序如果想得到系统资源,必须通过系统调用.当用户进程发生中断后,内核获得控制权,取得系统调用的参数,并调用相应的处理程序,而用户一直被挂起,直到内核完成处理并返回.在ARM中,系统调用采用swi指令所产生的软件异常来实现,如例所示: swi 0x90004(其中0x900004表示这个系统调用为sys_write)。
00002550 <write>:2550: ef900004 swi 0x009000042554: e3700a01 cmn r0, #4096 ; 0x10002558: 2afff6b0 bcs 20 <\<>__syscall_error<\>>255c: e1a0f00e mov pc, lr4.驱动程序(Device Driver):驱动程序是整个Linux内核的主要组成部分,它们控制着操作系统和外部设备的交互.例如,串口驱动程序(arch/armnommu/mach-atmel/…….)处理由外部UART发生中断. Linux的驱动程序是可选的, 但是典型的系统应该包括一个控制台(Console),一个通用串口驱动程序,一个块设备驱动程序(用来存放根文件系统)。
当Linux内核起动的时候,需要一个输出调试信息的设备。
这个设备往往通过串口来实现。
这个调试终端可以通过register-console 这个函数来创建.而所有的调试信息都通过Printk例程通过这个调试终端来输出.5.文件系统(File System)支持多种文件系统是Linux一个重要的特性,uClinux同样把这一特性带进了嵌入式系统中,并针对嵌入式系统作了一些取舍。
在Hitool for uClinux 包括了ROMFS, Ext2 FS, RAM FS, NFS . 其中,ROMFS 是最简单的只读文件系统,所占用的空间最少,我们用它来做根文件系统(root filesystem). 根文件系统里存放linux启动时要用到的设备文件,配臵文件,和应用程序,例如:/dev/tty0, /etc/rc , /bin/init ,/bin/sh, 等等。
6.内存管理uClinux不能使用处理器的虚拟内存管理技术但仍然采用存储器的分页管理,系统在启动时把实际存储器进行分页。
在加载应用程序时程序分页加载。
但是由于没有MMU 管理,所以实际上uClinux采用实存储器管理策略(物理内存)。
这一点影响了系统工作的很多方面。
uClinux系统对于内存的访问是直接的,(它对地址的访问不需要经过MMU,而是直接送到地址线上输出),所有程序中访问的地址都是实际的物理地址。
操作系统对内存空间没有保护(这实际上是很多嵌入式系统的特点),各个进程实际上共享一个运行空间(没有独立的地址转换表)。
一个进程在执行前,系统必须为进程分配足够的连续地址空间,然后全部载入主存储器的连续空间中。
与之相对应的是标准Linux系统在分配内存时没有必要保证实际物理存储空间是连续的,而只要保证虚存地址空间连续就可以了。
另外一个方面程序加载地址与预期(ld文件中指出的)通常都不相同,这样重定位的过程就是必须的。
uClinux对内存的管理减少同时就给开发人员提出了更高的要求。
如果从易用性这一点来说,uClinux的内存管理是一种倒退,退回到了Dos时代。
开发人员不得不参与系统的内存管理。
从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少的内存(假如你欺骗了系统,那将在后面运行程序时受到惩罚),从而系统将在启动的初始化阶段对内存进行分页,并且标记已使用的和未使用的内存。
系统将在运行应用时使用这些分页内存。
由于应用程序加载时必须分配连续的地址空间,所以开发人员在开发应用程序时必须考虑内存的分配情况并关注应用程序需要运行空间的大小。
另外由于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常。
从内存的访问角度来看,开发人员的权利增大了(开发人员在编程时可以访问任意的地址空间),但与此同时系统的安全性也大为下降。
此外,系统对多进程的管理将有很大的变化,这一点将在uClinux的多进程管理中说明。
虽然uClinux的内存管理与标准Linux系统相比功能相差很多,但应该说这是嵌入式设备的选择。
在嵌入式设备中,由于成本等敏感因素的影响,普遍的采用不带有MMU 的处理器,这决定了系统没有足够的硬件支持实现虚拟存储管理技术。
从嵌入式设备实现的功能来看,嵌入式设备通常在某一特定的环境下运行,只要实现特定的功能,其功能相对简单,内存管理的要求完全可以由开发人员考虑。
7.进程管理uClinux 和Linux之间最大的区别在于平面存储器模型。
没有虚拟存储器可以提供非常有效的fork 系统调用.由于在使用fork时,内核会将父进程拷贝一份给子进程,但是这样的做法相当浪费时间,因为大多数的情形都是程序在调用fork后就立即调用exec,这样刚拷贝来的进程区域又立即被新的数据覆盖掉。
因此Linux系统提供一个系统调用vfork,vfork假定系统在调用完成vfork后会马上执行exec,因此vfork不拷贝父进程的页面,只是初始化私有的数据结构与准备足够的分页表。
这样实际在vfork 调用完成后父子进程事实上共享同一块存储器(在子进程调用exec或是exit之前),因此子进程可以更改父进程的数据及堆栈信息,因此vfork系统调用完成后,父进程进入睡眠,直到子进程执行exec。
并且在这段时间内,子进程不能更改数据段和堆栈的内容.当子进程执行exec时,由于exec要使用被执行程序的数据,代码覆盖子进程的存储区域,这样将产生写保护错误(do_wp_page)(这个时候子进程写的实际上是父进程的存储区域),这个错误导致内核为子进程重新分配存储空间。
当子进程正确开始执行后,将唤醒父进程,使得父进程继续往后执行。
所以,在uClinux中,想让父子进程同时运行同一个程序是不可以的.8.运行时间库(C Runtime Lib)及应用程序运行时间库提供了用户程序和内核程序的接口。
尽管许多人认为他们的系统是Linux 系统(指运行内核),但大部分系统的性能不是由内核决定的,而是由C时间库决定的。
例如,运行时间库将一条ptrintf语句转换为一个系统调用(sys_write),将输出发送到标准输出上。