基于Linux嵌入式操作系统的研究
- 格式:pdf
- 大小:137.71 KB
- 文档页数:5
嵌入式Linux操作系统的研究作者:陈国强来源:《计算机光盘软件与应用》2014年第01期摘要:随着当前计算机技术的不断发展,嵌入式系统应用领域越来越广泛,尤其是Linux 操作系统在产业发展中起着举足轻重的作用。
Linux操作系统内核具备进程管理、文件管理、储存管理以及内核调度等功能,同时基于Linux应用环境前提下,在不同系统芯片硬件平台上,嵌入式Linux操作系统能够实现运行,通过进程调度以及文件设计等模块满足不同开发板与应用需求。
本文主要通过介绍嵌入式Linux操作系统的基本功能,从而具体阐述嵌入式Linux操作系统的设计。
关键词:操作系统;Linux;嵌入式操作系统中图分类号:TP316嵌入式操作系统作为嵌入式系统的关键内容,通过控制系统资源,提供开发应用程序,体现了嵌入式系统的外在功能。
笔者综合自身多年来的实践经验,结合嵌入式Linux操作系统的功能以及机理,详细研究与分析其在嵌入式领域应用的完善方法。
1 嵌入式Linux操作系统概述1.1 嵌入式系统内涵。
嵌入式系统在发展初期主要是以微处理器的形式而存在的,随着科学技术的不断发展,嵌入式系统已经渗透到了人们的工作、生活以及娱乐等方方面面。
从本质上来讲,嵌入式系统将复杂的软件与硬件进行紧密耦合,从而形成一个全新的计算机系统。
“嵌入式”即在各个完整的系统中吸纳一部分优越系统,将这些系统进行整合。
而就这些嵌入的系统本身而言,一般存在多种嵌入式系统。
在现阶段,随着微处理器制造技术的深入发展,嵌入式处理器制造取得了巨大的发展。
在系统硬件上,主要考虑价格、性能以及能耗等因素,其关键部分是应用软件与系统软件。
但是由于储存空间存在局限性,因此嵌入式系统对实时性要求越来越严格。
1.2 嵌入式Linux操作系统。
Linux主要是指开放源代码,一般包括四个方面:一是内核,二是系统工具,三是开发环境,四是Unix类操作系统。
Linux作为一个现代操作系统,其性能可靠、稳定,主要具备七个特征:第一,满足国际通用标准规范;第二,具有可移植性,灵活性强;第三,整个系统性能卓越;第四,在某种程度上动态链接能力强;第五,系统网络特征鲜明;第六,兼容性强大;第七,系统能够包容大容量用户,任务能力优越。
嵌入式实验报告:学号:学院:日期:实验一熟悉嵌入式系统开发环境一、实验目的熟悉Linux 开发环境,学会基于S3C2410 的Linux 开发环境的配置和使用。
使用Linux的armv4l-unknown-linux-gcc 编译,使用基于NFS 方式的下载调试,了解嵌入式开发的基本过程。
二、实验容本次实验使用Redhat Linux 9.0 操作系统环境,安装ARM-Linux 的开发库及编译器。
创建一个新目录,并在其中编写hello.c 和Makefile 文件。
学习在Linux 下的编程和编译过程,以及ARM 开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
三、实验设备及工具硬件::UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机Pentium 500 以上, 硬盘10G 以上。
软件:PC 机操作系统REDHAT LINUX 9.0+超级终端(或X-shell)+AMR-LINUX 开发环境。
四、实验步骤1、建立工作目录[rootlocalhost root]# mkdir hello[rootlocalhost root]# cd hello2、编写程序源代码我们可以是用下面的命令来编写hello.c的源代码,进入hello目录使用vi命令来编辑代码:[rootlocalhost hello]# vi hello.c按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按Esc 键进入命令状态,再用命令“:wq!”保存并退出。
这样我们便在当前目录下建立了一个名为hello.c的文件。
hello.c源程序:#include <stdio.h>int main() {char name[20];scanf(“%s”,name);printf(“hello %s”,name);return 0;}3、编写Makefile要使上面的hello.c程序能够运行,我们必须要编写一个Makefile文件,Makefile文件定义了一系列的规则,它指明了哪些文件需要编译,哪些文件需要先编译,哪些文件需要重新编译等等更为复杂的命令。
嵌入式操作系统Linux实验报告专业:计算机科学与技术班级:13419011学号:1341901124姓名:武易组员:朱清宇实验一Linux下进程的创建一实验目的1.掌握Linux下进程的创建及退出操作2.了解fork、execl、wait、waitpid及之间的关系二实验内容创建进程,利用fork函数创建子进程,使其调用execl函数,退出进程后调用wait或waitpid清理进程。
三实验过程1.进程的创建许多进程可以并发的运行同一程序,这些进程共享内存中程序正文的单一副本,但每个进程有自己的单独的数据和堆栈区。
一个进程可以在任何时刻可以执行新的程序,并且在它的生命周期中可以运行几个程序;又如,只要用户输入一条命令,shell进程就创建一个新进程。
fork函数用于在进程中创建一个新进程,新进程是子进程。
原型如下:#include<sys/types.h> /* 提供类型pid_t的定义 */#include<unistd.h> /* 提供函数的定义 */pid_t fork(void);使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间fork系统调用为父子进程返回不同的值,fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:在父进程中,fork返回新创建子进程的进程ID;✓在子进程中,fork返回0;✓如果出现错误,fork返回一个负值;用fork创建子进程后执行的是和父进程相同的程序,子进程可以通过调用exec函数以执行另一个程序。
当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程(例如其m a i n函数)开始执行。
调用e x e c并不创建新进程,进程I D并未改变,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段。
e x e c函数原型execl,execlp,execle,execv,execve和execvp2.进程的退出一个进程正常终止有三种方式:由main()函数返回;调用exit()函数;调用_exit()或_Exit()函数。
基于Linux 嵌入式操作系统的研究李红卫1,潘瑜1,王树亮2,薛小锋1(1.江苏技术师范学院计算机科学与工程学院,江苏常州213001;2.江苏技术师范学院图书馆,江苏常州213001)摘要:从Linux内核实时性、实时调度策略以及时钟细粒度定时器三个方面,对Linux嵌入式实时化技术进行了探讨。
在内核中插入抢占点或采用双内核系统,改善Linux的实时性能;通过动态优先级提高实时任务的调度性能;通过增加时钟中断频率或采用实时时钟一次性模式,实现时钟细粒度。
关键词:Linux;嵌入式系统;实时性;进程调度中图分类号:TP316.2文献标识码:A0引言嵌入式系统是集软硬件于一体可独立工作的计算机系统,它通常是更大系统中一个完整的部分[1]。
在早期的嵌入式系统设计中一般不包含操作系统,但当系统越来越复杂、应用范围越来越广泛时,没有操作系统已成为系统开发的最大障碍;因此,在嵌入式系统的发展中,出现了各种各样的商用嵌入式操作系统。
嵌入式操作系统的出现改变了以往嵌入式软件设计只能针对具体的应用从头做起,使嵌入式系统的开发方法更具科学性;同时,采用嵌入式操作系统提高了系统的开发效率,减少了开发的工作量,增强了软件的可移植性。
操作系统成为嵌入式系统的核心,是一个时代的特征,也是嵌入式系统从简单的单片机、微处理器走向愈来愈复杂的嵌入式SOC和CPU的自然体现[2]。
开源Linux操作系统的出现,给嵌入式操作系统的发展带来生机,将Linux应用于嵌入式系统开发环境中已十分广泛;但就目前而言,嵌入式Linux的研究成果与市场的真正需求仍有一段差距,还需要在嵌入式Linux系统的实时性、进程调度等方面对其进行不断的改进和完善。
1改造Linux为嵌入式操作系统的分析实时系统最重要的特征是实时性,实时性是指系统对外部事件的响应和处理要在一个给定的时间内完成,即计算必须在到达死线(deadline)前完成[1]。
根据丢失死线的容忍程度可将实时系统分为硬实时系统和软实时系统:硬实时系统必须保证任务在到达死线之前完成,丢失死线将会引发灾难;软实时系统能保证任务在死线之前完成,但死线的丢失并不会带来致命的错误。
在大多数嵌入式系统应用中往往要求系统具有实时性。
虽然Linux是一个分时操作系统,但其符合POSIX1003.1b关于实时扩展部分的标准,尤其Linux2.6的推出给嵌入式系统以及实时系统的应用带来生机。
将Linux改造为嵌入式实时操作系统具有(1)Linux功能强大、(2)开放源码、(3)支持多种硬件平台、(4)收稿日期:2006-02-21;修回日期:2006-04-03基金项目:江苏技术师范学院科研基金资助项目(KYY04001)作者简介:李红卫(1966-),男,山西阳城人,江苏技术师范学院计算机科学与工程学院副教授。
JOURNALOFJIANGSUTEACHERSUNIVERSITYOFTECHNOLOGY江苏技术师范学院学报Apr.,Vol.12,No.220062006年4月第12卷第2期模块化设计、(5)函数接口符合国际和工业标准等优点[3],但同时也存在一些缺点;Linux毕竟是一个分时系统,在实时性方面无法与商用实时操作系统相比,仍然存在很大差距。
(1)Linux提供的是一种软实时调度算法[4],它对实时任务的调度不做任何保证。
在实现调度算法时,Linux注重的是公平、合理的调度策略,对实时进程采用了基于优先级的先进先出算法和基于优先级时间片轮转算法,这两种调度算法均按静态优先级对实时进程进行调度。
(2)Linux2.6采用了内核可抢占式调度方式,但它的实现仅仅是在内核中增加了抢占点,抢占点设在中断处理程序即将结束时或系统调用即将结束时。
对于强实时系统来说,一旦高优先级的任务进入就绪队列,应立即获得处理机,而调度程序schedule()通常是在中断处理程序结束或系统调用结束时,才有机会运行。
如果中断处理时间过长(中断嵌套)或系统调用占用时间过长,都会延误实时任务的执行;只有保证中断处理程序和系统调用执行时间在一个可控的范围内,才能保证实时任务的正确执行。
(3)时钟粒度粗糙。
时钟中断是驱动操作系统运作的最基本的动力源,系统用它来维持系统时间,监督进程运行,引起进程调度。
进程状态的转变在很多情况下也是由时钟中断直接或间接引起的。
虽然Linux2.6在i386体系结构中时钟粒度定义为1ms,但在其他大多数体系结构(比如ARM)中,时钟粒度仍然定义为10ms,而实时应用一般都需要微秒级的响应精度,10ms的时钟粒度远不能满足实时应用的要求。
综上所述,改造Linux为嵌入式操作系统,可从实时性、进程调度程序、时钟粒度着手进行研究与实现。
2Linux嵌入式操作系统的实时化2.1双内核结构实时化Linux可有多种实现方案,许多研究项目都在进行Linux方面的实时化改造。
采用双内核结构是实时化Linux常用的方案,它是在原有的Linux和硬件之间设计一个专门用于处理实时进程的实时内核,Linux作为此内核的一个优先级最低的任务运行,实时任务在实时内核上运行,非实时任务则在Linux内核上运行。
该方案的结构如图1所示。
这类方案的优点是对Linux内核的改动较小,实现了硬实时和内核可抢占。
采用这种结构的有NewMexicoInstituteofTechnogy的RT-Linux、意大利的RTAI、我国信息产业部基金资助的SOPCA[5]等。
其中RT-Linux开创了Linux硬实时支持的先河。
RTAI的设计更科学,它在硬件与实时内核之间增加了一层实时硬件抽象层RTHAL(real-timehardwareabstractionlayer)。
RTHAL将RTAI需要在Linux中修改的部分定义成一组程序界面,RTAI只使用这组界面与Linux沟通,这样,可以把对内核源码的改动降低到可以控制的程度,使内核移植更便捷。
特别是在最新版本的RTAI中采用了ADEOS(adaptivedomainenvironmentforoperatingsystems)超微内核(ADEOSnanokernel)技术[6],极大地提高了系统的可靠性,也为嵌入式应用方面提供了可抢占的、可伸缩的实时服务。
采用双内核结构支持实时系统的设计方案同样也存在一些缺点[3],所有实时任务都必须用内核模块的格式编写,从而导致实时应用的开发变得非常复杂,要求用户必须熟悉Linux内核和设备驱动程序的设计。
另外一个重要隐患就是,由于实时任务在核心态中运行,没有对内存进行保护,不当的编程可能会导致内核的崩溃;同时,实时程序的调试也很困难。
2.2直接修改Linux内核这类方案的共同点是直接修改内核,主要方法是对它的数据结构、调度函数、中断方式等进行修改,提供适应于实时系统的调度策略、提供细粒度的定时器和增加内核抢占点等,使其能处理实时进程。
典型实例是MontaVista公司的MontaVistaLinux、CELF组织的CELinux和加州大学Irvine分校开发的RED-Linux。
MontaVistaLinux采用标准Linux内核,针对嵌入式设备定制专用的嵌入式操作系统,根据应非实时任务实时任务计算机硬件实时内核Linux内核图1双内核结构Fig.1StructureofTwoKemels江苏技术师范学院学报52第12卷用需求及嵌入式系统资源有限的情况,对内核进行裁减、配置,保证系统稳定,性能突出。
在实时性能方面,它提供一个基于优先级的实时调度器。
对于无实时需求的进程,仍按Linux原有进程调度策略进行调度;对于实时进程,则按照优先级驱动的原则进行调度,实现了一定的抢占式内核。
RED-Linux是在Linux内核的很多函数中插入了抢占点,使得进程在内核态时可以被抢占,从而减小内核的抢占延迟。
另外,RED-Linux的调度器被分为两个构件:分派器(dispatcher)和分配器(allocator)。
分配器是一个由用户创建的用户实时进程,在用户态执行,它负责将应用程序的资源请求转换成内核可以理解的形式。
分派器作为一个内核模块存在,可动态加载并在内核态执行。
实时任务先在分配器中注册自己的调度函数参数,再由分派器调度。
用这种方法,调度策略易于修改。
采用直接修改Linux内核方案的优点是能够充分利用Linux本身所提供的各种功能和服务,系统结构清晰,能够支持众多硬件平台,可以很好地将嵌入式与实时性结合。
它的缺点是实时性能不及双内核方式高,另外直接修改Linux内核源代码进行实时化的工作量大,还可能影响系统的稳定性。
采用该方案的大多数嵌入式Linux内核是不可完全被抢占的,所以只能作为一种软实时方案。
3Linux嵌入式调度算法的优化进程调度的研究是整个操作系统理论的核心[7],在嵌入式操作系统中也不例外。
实时调度算法大致可分为三种:基于优先级的调度算法、基于时间驱动的调度算法和基于比例共享的调度算法[8]。
在Linux内核中调度算法是以优先级驱动的,即调度原则是按优先级的大小决定,并实现了三种调度策略,其中SCHED_FIFO和SCHED_RR应用于实时任务,SCHED_NORMAL应用于非实时任务,实时任务的优先级高于非实时任务的优先级。
SCHED_FIFO指当优先级相同时,按先进先出算法进行调度,它不使用时间片,适合于时间性要求比较强、但每次运行所需时间比较短的进程,采用该策略的进程获得CPU后,除非有更高优先级进程申请运行外,否则该进程将保持运行至退出或自愿放弃CPU;SCHED_RR指优先级相同时按时间片轮转算法进行调度;SCHED_NORMAL是基于优先级按时间片轮转算法进行调度,与SCHED_RR调度策略相似,所不同的是SCHED_RR采用静态优先级对实时任务进行调度,SCHED_NORMAL采用动态优先级对非实时任务进行调度。
因为,实时任务的优先级在运行过程中保持不变,非实时任务的优先级随进程的运行时间、等待时间、是否为交互式进程而动态改变。
在实时系统中,往往要求系统对外部事件的响应和处理要在一个给定的时间内完成,系统输出的正确性不仅依赖于计算的逻辑结果而且依赖于结果产生的时间。
随着时间的变化,实时任务的紧迫程度也在变化。
在基于优先级的调度算法中,实时进程的优先级如果能随着时间的变化而动态地改变,就能客观地反映出实时任务的紧迫程度。
显然,Linux对实时任务按静态优先级进行调度的策略在满足实时性要求时存在瑕疵。
在实时操作系统中,常常面临的另一个问题是优先级反转[9],可描述如下:当高优先级的任务获得运行资格后,发现它所需要的共享资源被某低优先级的任务占用,则该高优先级任务被阻塞;而该低优先级的任务又被中等优先级的任务强占而无法运行,致使高优先级的任务在有效时间内无法获得被低优先级任务所占用的共享资源而迟迟不能运行。