全部博文(404)
分类: LINUX
2008-10-06 12:53:42
第一章 ByCore原型结构
在本章中将包括ByCore的总体结构,展现ByCore的一个大体面貌。以下内容将会被提及:
● 设计目标,说明ByCore最终要成为什么样子;
● 总体框架,也就是ByCore的各个部分的组成;
● 内核临界区处理,在内核中怎样保护原子操作;
● struct list结构,使用该结构管理内核中用到的链表;
1.1 目标愿景
这个题目也可以说是内核设计的目标吧。设计的目标大部分可以分成以下的内容:
● 支持多任务,任务数量应该能够满足大部分应用的需要,并且应该具备灵活性。任务调度应该以优先级为基础,以便满足实时系统的基本要求。任务的优先级应该可以相同,对于优先级相同的任务采取时间片方法。
● 提供常用的任务互斥、同步与通信机制,比如信号量,管道,邮箱等方式。
● 提供利用率较高的内存管理策略,可以支持运行时动态的分配内存空间,如任务控制块,管道等使用的空间利用内存管理可以动态生成。
● 中断管理,对于给定的一个中断,应该可以支持数个中断处理程序。
● 内核的移植要尽可能简单,最终的第一目标是让它在ARM7TDIM核上运行起来。
● 能够提供一组合理的API,方便二次扩展或维护,当然这个要求对我来说比较难,毕竟能力有限。
上面几条差不多在ByCore中实现了,下面所列的任务应该就是一种愿景了,可能这些就是下一步的工作,也可能没有下一步了,呵呵。
● 有一套比较合理的设备驱动模型。
● 小巧的、符合嵌入式系统的文件系统。
● 比较瘦小的TCP/IP协议,如果可行的话,希望能够支持更多的通信协议。
● 能够支持当前的嵌入式GUI那就更好了。
上面说了这么多,那么ByCore到底用来作什么呢?当然,我个人希望他能在家庭网络、楼宇网络相关的领域被应用。上面的想法好幼稚了,不过我就是一个比较有童心、爱心、虚荣心、假惺惺、星星心的家伙。
1.2 ByCore的总体框架
说到框架这个词就想到搞建筑的了,好像是很大的工程一样,不过在计算机领域里面还是架构要吃香一样,一听到架构设计师,一股无比崇敬之情油然而生,到什么时候我才能成为架构设计呢?似乎我又开始幻想什么了…,真受不了自己!管他什么框架、架构、结构、构架、书架的。反正都差不多是一个意思,好像废话有点多了。要说明ByCore的结构,那太简单了,看看下面的图就一目了然了,注意看图1.1哦。
我该怎么来解释这个图呢?“不要看我,我怎么知道!”,~_~。其实也不用怎么解释了吧,还不如在这里讲个笑话,缓解一下气氛,相信大家都看过恒源祥那个非常有创意、无新意,甚至有些俗靓俗靓的广告了吧,据说啊,有很多人第一次看到这个广告都以为电视坏掉了,虽然这个广告是俗气了一点,但恒源祥这个品牌就打的很响亮了。后来有商家就有鬼点子了,说啊,一个造酒的公司想了个更绝的招,你恒源祥用十二生肖,我就用梁山108条好汉,公司花了些钱把广告做好,据说在公司内部公映的时候,那个场面,吓死就活该了,上到公司老总下到基层员工无不怀着春光般的心情等着广告上映。广告终于开始播了,屏幕上就是一瓶酒,周围有些野花衬托一下,然后画面就定格了,首先出场的是晁盖,他的台词是“×××酒,晁盖喝了说好”,老板看来拍手称快,大家都跟着拍,第二出场的是宋江,他的台词是“×××酒,宋江喝了说好”,第三个是卢俊义“×××酒,卢俊义喝了说好”,第四个是吴用“×××酒,吴用喝了说好”,第五个出场的是….,行了,行了,还真打算往下说啊!
OK,这一小节就这样了吗?还是简单勾画一下各个部分吧,后面再翔实的解释。首先从端口管理开始吧,就按照从下往上的顺序吧。
在端口管理中,其实主要管理了中断机制。在内核原型中,只为端口管理实现了中断管理部分。中断是现代计算机体系结构中最重要的机制之一,中断本身是一种异步机制,用于通知CPU有其他的事件发生。对中断的处理过程包括:现场保护、中断服务程序执行和现场恢复等主要三个部分组成。第一、三部分由内核管理,对用户透明,用户的ISR(interrupt service route)不用关心现场保护等工作。中断服务程序不需要内核调度就能够执行,但是内核必须协调好ISR和任务间工作。内核在管理好中断的同时,还应该提供良好的中断管理接口。
第二个是内存管理,内存是现代计算机系统操作的核心。内存由大量的字节队列构成,每个字或字节都有它自己的地址。CPU根据程序计数器的值从内存中取指令。这些指令可能会从指定的内存地址读取数据或将数据存入指定的内存地址。处理器对内存的管理分为平板和非平板的管理方式。
平板内存方式是指由编译器生成的地址同程序实际的运行地址相同,在很多单片机中都是采用这样的内存方式。这种方式不需要地址映射。对平板内存的管理,实际上就是直接对物理内存的管理,实际的应用程序可能不需要使用专门的内存管理程序,比如前后台系统,直接利用编译器静态分配内存,所有需要的空间都预先用数组等方式静态建立,这种分配方式也称作静态内存管理。在使用实时内核,或者其他内核的系统中,内核会管理内存,为任务动态地分配地址空间。
不管是以动态还是静态的方式管理平板内存,其任务的数量和大小都受到物理内存大小的限制。对于平板内存主要有以下几大缺点:
1. 内存的物理大小决定了任务的多少以及大小;
2. 任务的越界问题严重;
3. 安全性低,任务很容易访问其他任务的数据;
平板内存具有实时性较好,价格便宜等优点使得平板内存在嵌入式,中小系统中广泛使用。
在现代的计算机系统中,由于平板内存存在诸多缺点,所以引入了非平板内存管理方式。非平板内存的芯片体系结构由内存管理单元(MMU)部分负责管理内存。在非平板内存的计算机体系结构中,编译器产生的地址(在x86架构下可以称作逻辑地址,在arm架构下可称为线性地址,在后面的论述中都称为线性地址)在运行的时候可以通过MMU映射到不同的物理地址运行,相同的物理地址可以给不同的线性地址使用,这就意味着任务数量不受实际物理内存大小限制,只受芯片体系结构的线性地址限制。线性地址在映射到实际的物理地址时会经过严格的访问控制,这使得任务越界带来问题得到很好的控制,一个任务的崩溃不会影响其他任务或整个系统。但由于非平板内存每次寻址都需要通过映射,所以在实时应用中,应该先确定映射时间是否能满足时限要求。值得遗憾的是ByCore当前只实现了平板内存下的内存管理。
接下来勾勒一下任务管理,在多任务系统中,任务是调度执行和资源竞争的基本单元,内核最基本的功能就是任务管理。任务管理应该包括任务创建,任务删除,任务状态改变等功能,这些功能实现的核心是任务调度。
前面说过ByCore内核采用基于优先级的可抢占式调度,同优先级的任务采用了时间片轮转调度。任务优先级的分配采用了静态分配策略,而不支持动态优先级调度策略,虽然如此,ByCore提供了改变任务优先级的API,应用程序可以在运行中改变自身的优先级。
最好看看任务互斥、同步与通信,对于驱动接口这部分,ByCore还没有为它提供管理方案,所以就不提这一部分了。任务间的互斥、同步的具体方式有锁、信号量、事件等技术,用于任务通信机制的消息队列、邮箱和管道等方法。
在多任务系统中,任务间互斥、同步,任务与中断间的同步等操作的最基本方法是加锁机制。利用锁机制,可以让任务的临界区操作变成原子操作。任务需要进入某个临界区必须先获得该临界区的锁钥匙,如果获取钥匙成功,则运行临界区代码,如果获取失败,可以让任务原地自旋或者进入该临界区的等待队列等等。Linux中的自旋锁就是让任务在原地自旋,如果让任务进入临界区的等待队列,这就成了信号量。
对于锁的基本操作有:创建锁,获取与释放锁等。
在多任务内核中,信号量普遍用于任务之间的同步、互斥。信号量可以用于控制共享资源的使用权,标志某事件发生,同步任务之间的行为。信号量好比一把钥匙,与之相关的代码要运行下去,得先得到这把钥匙。内核一般提供2种类型的信号量用于解决不同的问题,这两种信号量是:用于解决互斥、同步问题的二值信号量和用于解决资源计数问题的计数信号量,二值信号量又可分为互斥信号量和同步信号量。互斥信号量比较特殊,在使用过程中可能发生优先级反转现象,内核可以提供优先级继承和优先级天花板两种技术解决此问题。
对于信号量的基本操作有:创建与删除信号量;申请与释放信号量等。
一个事件用于标识一个预先定义好的事件。事件可用于任务之间,任务与中断服务程序之间的同步。事件机制提供复杂同步功能。一个任务可以与多个任务或中断服务程序同步。一个或多个事件构成事件集。事件的特点有:事件之间是相互独立的;事件没有数据传播功能;任务可以同时等待多个事件;事件的等待方式有“与”和“或”两种;事件无队列,即多次向任务发送同一事件,在事件标志未被处理之前,其效果等于只发送一次。
对事件的基本操作有:创建事件、发送事件和接受事件。
上面的三种机制提供了任务间互斥、同步问题的解决方案,但这些机制只是提供了任务间协调的功能,没有提供数据信息传递的功能。在多任务内核中数据传输与协调同样重要。任务间的通信最简单的方式为共享内存空间,共享内存可分为两种情况,一种是内核为任务划分一块内存,让所有的任务都能共享;另一种是为特定的一组任务划分一块内存区域。前者的最大有点就是实现简单,后者的优点是安全,尤其在多用户、多任务的网络操作系统后者更优越。
消息可以看成是一个任意类型,任意长度的数据或者指向数据的指针。将多条消息存放到一个缓冲区中,利用该缓冲区完成任务间的通信。该缓冲区的实现一般采用消息队列实现。消息队列的基本操作有:创建与删除消息队列、发送与接受消息、清空消息队列、消息队列查询等。
按照消息的紧急程度,还可以将他们分为普通消息和紧急消息。在接受消息时,任务可以选择是否等待。如果等待还可以选择是按照先进先出等待,还是按照任务的优先级高低等待。
关于任务通信的实现方式有多种,有些内核将消息队列机制具体实现为邮箱、管道等。邮箱机制和实际生活中的原理一样,任务将需要传输的数据打包成一个消息,该消息包括源地址、目的地址、数据相关等信息,然后将该消息投放到邮箱里,然后接受消息的任务从邮箱中获取消息。
有的实时内核提供管道功能。管道原本使用在操作系统的I/O系统,是一种由驱动程序管理的虚拟I/O设备,与底层的消息队列相联系,可提供与消息队列互换的功能。随着管道的发展,管道也可直接用于任务间的通信,而不在只是用于I/O。管道的概念很形象,任务在管道的一端投递信息,接受任务在另一端取出信息。管道通常被创建成任务专用,也就是说不是任何的任务都能使用管道,只有被许可的任务才能使用。
To be continued……
------ anmnmnly
------ 2008.03.27