




已阅读5页,还剩54页未读, 继续免费阅读
(计算机软件与理论专业论文)基于嵌入式组件技术的操作系统微内核技术研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 摘要 论文首先针对嵌入式应用多样化的特点分析了对嵌入式操作系统的基本要 求,然后阐述了微内核结构的优点并详细分析了设计微内核体系结构时需要解 决的主要问题。 在详细分析微内核设计过程中需要解决的主要问题的基础上,论文提出了 一个通用的具有微内核结构的嵌入式操作系统,不但能快速地响应设备的请求。 而且具有良好的调度特性,并为进程提供了多种通信方式以满足不同的通信需 求。在阐述现有微内核设计方案的同时,论文还给出了进一步提高嵌入式系统 实日, j - 性的若干方法。 多进程操作系统中最核心、最频繁的操作就是进程的上下文切换。针对 n | c 6 8 v z 3 2 8 硬件平台的特性,论文中详细讨论了在上下文切换时操作硬件的具 体步骤和细节。在其它嵌入式平台上实现上下文切换时很可能需要面对同样的 问题,因此相关具体步骤和细节的讨论具有广泛的指导意义和实际应用价值。 使用组件来实现嵌入式系统可以进一步提高嵌入式系统的可移植性、可定 制性并为在嵌入式系统上实现分布式应用提供有力支持。论文的最后探讨了实 现基于组件技术的嵌入式操作系统的若干问题,提出了一种适用于嵌入式环境 的简化了的组件规范,并按照该规范使用组件技术在m c 6 8 v z 3 2 8 平台上实现了 嵌入式操作系统的微内核。 关键字:嵌入式系统,微内核,嵌入式组件规范 a b s t r a c t e m b e d d e do sh a sb e e nc h a l l e n g e dt o a c q u i r ef e a t u r e so fe x t e n s i b i l i t y ,f l e x i b i l i t y a n dp o r t a b i l i t yi no r d e rt ob ea p p l i e dt od i v e r s i f i e de m b e d d e da p p l i c a t i o n s ,w h i c h c a nb eo b t a i n e db y a d o p t i n g am i c r o k e m e la r c h i t e c t u r e t h et h e s i sf i r s t l yp r e s e n t sa t h o r o u g ha n a l y s i so f m a t t e r sn e e dt ob ed e a l tw i t hw h e n c l e s l g n l n gm l c r o k e r n e la r c h i t e c t u r e ,t l a c np r o p o s e sag e n e r a l p u r p o s em i c r o k e m e l a r c h i t e c t u r ei ne m b e d d e do s ,w h i c hc a nn o t o n l yr e s p o n dq u i c k l yt oe x t e r n a l d e v i c e s ,b u t a l s o s a r i s 巧t h er e q u i r e m e n t s o fr e a l - t i m e s c h e d u l i n ga n de n a b l e p r o c e s s e st oc o m m u n i c a t ew i t he a c ho t h e rt h r o u g he v e n t s ,m e s s a g e so rs i g n a l s m e c h a n i s m s n e x t ,s e v e r a la p p r o a c h e sh a v eb e e n b r o u g h t f o r w a r dt of u r t h e r e n h a n c et h er e a l t i m ep e r f o r m a n c eo fe m b e d d e do s t h em o s tf u n d a m e n t a la n de s s e n t i a lr e s p o n s i b i l i t yo f am u l t i p r o c e s so sw o u l db e p r o c e s sm a n a g e m e n ta n ds w i t c h i n g ih et h e s i se l a b o r a t e so ne a c hs t e po fp r o c e s s s w i t c h i n gi nt h ec a s eo fm c 6 8 v z 3 2 8p l a t f o r m ,w h i c hb e a r sb o t ht h e o r e t i c a la n d p r a c t i c a lv a l u e sa n dc a nb eu s e da sa ni n s t r u c t i v er e f e r e n c ew h e ni m p l e m e n t i n g p r o c e s ss w i t c h i n gi nt h ec a s eo fo t h e re m b e d d e dp l a t f o r m s k e y w o r d :e m b e d d e d o s ,m i c r o k e r n e l ,c o m p o n e n t i i 舞嚣 一一一一 一一批一一 盘裟北 嚣一 舢啊趾劬临 咒5把孓强 淼冒一 m b m 巧罢监州 燕池吣 k 把1 2 她埘慨:曼哆|; 耋:星m蝴m乩 一!|一一一 第一章绪论 第一章绪论 1 - 1 研究意义 在当前数字信息技术和网络技术高速发展的后p c 时代,嵌入式系统已经广 泛地渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术以及人 们的日常生活等方方面面中。随着国内外各种嵌入式产品的进一步丌发和推广, 嵌入式技术越来越和人们的生活紧密结合,“一切皆嵌入”的时代已经到来。 嵌入式操作系统是内装于专用系统或设备中,具有通用操作系统的基本执 行计算和数据处理功能的操作系统。嵌入式应用的特点及其多样化的需求要求 嵌入式系统具有合理的体系结构和良好的可裁减性、可靠性和可移植性。 传统操作系统采用分层结构,系统至少被划分为内核层和应用层两个层次。 内核只提供基本的功能,如建立和管理进程、提供文件系统、管理设备等,这 些功能以系统调用方式提供给用户。一些桌面操作系统,女n w i n d o w s 、l i n u x 等, 将许多功能引入操作系统的内核,导致内核变得越来越大,剪裁起来很麻烦。 所以这样的分层结构并不能满足嵌入式系统的可裁减性及可定制性的要求。 在微内核结构中,微内核只提供基本的功能,比如:进程的调度、进程之 间的通信与同步、内存管理、时钟管理等。传统操作系统的其它功能,比如网 络功能、文件系统、分页机制、g u i 系统等均工作在用户念以服务器进程的方 式工作,用户可以根据具体应用的需要灵活地增加、删除相应的系统服务。同 时,所有与硬件平台相关的细节都封装在微内核中而与上层的系统服务和用户 进程解耦。这样只需要修改微内核就可以将系统移植到新的硬件平台上。另外, 由于系统服务均在用户态以服务器进程的方式工作,任何一个系统服务出现错 误都不会导致整个系统崩溃【l 。良好的可裁减性、可移植性和高可靠性使得微 内核结构能够充分地满足对嵌入式系统的要求。 本论文的研究目的之一就是提出一个通用的具有微内核结构的多进程的嵌 入式操作系统设计方案,并给出在m c 6 8 v z 3 2 8 硬件平台上的实现细节。 另外,组件技术是现在比较流行的软件开发方法。组件是在面向对象软件 开发方法的基础上逐渐发展起来的一种新技术。组件技术抽象了许多面向对象 技术的概念,是将面向对象技术应用于系统设计上的种自然延伸。采用组件 技术可以编写出高可靠性、可复用并且能够被灵活配置的软件,使得对已有应 用的升级更加方便灵活,而且能够方便地将已有应用转化为分布式应用。 本论文的另一研究目的就是探讨使用组件技术实现嵌入式系统时要解决的 若干问题,并制定出一种适用于嵌入式环境的简化了的组件规范。 1 2 问题分析 如上所述,本论文的研究目标就是要提出一个通用的具有微内核结构的多 进程的嵌入式操作系统设计方案,探讨使用组件技术实现嵌入式系统时要解决 的若干问题,并制定出一种适用于嵌入式环境的简化了的组件规范。 第一章绪论 1 2 1 设计微内核结构时需要解决的若干问题 在设计通用的微内核结构时,需要考虑如下基本问题 微内核成分的划分 理论上只有最基本的操作系统功能才能放到微内核中,包括进程的管理和 调度、进程间通信、同步机制以及中断处理,但是可以针对具体的硬件条件将 操作系统的部分外围功能重新下移到微内核中以提高系统的效率。毕竟,对于 一个系统而言,效率是第一位的。如果没有效率,即使有再好的结构也没有任 何用处。 设备中断处理程序的设计 设备中断处理程序是微内核的底层硬件接e l ,在设备中断中将设备的状态、 请求等信息递交给微内核,微内核以此作为调度用户态设备服务进程的基础。 为了能够高效地为设备服务,设备中断处理程序必须能够尽量快地结束,并且 要允许嵌套,同时还要限制临界区的数量。 微内核体系结构和各个部分的详细设计 在确定了微内核的组成之后,就可以设计微内核各个部分之间的作用关系 了,并确定微内核的体系结构及运行机制。注意,在设计微内核的体系结构时 必须考虑到对设备中断处理程序的要求:微内核中必须包含相应的设施使得中 断处理能够达到既定要求。然后设计微内核各个部分的功能与接e l ,以及各个 部分的核心数据结构。 进程i j , l , f t t 述、栈及调度策略 进程是多任务系统最基本的概念,必须根据嵌入式平台的特点及具体应用 的需要合理地设计进程描述符,为内核提供管理进程时需要的有关进程的所有 信息。每个进程必须有独立的栈为其执行流服务,需要确定进程栈的大小及其 在内存中的位置。另外,必须针对具体应用的要求设计合适的调度策略,还需 要根据硬件平台的特性设计上下文切换的具体方法。 进程间通信 在具有微内核结构的操作系统中,微内核实际上扮演的是进程管理器的角 色,负责进程调度、生命期控制和进程间通信。所以除了进程管理和调度外还 必须设计有效的进程问通信方法。 进程的加载方式 将进程加载到内存中可以采用静态加载或动态加载两种方式:对于中、高 端具有内存管理单元( m l u ) 、支持虚地址模式的嵌入式处理器,可以使用动态 加载方式,同时还需要设计辅存上的文件系统;对于大量中、低端没有内存管 理单元、只支持实地址模式的嵌入式处理器,一般采用静态加载方式。 第一章绪论 1 2 2 使用组件技术时需要解决的若干问题 组件的实现代码与客户的实现代码分开、独立地编译,组件以二进制代码 的形式发布,客户除了组件声明的接口外对组件一无所知。组件的发行、使用 方式决定了使用组件时需要解决如下主要问题: 如何将组件代码链接到客户的地址空间中去 这是使用组件时必须解决的第一个问题,首先需要将组件代码链接到客户 代码中,然后才能在客户的地址空间中创建并使用组件。需要根据嵌入式硬件 平台提供的支持选择动态链接或静态链接方式。 如何注册、定位组件,以及如何在客户的空间中创建组件 由于客户代码和组件代码独立编译,客户只有描述组件及其接口i d 的文件 如i f a c e h 和g u i d c p p ,除此之外客户对实现组件的具体对象、组件代码的位 置、如何创建组件等等均一无所知。所以需要设计组件管理器( 又称为组件容 器) 注册并管理组件,并封装在客户地址空间中创建组件的过程。 如何定义组件的接口 组件的接口必须满足封装性的要求,接口需要向客户提供控制组件生命周 期的方法,使得组件不再被客户需要时能够动态地将自己从客户地址空间中删 除。同时,组件必须提供某种机制使得客户可以通过组件的一个接口得到组件 的其它接口。另外,因为客户只能通过组件的接口来使用组件,所以客户接口 和组件接口的内存结构必须完全相同。 1 3 论文的组织安排 全文共分五章。 第章为绪论,介绍论文的研究意义和目标,以及做研究时需要解决的一 系列主要问题。 第二章是论文的主体,从具有微内核的嵌入式系统的体系结构开始,提出 了一种通用的嵌入式微内核体系结构及其各部分的设计方案和具体实现方法, 并以进程概念为核心,讲述了进程描述符、进程栈、进程调度策略、进程通信 和上下文切换的具体细节,同时还介绍了中断的处理和返回策略。对于某些与 具体应用密切相关的问题,论文中还给出了若干备选方案以及根据具体需要选 择方案的方法。 第三章介绍了使用组件技术实现嵌入式操作系统的好处和使用组件技术时 需要解决的若干主要问题,最后给出了一套简单的适用于嵌入式环境的组件规 范。 第四章在第三章制定的组件规范基础上,描述了在m c 6 8 v z 3 2 8 平台上遵循 该组件规范实现嵌入式操作系统微内核的方法。 第五章是全文的结束语,进一步指出了根据具体应用的需求改进微内核设 计方案的方法。 第一章嵌入式系统微内核的设计 第二章嵌入式系统微内核的设计 2 1 具有微内核的嵌入式系统体系结构 如第一章绪论所述,良好的可裁减性、高可靠性和可移植性使得微内核结 构能够满足对嵌入式系统的要求。微内核的这些优点是由其结构决定的:用 个水平分层结构代替了传统的纵向分层结构,其基本原理是只有最基本的操作 系统功能才能放到内核中,不是最基本的服务和应用程序在微内核之上构造, 并在用户模式下执行。尽管什么应该在微内核中、什么应该在微内核外,不同 的设计有不同的分界线,但是共同的特点是许多传统上属于操作系统一部分的 功能现在都是外部子系统,包括设备驱动程序,文件系统,窗口系统,网络服 务和安全服务等1 4 1 。 考虑到效率因素,可以将内存管理保留在微内核中。微内核中还包含进程 管理、进程问通信、中断处理机制和同步机制这些操作系统最基本的功能,见 下图2 一l 。如果采用抢占式微内核和实时调度算法,就可以将设各驱动的大部 分工作由用户念的实时进程完成,这样可以简化设备驱动程序的设计 4 j a 另外, 微内核外部的其余操作系统部件也被当作服务器进程实现,它们可以与微内核 交互或者通过微内核相互交互。 引引刚h 幽2 1 具有微内核的嵌入式系统体系结构 需要说明的是,微内核并不是一个完整的操作系统,实际上,微内核结构 便于增加各种各样的功能,可以根据具体嵌入式应用的需要灵活地修改、增加 或删除相应的服务( 比如设备的服务器进程) ,而且服务程序的变更被限制在操 作系统的上层子集中,不会对底层的微内核造成影响。 另外,微内核可以被严格的测试,它只提供少量的应用程序编程接口,比 第二章嵌入,系统微内核的没i f 如q n x 实时操作系统的微内核只提供1 7 个系统调用接口 1 7 】,这就可能为微内 核外部的操作系统服务产生高质量的代码。 本章的后继小节将详细介绍具有微内核结构的嵌入式操作系统设计方案。 2 2 微内核的体系结构 进程1 的事件链表 j进程2 的事件链表 进程n 的事件链表 系统运行队列 ( 单向循环链表) 耀 二 _ + 一一l 叶 ) 二卜d 一,j 图2 2 当前微内核的体系结构 5 第一章嵌入式系统微内核的醴汁 系统消息队列和系统事件队列是微内核的骨架,将设备的物理电信号转化 为相应服务器进程处理的事件,并由系统事务时钟周期地将事件分发到相应接 收进程的事件队列中。这种结构可以保证设备中断处理程序能够尽快地退出, 以便高效地使用外设,同时能为进程调度提供依据。 系统中所有的进程都是事件驱动、单线程的,进程本身就是一个处理事件 的循环体。采用合理的调度策略和算法,用户态的实时进程可以及时完成设备 中断处理程序的后继任务,从而简化了设备驱动程序的设计。 接下来的部分将详细介绍微内核各个部分的具体实现。 2 2 1 系统消息队列 当一个中断发生时并非所有的处理操作都具有相同的急迫性,不应该把所 有的操作都放进中断处理程序中。中断处理程序只执行紧迫的、能够迅速退出 的非阻塞操作,而需要时间长的、不太紧迫的操作应该放到中断处理之外以异 步的方式推迟执行【l 】。所以,微内核采用的中断处理策略就是让中断尽可能快 地被处理完,尽其所能把与中断处理相关的更多的操作尽量向后推迟。 设计系统消息队列和系统事件队列正是为了实现这一目标:设备的中断处 理程序只把设备电信号转化为相应的消息并插入系统消息队列,然后就可以立 即退出,而将消息转化为事件以及处理事件的工作留给系统事务时钟和相应的 服务进程完成( 参见下一小节“系统事件队列”) 。 在当前的多进程系统中,每一个设备都有相应的服务器进程负责处理由设 备中断产生的消息。应用的开发者可以在设备与其服务进程之间建立映射关系, 当设备中断处理程序创建消息时在消息体中指明接收进程的i d 号。 系统消息队列的大小主要根据两个因素确定:当前使用的设备数量和系统 事务时钟的频率。设备的中断处理程序为消息队列的生产者,系统事务时钟周 期地将消息转化为事件,是消息队列的消费者。内核的开发人员必须合理地设 定消息队列的容量以免溢出。 可以设计如下数据结构描述消息: t y p e d e f s t r u c t v o i d ( + p t rf c t ) ( v o i d * ) ;h 指向相应的消息处理函数 u w o r d m s g i d ; 消息的值 u w o r d p a r a l ; 消息的参数 u w o r d p a r a 2 ; 消息的参数 v o i d * m s g p b p ;3 1 向额外参数的指针 u s h o r t p i d ;,消息接收进程的i d 号 l m s g t y p e ; 2 2 2 系统事件队列 和系统消息队列一样,系统事件队列也是一个循环队列。如果要设计一个 单进程的嵌入式系统,可以给进程设计一个事件循环,在事件循环中不停地调 用一一个e v t g e t e v e n t 函数依次取出各个事件并调用合适的处理函数处理,直至 收到e v j l 、一a p p s t o p 类型的事件后退出。e v t g e t e v e n t 函数在一个循环体中以阻 塞方式调用m s g d e c o d e 函数,后者将一条消息转换为相应的事件并插入系统事 第二章嵌入式系统微内核的吐计 件队列,如下图2 3 中小图所示 殴备中断处理函数 t 厂磊磊赢、 、 审上 由事件循环执行e v t g e t e v e n t t0 事件处理循环 单进程嵌入式系统的体系结构 程事 队列 囱虻) d 系统靳删 i 至竺塑竺竺竺! ! 兰i内核态 划户态 进一步简化了的微内核的体系结构 幽2 3 系统体系结构的变化 为了实现多进程的操作系统,必须由内核完成将消息转化为事件的操作, 并以此作为进程调度的基础。利用一个低优先级的系统事务时钟周期地将消息 转化为相应的事件并插入系统事件队列( 见图2 2 ) 。 事件分发器( e v t d i s p a t c h 函数) 从系统事件队列中依次取出事件,并根据 事件结构体中p i d 域的值作为索引访问进程控制块的全局数组,然后将事件插 入相应进程的事件队列,从而使得事件分发器无需维护一张从事件到其接收进 程的映射表,应用开发者添加、删除进程对系统事件队列的使用没有任何影响。 在如图2 3 中小图所示的单进程嵌入式系统中,只有一个进程、一个系 统事件队列。这个惟一的进程充当了所有设备中断处理的服务器进程,执行所 有设备的与中断处理相关的、非紧急的操作。而在多进程系统中,为每一个设 备设计各自独立的服务器进程。从尽量快地结束中断处理的角度看,单进程和 多进程的系统采用了相同的技术。尽管这种单进程的系统不存在任务调度延迟, 在设备中断处理程序退出后进程就能为设备服务,但是它无法象多进程系统那 样同时为多个设备提供有效的服务,而且通过采用有效的调度策略就可以将设 备服务器进程的调度开销降低到合理的水平( 参见2 4 2 小节) 。 另外,在这种单进程系统中进程事件队列的另一个重要作用是给应用开发 者提供了一个编程接v i ,开发者可以直接向事件队列中添加事件以获得相应事 件处理函数提供的服务。而在多进程系统中( 见图2 - - 2 ) ,由于每个进程都有 各自独立的事件队列,因此可以直接向进程的事件队列中添加事件。现在仍然 暂时保留系统事件队列是考虑到在给各个进程分发事件前,还有可能需要对事 件做某些处理,比如合并等操作。如果不需要这些操作,则可以去掉系统事件 第二章嵌入式系统微内核的敬汁 队列进一步简化微内核结构( 见图2 3 的) 。 系统事务时钟的优先级较低,允许更高优先级的中断处理程序将其中断。 另外,由于将消息转化为事件的操作是异步执行的,故目前的这种设计只适用 于对实时性要求不太高的应用中。 这里有一个值得思考的问题:毫无疑问对事件的处理是绝不能放到设备中 断处理程序中的。但是,是否可以将消息转换为事件以及分发事件的操作也放 到中断处理程序中? 在设备中断处理程序退出前以开中断的方式执行这两个操作,与目前在系 统事务时钟中断处理中执行它们相比,优点如下: a ) 能够减少消息产生与消息处理和分发事件之间的延迟,提高系统的实时性。 b ) 不用使用额外的系统事务时钟,减少了中断源和中断响应、处理开销。 但是这样做的缺点也很明显:减少延迟提高实时性是以增加中断处理程序 的执行时间为代价的。由于m c 6 8 v z 3 2 8c p u 在中断处理时忽略对同一中断源( 甚 至是同一优先级内所有中断源) 中断信号的响应( 见2 5 3 小节) ,中断处理时 间的延长可能会导致系统对设备响应缓慢,使得设备的利用率降低。 所以,必须根据实际应用的特点如设备数量、中断发生频率等因素,通过 验证的方法确定最佳的方案。 可以设计如下数据结构描述事件: t y p e d e fs t r u c t w 0 r d e v e n t t y p e ; 事件的值 w o r d e v e n t l d ;事件所对应对象的i d w o r d p a r a i ;事件的参数 w o r d p a r a 2 ;事件的参数 v o i d + e v t p b p ;1 1 7 f 旨向额外参数的指针 s h o r t p i d ;事件接收进程的i d 号 ) m s g t y p e ; 2 2 1 3 进程事件队列 在如图2 - - 2 所示的多进程系统中所有的进程都是事件驱动的,都有各自的 事件队列。进程事件队列是一个单向链表,内核和其它进程都可以向进程的事 件队列中添加事件,因此,进程事件队列中的事件可能来源于设备的物理电信 号或者内核或其它进程对它发出的请求。 系统事务时钟周期调用事件分发器将事件分发到相应的接收进程,是进程 事件队列的生产者;进程是自己事件队列的消费者,事件处理循环根据事件的 类型润用相应的处理函数,并在处理完事件后将其从事件队列中删除( 见2 3 5 小节) 。 2 2 4 系统运行队列 当内核要寻找一1 个新的进程在c p u 上运行时,必须只考虑可运行的进程, 即处在t a s k r u n n i n g 状态的进程( 参见2 3 3 小节) 。如果进程数目较多,则 扫描整个进程控制块的全局数组是相当低效的,所以才需要设计可运行进程的 循环链表构成系统运行队列。 第一章嵌入式系统微内核的设计 可以根据进程的优先级设计两个运行队列:实时进程运行队列和普通进程 运行队列。调度程序优先调度实时进程,而且只有当实时进程运行队列为空后 爿。调度普通进程。为了方便调度,运行队列还提供了两个函数把进程的描述符 分别移动到相应运行队列的开始或末尾。 当事件分发器将事件插入接收进程时,如果发现接收进程的事件队列原先 为空,则调用w a k e u p 函数( 见下一小节) 将接收进程插入合适的运行队列。另 外,当某个等待进程被唤醒后其控制块也被加入运行队列。只要新加入的进程 是实时进程、或者其动态优先级大于当前进程时,就强迫调用调度程序发生进 程切换。 当进程在处理完事件将其从事件队列中删除时,若发现事件队列变为空则 通过y i e i d 系统调用将自己从系统运行队列中删除。 2 2 5 系统等待队列 微内核中将t a s k w a i t i n g 状态的进程再分成很多类,每类对应一个特定 的等待事件。在这种情况下进程的状态信息满足不了快速检索的要求,因此必 须设计额外的等待队列。 等待队列在内核中有许多用途,尤其对中断处理、进程同步及定时用处更 大。进程必须经常等待某些事件的发生,比如,等待某个设备操作的终止,等 待获得某个系统资源,或者等待时间经过合适的间隔。等待队列实现在相应事 件上的条件等待:希望等待特定事件的进程将自己放进相应的等待队列并主动 放弃c p u 。因此等待队列表示一组睡眠的进程,当某一条件为真时由内核唤醒 相应的等待进程。 每一个等待队列均由一个等待队列接口指针来标识。等待队列中每个元素 可以采用如下数据类型描述: s t r u c tw a i t _ q u e u e s t r u c tt a s k _ s t r u c t + t a s k ; s t r u c tw a i t _ q u e u e + n e x t ; 当进程需要等待一个事件的发生或某一资源时,可以主动发出系统调用将 自己进入睡眠状态。该系统调用的处理函数为s 1 e e p o n 函数,其步骤为: a ) 将当前进程的状态由t a s kr u n n i n g 修改为t a s kw a i t i n g : b ) 将当前进程加入相应的等待队列: c ) 设置当前进程描述符的n e e d r e s c h e d 域并调用调度函数s c h e d u l e : d ) 检查相应的资源是否可用或事件是否发生,如果不,则回到第一步: e ) 将当前进程从相应的等待队列删除。 这里有两点需要注意。第二步进程将自己加入等待队列时,进程同时还在 运行队列中。将进程从运行队列中删除的操作放到调度程序中完成,因为调度 程序可以根据当前进程描述符中的信息判断出引发调度的各种情况并执行相应 的调度策略。另外,只有该进程再次恢复执行时才能从第四步重新执行,此时 进程需要重新检查资源是否可用或事件是否发生,因为可能存在多个睡眠进程 被同时唤醒的情况。 9 第一章嵌入式系统微内核的设计 与s l e e p o n 函数的作用相反,内核函数w a k e u p 将一个进程从等待队列中唤 醒、或者使其从停止状态转换到运行状态。以下情况发生时由内核调用w a k e u p 函数: a ) 进程等待的某个资源重新可用。 b ) 内核或其它进程给某个进程发送请求时,如果目的进程此时处于 t a s kw a i t i n g 等待状态或者处于t a s k s t o p p e d 停止状态( 其事件队列 为空) 。 c ) 事件分发器向进程事件队列中插入新的事件时,并且目的进程处于 t a s ks t o p p e d 停止状态( 其事件队列为空) 。 w a k e u p 函数的步骤为: a ) 将目的进程的状态改为t a s k r u n n i n g : b ) 将目的进程加入运行队列: c ) 如果目的进程是实时进程,或者其动态优先级大于当前进程时,就立即 设置当前进程的n e e d _ r e s c h e d 域并调用调度函数。 同样需要注意的是,w a k e u p 函数将处于t a s k w a i t i n g 状态的进程唤醒时, 并非使其立即恢复执行。实际上,此时进程仍然处在等待队列中。该函数仅仅 是将等待状态的进程同时加入运行队列而已,从而使得该进程可以得到一次被 调度程序选择的机会。只有等到进程重新恢复执行后才会把自己从等待队列中 删除( 见s l e e p o n 函数的最后一步) 。 2 3 进程的描述及主体结构的设计 进程通常被定义为程序执行时的一个实例,是任何多道程序设计操作系统 的基本概念。由于硬件平台的限制,嵌入式环境中的进程与p c 操作系统中的进 程相比在进程状态、拥有资源种类和数量等方面有很大的不同,必须针对具体 嵌入式平台的特点合理地设计进程描述符。 下面将详细介绍嵌入式环境中进程描述符及进程主体的设计方案。 2 3 1 嵌入式环境中进程的特点 考虑到性价比,通常情况下中、低端嵌入式处理器( 如m c 6 8 v z 3 2 8 ) 没有内 存管理单元,只提供实模式运行环境【i “,所以其环境中的进程没有线性区这样 的资源,不使用页表,并以静态加载的方式载入内存。由于硬件资源的限制, 进程一般为静态实体,数目较少且固定,所有的进程均常驻内存,无法删除、 创建进程,进程划没有父子兄弟关系,而且进程所具有的状态和资源与p c 环境 相比也少得多。每个进程有独立的栈以保存各自的执行现场,但是所有进程和 内核共享一个系统堆以及全局数据结构。由于中、低端嵌入式系统一h 往往没有 文件系统,故进程通常也不拥有相应的资源。 对于具有内存管理单元的中、高端嵌入式处理器( 如s t r o n ga r m ) ,进程在 虚地址环境中运行,进程为动态实体,可以以动态加载的方式载入内存,可以 动态地创建、删除进程,进程拥有独立的线形空间,独立的进程栈和堆,这种 环境中的进程与p c 环境中的就很类似了。 0 第二章嵌入式系统微内桉的世计 2 3 2 进程描述符 为了管理进程,内核必须用进程描述符对每个进程所做的事情进行清楚的 描述。在m c 6 8 v z 3 2 8 平台上进程描述符可咀是如下的t a s k s t r u c t 数据结构: s t l a l c tt a s k s t r u c t u n s i g n e d c h a r 4 a 7 ; s t a c kp o i n t e r u n s i g n e dc h a r 4 a 6 ; n e x tr t i l l ; s t a t e ; n e e dr e s c h e d ; p o l l c y ; c o u n t e r ; p r i o r i t y ; r t p r m r i t y ; p u s e r e v t q u e ; s i g n a l ; b l o c k e d ; m g n a l p a r a ; s i g p e n d i n g ; ( + s i g h a n d l e r ) o ; ; 其中 a 7 和a 6 当进程切换发生时,调度程序将当前进程的现场( 即c p ua 7 和a 6 寄存器 的值) 保存在当前进程描述符的这两个域,同时用新进程描述符中这两个域的值 设置c p ua 7 和a 6 寄存器( 即设置新进程的现场) 。具体过程在“上下文切换” 小节中详细描述。 当进程在运行队列中时,该域指向运行队列中下进程的描述符。 s t a t e 描述进程的当前状态。其值是一组标志中的一种。这些状态是互斥的,因 此,只能设置种状态,其余的标志都应被清除。在m c 6 8 v z 3 2 8 平台上针对当 前应用的需要只需设计如下三种不同的状态: a ) 可运行态( t a s kr u n n i n g ) 进程要么在c p u 上执行,要么准备执行。 b ) 可中断的等待状态( t a s kw a i t i n g ) 进程被挂起,处在某一等待队列中,直到一些条件变为真才将进程唤醒。 这些条件包括:等待的资源有效、产生个设备中断、或者内核或其它 进程向其发送一条请求。 c ) 停止状念( t a s ks t o p p e d ) 系统初始化后所有的进程都处于停止状态,直到进程的事件队列中被插 入新的事件。当进程处理完所有的事件后,将自己从运行队列中删除并 进入停止状态。另外,处于停止状态的进程没有加入任何链表,因为没 有必要对其进行分组。 n e e dre s e h e d u曲曲吐曲曲出沁 出|璺甜甜以甜甜以m一甜 叭鲫印弘驴驴弘【基叱叱|菩印 虬虬,轧弓;吼弓;鼬卿霹吼m攀霉悉鎏警 第二章嵌入式系统微内核的破计 由r 虬一f r o m i n t r 检查的一个标志,决定是否调用调度函数s c h e d u l e ( 参 见2 5 5 小节“从中断中返回”) 。 p o f i c y 调度类型,即进程的优先级。允许的取值是: a j s c h e d f t f o 先进先出的实时进程。 b ) s c h e d r r 循环轮转的实时进程。 c ) s c h e d _ o t h e r 循环轮转的普通进程。 当上下文切换时,调度程序根据当前进程的调度类型采用不同的调度策略 ( 详见2 4 小节) 。 c o u n t e r s c h e d r r 实时进程和普通进程的剩余时间片。当个新的时期开始后,这 个域即等于进程基本优先级p r i o r i t y 的值( 见下) 。 p r i o r i t y 普通进程的基本优先级( 基本时问片) 。 r t p ri o ri t y 实时进程的静态优先级,可用于区分s c h e d f i f o 和s c h e dr r 实时进程。 普通进程不用这个域。 p u s e r e v t o u e 在迸程描述符中暂存的进程事件队列组件的接口指针。 s i g n a i 、s i g n a i p a r a 、b l o c k e d 、s i g p e n d in g 、s i g h a n d i e r 这几个域用于信号的处理,在2 6 1 小节“信号”中介绍。 2 3 3 进程的状态转换 进程一共有运行、等待和停止三种不同的状态。进程状态转换如下图2 3 所示,箭头表示了进程状态的变更,箭头上方的标注表示了处理状态变更的相 关内核操作: 捌2 3 进程的状态转换圈 第二:章嵌入式系统傲内核的设计 m c 6 8 v z 3 2 8 嵌入式系统初始化时,所有进程的代码被系统引导程序静态地读 入内存,此时进程处在t a s k s t o p p e d 状态。当系统的事件分发器向进程的事件 队列中插入第一个事件时、或者内核或其它进程给它发送个请求时( 以信号 或事件的方式) ,内核使用w a k e u p 函数将进程的状态改为t a s kr u n n i n g 并插入 运行队列。 处在运行队列中的迸程被调度程序选中后获得c p u 。 正在运行的当前进程在如下三种情况中失去c p u : a ) 需要等待某个条件变为真后才能继续运行。进程发出系统调用请求内核将 自己暂时睡眠。内核函数s l e e p o n 将进程的状态改为t a s kw a i t i n g ,并加 入某个等待队列,然后调用调度程序选择运行队列中新的就绪进程获得 c p u 。 b ) 进程的时间片用完,在系统调度时钟中断处理函数中调度新的进程;或者 有新的更高优先级的进程就绪,当前进程被立即抢占。这两种情况下当前 进程被重新加入运行队列,其状态依然为t a s kr u n n i n g 。 c ) 当前进程处理完其事件队列中的所有事件后,主动发出y i e l d 系统调用放 弃c p u 。内核将进程的状态改为t a s k s t o p p e d ,并重新调度新的进程。 当内核或其它进程给进程发送一个请求( 以消息或事件的方式) ,或者进程 等待的条件变为真,则内核唤醒处在t a s k w a i t i n g 等待状态的进程并将其插入 运行队列。 2 3 4 进程栈的设计和存放 每个进程都必须有独立的栈为其执行流服务并在进程切换时保存现场。进 程栈的大小主要由函数调用嵌套的深度以及中断嵌套的深度决定,可以根据实 际使用情况进行估计。由于嵌入式环境中中断源个数较少,进程处理的任务比 较简单,所以将进程栈设计为8 k b 应该足够用了,以后还可以根据具体情况进 行调整。 图2 - 4 进程描述符和棱的存放 进程栈可以存放在哪里呢? 在m c 6 8 v z 3 2 8 嵌入式平台上进程为静态实体, 进程描述符位于系统的静态数据段中,可以将每个进程的栈和描述符这两个不 第二章嵌入式系统微内核的设汁 同的数据结构存放到一个单独的8 k b 共用体内 2 】。t :图2 - - 4 显示了在共用体中 存放这两种数据结构的方式:进程描述符起始于共用体的开始( 低地址处) ,而 栈起始于末端( 高地址处) 。 a 7 寄存器是c 6 8 v z 3 2 8c p u 的栈指针寄存器,用来存放栈顶的地址。在该 硬件平台上,栈起始于末端高地址处,并朝着低地址的方向增长。 可以使用如下的共用体方便地表示这一结构; u n i o nt a s k _ u n i o n s t r u c tt a s k _ s t r u c tt a s k ; u n s i g n e dl o n gs t a c k 2 0 4 8 ; 1 在系统初始化时,将进程描述符中a 7 域的值设置为该共用体高地址端外下 一字节的地址,然后向进程栈内写入进程第一次执行所需的环境变量。当进程 获得c p u 时,用a 7 域的值设置c p u 的a 7 寄存器。从此,进程的执行流就开始 使用共用体中的这个栈了。只要把数据写入栈中,a 7 寄存器的值就递减。由于 进程描述符的长度目前为止只有几十字节,因此进程的栈可以使用几乎全部的 8 k b 空间。 从效率的观点来看,将进程的描述符与进程栈之间配对,其主要好处是: 内核可以很容易地从a 7 寄存器的值获得当前在c p u 上正在运行的进程描述符指 针【2 】。因为蒋个共用体的起始地址是8 k b 对齐的,大小为8 k b ,所以a 7 寄存器 的值的高杉位有效位即为进程描述符的基地址。这项工作可以由c u r r e n t 宏来 完成,它产生如下汇编指令: a s m f ” a s m f a s mr a s m f ” a s m f m o v e l m o v e l a n d i l m o v e l m o v e l d 1 ,一( a 7 ) ”) ; a 7 ,d 1”) ; # $ f f f f e 0 0 0 ,d 1”) ; d 1 ,_ c u r r e n t p c b ”) ; ( a 7 ) + ,d i”) ; 由于不能直接对地址寄存器做与操作,故使用数据寄存器d l 。第一步和最 后一步分别在使用前、后在进程栈中保存、恢复数据寄存器d l 的值。执行了这 几条指令后,变量c u r r e n t p c b 就包含了当前在c p u 上运行进程的共用体的起始 地址,即进程描述符的指针。 特别需要注意的是,这样做的前提条件是共用体的起始地址必须是8 k b 地 址对齐的。如果无法使用链接器做到这一点,可以用变量o f f s e tf r o m8 k 记录 共用体起始地址对8 k b 对齐地址的偏移。进程的共用体可能跨越了2 个8 k b 区 间,进程栈顶的当前位置有以下两种情况: a ) 栈项在较低地址的8 k b 区间内,则a 7 对8 k b 取整,再加上共用体起始地址 对8 k b 对齐地址的偏移o f f s e t f r o m _ 8 k 即得进程描述符的起始地址。 b ) 栈顶在较高地址的8 k b 区问内,则上一步将得到共用体高端外后一字节的 地址,所以还要再减去8 k b 才能得到进程描述符的起始地址。 以上两种情况的判别方法是:如果a 7 对8 k b 取整再加上偏移 o f f s e t f r o m _ 8 k 后小于a 7 ,则为第一种情况,否则为第二神情况。参见下图 2 5 ,其中粗线代表栈顶可能的两种位置: 第一摹嵌入式系统微内核的垃计 8 k * x 。, 圈2 5 进程共用体对8 k b 的地址偏移 相应的处理代码如下: ( u n s i g n e dl o n g ) c u r r e n t p c b + 2o f f s e t _ f r o m _ 8 k ; a s mrm o v e l a 7 ,_ _ t e m p s p”) ; i f ( ( u n s i g n e dl o n g ) c u r r e n t p c b ( u n s i g n e dl o n g ) t e m p s p ) ( u n s i g n e dl o n g ) c u r r e n t p c b 20 x 2 0 0 0 ; o f f s e l f r o m _ 8 k 在l i n u x 系统中,进程的共用体存放在起始地址对8 k b 对齐的一个块中, 这是由负责页框分配的伙伴系统保证的q 故一定满足c u r r e n t 宏的使用条件。 2 3 5 进程的主体结构和处理事件的层次 在论文提出的多进程嵌入式系统中所有的进程都是事件驱动的单线程进程。 可以将进程分为两大类:设备的服务器进程和用户进程。作为设各服务器的进 程处理设备产生的事件,其主体结构与用户进程相同。由于不涉及用户界面的 各种操作,这类进程的事件循环相对简单许多。下面介绍用户进程的设计。 每一个进程的主体都是一个事件循环用于处理进程事件队列中的所有事件, 这些事件可能代表了用户的某个输入操作,也可能代表了内核或其它进程给它 发送的请求。事件循环还可以使得进程在处理完一个事件后继续处理其事件队 列中的其余事件,直到下一个定时调度中断的到来。 另
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年细胞治疗产品临床试验法规解读与审批流程报告
- 海上风能资源评估报告2025年深远海风电发展规划海上风电场经济效益分析
- 茶与咖啡的跨界融合:2025年市场发展趋势与品牌竞争力研究报告
- 城市自来水厂升级改造2025年环境友好型技术应用报告
- 2025年智能仓储货架制造项目智能控制系统研发报告
- 物联网设备安全漏洞防护策略深度剖析:2025年技术标准解读报告001
- 2025年医院信息化建设电子病历系统优化策略研究报告
- 2025年医院电子病历系统优化在医院信息化建设中的数据安全防护机制研究报告
- 2025年城市地下综合管廊建设专项债券资金申请财务分析报告
- 2025年医药行业CRO研发外包模式下的研发项目管理培训与咨询报告
- 宗教与中国化课件
- 内江市市中区2025届小升初必考题数学检测卷含解析
- CNAS-CI01:2012 检查机构能力认可准则
- 《国有企业改革与发展》课件
- 本地生活服务培训
- 心理咨询师考试实务能力考核试题及答案
- 高中音乐课程纲要
- 输血相关法律法规及流程
- “五育”融合背景下小学数学教学策略探究
- 2025部编版二年级(下)期末测试语文试卷(附答案)
- 低空具身智能频谱管控的研究
评论
0/150
提交评论