嵌入式系统程序设计大连理工大学软件学院嵌入式系统工程系赖晓晨uClinux操作系统原理介绍uClinux简介uClinux架构BusyBox工具集★★★★一、uClinux简介uClinux是Linux的一个分支,全称MicroControlLinux,即“微控制领域的linux系统”,是GNU项目,代码完全开放。uClinux采用flat(平面型)内存模型,专门应用于没有MMU的CPU。使用的Romfs文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟ram盘的方法进行处理(ram盘将采用ext2文件系统)。uClinux的历史发展1998年1月uClinux发行第一版,该版本基于PalmPDA实现;1999年2月份成功移植到Motorola的ColdFire系列处理器MCF5206和MCF5307;uClinux发行至今已经历多个版本,最常用的版本为uClinux-dist-20040408;目前的uClinux不仅支持NOMMU处理器,同时也支持MMU处理器,包括ARM、MIPS、sh、68K、x86甚至SPARC等高性能处理器,并在60个以上基于这些处理器的开发平台成功实现。uClinux内核及版本uClinux基于linux内核版本。2.0.38:比较成熟。2.4.x:常用版本2.6.x:最新版本uClinux内核大小约500k,如果加上一些基本应用,不超过900k,很适合嵌入式系统。uClinux的特点广泛的处理器结构和硬件平台支持:基于Linux-2.4.x内核的uClinux,支持19种处理器结构,并在60种以上的硬件开发平台成功实现。完全的Linux内核的特性:uClinux具备标准Linux系统的稳定性,并且支持linux内核约定的全部的特性,包括内核优先级特性以及许多的文件系统,设备驱动。uClinux的特点(续)占用空间小:uClinux内核不超过512KB,加上工具不超过900KB。UClinux是一个高度可定制化的内核,通过定制内核可以获得到一个300k以下的可固化的内核压缩镜像,包括终端和一些基本的设备驱动以及只读文件系统。uClinux的特点(续)重写了标准c函数库:uClinux系统中所有应用程序使用了嵌入式的标准C函数库uClibc或uC-libc,该函数库精简了Linux系统中的标准函数库libc。uClinux的特点(续)丰富的应用软件:uClinux发布包中有大量的应用程序,包括各种网络协议、服务,图形界面,音频播放软件等等。除少数情况外,在uClinux平台上可完全使用Linux应用程序接口,因此,用户可以移植Linux上的应用程序到uClinux系统。除了与硬件相关代码和转换虚拟地址到物理的内存镜像外,几乎所有的代码不需要改变就可以编译。uClinux的特点(续)低廉的成本:软件方面,自由开放的系统、开发工具和大量应用程序,可以节省用户的开发投入。硬件方面,内存管理单元MMU核心大小约占典型的ARMSoC(System-on-Chip单片机)晶体的30%,典型的网络和嵌入式系统里有一半以上的应用程序不需要MMU。uClinux的特点(续)开源软件:源代码开放使用户得以跟踪和定制最核心和底层的代码以满足用户系统的需求。同时自由软件生命力强大,不断升级的新版本以及强大的网上技术支持给用户产品的维护和升级带来很大的方便。完美的文件系统:uClinux支持一般的文件系统如NFS,EXT2,FAT16/32等,同时更支持专为嵌入式系统设计的ROMFS、JFFS文件系统,在通常应用中,更多的使用后面的文件系统。uClinux小型化方法采用romfs文件系统。romfs文件系统比ext2需要更少的代码;romfs文件系统相对简单,超级块(superblock)需要更少的存储空间。重写了应用程序库,相对于越来越大且越来越全的glibc库,uClibc对glibc做了精简。uClinux的实时性问题uClinux本身并没有关注实时问题,它并不是为了Linux的实时性而提出的。另外有一种Linux--Rt-linux关注实时问题。Rt-linux执行管理器把普通Linux的内核当成一个任务运行,同时还管理了实时进程。而非实时进程则交给普通Linux内核处理。uClinux可以使用Rt-linux的patch,从而增强uClinux的实时性,使得uClinux可以应用于工业控制、进程控制等一些实时要求较高的应用。且保持了与标准linux的兼容。运行uClinux的硬件平台运行uClinux的硬件平台主要包括如下几个部分:cpu(ARMv4指令集兼容)Uartmemorycontroller定时器flash存储器,sdram存储器中断控制器和DMA。uClinux的开发环境宿主机运行linux操作系统,或使用cygwin模拟linux操作系统宿主机安装GNU开发套件Gcc、Binutils、Gdb:arm-elf-gcc…uClinux的打印终端:uClinux的默认终端是串口,内核在启动时所有的信息都打印到串口终端(printk函数),也可以通过串口终端与系统交互。uClinux在启动时启动了telnetd,操作者可以远程登录上系统,从而控制系统的运行。uClinux系统组成一个基于uClinux的完整的嵌入式系统由三个部分组成:系统引导程序、uClinux操作系统内核和文件系统。bootloaderOS内核文件系统uClinux系统的存储空间映像RAM系统引导程序系统引导程序通常称为BootLoader,是在任何硬件平台上执行的第一段代码,相当于PC上的BIOS,主要负责系统初始化工作,然后将系统控制权交给操作系统,控制权交给操作系统后,系统的运行和BootLoader再无任何关系。uClinux的发行包中不包含BootLoader,BootLoader必须由用户自己设计,但用户可以直接使用或参考一些开源的BootLoader软件工程。BootLoader的大小由其设计功能所决定,最小只有几K字节,功能复杂的一般也不超过100K字节。操作系统内核uClinux操作系统内核,完成的功能和大家熟悉的Linux内核相同,包括进程调度、内存管理、文件系统管理、网络接口和进程间通信。使用未压缩的系统内核,一般要占用400K字节到900K字节空间,如果是压缩后的系统内核,则占用空间一般在300K字节到500K字节之间。文件系统文件系统主要存储用户应用程序,同时包括系统配置文件、系统程序和必需的驱动程序,其占用空间由用户的应用程序规模决定,从200K字节到1M字节不等。可执行文件格式coff(commonobjectfileformat):一种通用的对象文件格式elf(excutivelinkedfile):一种为Linux系统所采用的通用文件格式,支持动态连接flat:elf格式有很大的文件头,flat文件对文件头和一些段信息做了简化uClinux应用程序格式uClinux采用flat可执行文件格式,可以使用elf2flt工具把elf格式可执行文件转换为flat格式文件。应用程序在连接时并不知道将来要在系统的哪一段内存上运行,因此要求在任何地址都能运行,要做到地址无关(PIC:positionindependentcode)。flat(扁平)格式二、uClinux内核架构文件系统模块文件系统内核初始化启动模块系统调用处理程序(systemcallhandler)进程调用驱动程序虚拟文件系统管理模块块设备驱动字符设备驱动海量设备驱动Socket驱动程序网络模块网络设备驱动程序IPC模块MM模块异常处理C运行库内存管理:先看一下标准linux的内存管理。它至少实现了以下功能:运行比内存还要大的程序。理想情况下应该可以运行任意大小的程序可以运行只加载了部分的程序,缩短了程序启动的时间可以使多个程序同时驻留在内存中提高CPU的利用率可以运行重定位程序。即程序可以位于内存中的任何一处,而且可以在执行过程中移动。uClinux的内存管理内存管理:先看一下标准linux的内存管理。它至少实现了以下功能:代码机器无关。程序不必事先约定机器的配置情况。减轻程序员分配和管理内存资源的负担。可以进行代码共享。例如,如果两个进程运行同一个程序,它们应该可以共享程序代码的同一个副本。提供内存保护,内核保护单个进程的数据和代码以防止非授权进程修改它们。否则,用户程序可能会偶然(或恶意)的破坏内核或其它用户程序。uClinux的内存管理(续)虚存系统并不是没有代价的。内存管理需要地址转换表和其他一些数据结构,留给程序的内存减少了。地址转换增加了每一条指令的执行时间,而对于有额外内存操作的指令会更严重。当进程访问不在内存的页面时,系统发生失效。系统处理该失效,并将页面加载到内存中,极耗时间的磁盘I/O操作。总之内存管理活动占用了相当一部分cpu时间(在较忙的系统中大约占10%)。uClinux的内存管理(续)内存管理1.uClinux不使用虚拟内存管理技术,但内存仍然分页(4k页面),采用实存储器管理策略,对内存的访问直接使用物理地址。2.进程运行前,必须分配足够的内存页,然后把程序全部载入内存,这与采用虚存的linux有明显不同,是一种倒退。uClinux的内存管理(续)内存管理3.操作系统对内存没有保护,各个进程(包括内核进程)共享同一个内存地址空间,开发人员权限增大,系统的安全性降低。4.开发人员要参与内存管理,从编译内核开始,要告诉系统开发板上都有哪些内存,供系统使用前作出标记。仍然是一种倒退。uClinux内核架构分析(续)三、BusyBox工具集BusyBox是很多标准Linux工具的一个单个可执行实现,它包含了一些简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet(不过它的选项比传统的版本要少);有些人将BusyBox称为Linux工具里的瑞士军刀。BusyBox的诞生BusyBox最初是由BrucePerens在1996年为DebianGNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的GNU/Linux系统,这可以用作安装盘和急救盘。一张软盘可以保存大约1.4-1.7MB的内容,因此这里没有多少空间留给Linux内核以及相关的用户应用程序使用。因此他编写了BusyBox。BusyBox的启示BusyBox揭露了这样一个事实:很多标准Linux工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如grep和find)都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,它们就可以共享这些相同的元素,这样可以产生更小的可执行程序。公共部分catlstftp$tftp$ls$cat$BusyBoxBusyBox对shell命令的精简实际上,BusyBox可以将大约3.5MB的工具包装成大约200KB大小。这就为可引导的磁盘和使用Linux的嵌入式设备提供了更多功能。我们可以对2.4和2.6版本的Linux内核使用BusyBox。BusyBox执行原理BusyBox使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于BusyBox中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用BusyBox了。BusyBox然后可以通过argv[0]来调用内部工具。BusyBox执行原理——示例//test.c#includestdio.hintmain(intargc,char*argv[]){inti;for(i=0;iargc;i++){printf(argv[%d]=%s\n,i,argv[i]);}return0;}$gcc-Wall-otesttest.cBusyBox执行原理——示例(续)$./testarg