📄 [推荐]vxworks内核分析[v创论坛].htm
字号:
<img src="skins/Default/ip.gif" style="margin: 4px;" alt="ip地址已设置保密" /></div>2006-10-19 19:20:56</div>
<div class="postie" style="height:28px;padding:0px;text-indent:10px;">
<div style="float:right;margin-right:5px;">
<div class="menu_popup" id="Menu_1">
<div class="menuitems">
<a href="TopicOther.asp?t=6&BoardID=6&id=262&ReplyID=560" title="向管理员举报该贴">举报帖子</a>
<br /><a title="对本贴使用论坛道具" href="javascript:openScript('plus_Tools_InfoSetting.asp?action=0&BoardID=6&TopicID=262&ReplyID=560',500,400)">使用道具</a>
</div>
</div><a href="post.asp?action=re&BoardID=6&replyID=560&ID=262&star=1&reply=true"><img src="skins/Default/reply.gif" border="0" alt="引用回复这个贴子" style="margin:4px;border:0px;" /></a> <a href="post.asp?action=re&BoardID=6&replyID=560&ID=262&star=1"><img src="skins/Default/reply_a.gif" border="0" alt="回复这个贴子" style="margin:4px;border:0px;" /></a>
<img src="skins/Default/topicmanage.gif" alt="" style="margin:4px;cursor: pointer;" onmouseover="showmenu(event,'','Menu_1');" />
<a href="#top"><img src="skins/Default/p_up.gif" alt="" style="margin:4px;border:0px;" /></a>
</div><div>[帮助] 你觉得本站好,请帮助推广本站!!如果不好,提出你的建议!!</div></div>
</div>
<a name="561">
</a>
<div class="postlary2">
<div class="postuserinfo">
<div style="padding: 10px 0px 0px 5px;line-height:30px;height:30px;">
<div style="float:left;width :120px;filter:glow(color='#9898BA',strength='2');"><b><font color="#FF0000">jdvxworks</font></b></div>
<div style="float:left;width :23px;text-indent:0px;margin:3px;"><img src="skins/Default/ofMale.gif" alt="帅哥哟,离线,有人找我吗?" />
</div>
<div style="float:left;width :15px;text-indent:0px;margin:5px;"><script type="text/javascript" language="javascript">document.write (astro(''));</script></div>
</div>
<div><img src="images/userface/image1.gif" alt="" width="32" height="32" /></div>
<div><img style="margin:5px 0px 5px 0px;" src="skins/Default/star/level20.gif" /></div>
<div>等级:管理员</div>
<div>文章:416</div>
<div>积分:4494</div>
<div>门派:无门无派</div>
<div>注册:2006年9月23日</div>
</div>
<div class="postie">
<div>
<div style="float:right;">
<a href="favlist.asp?action=boke&BoardID=6&replyID=561&ID=262" title="收录该贴到我的博客" target="_blank"><img src="skins/Default/bokefav.gif" border="0" align="middle" /></a>第 <font color="red">2</font> 楼</div> <a href="https://www.alipay.com/payto:foxqs@126.com&partner=2088002048522272" target="_blank"><img alt="用支付宝给jdvxworks付款或购买其商品,支付宝交易免手续费、安全、快捷!" border="0" src="skins/Default/alipay_s.gif" align="middle" /></a>
<a href="boke.asp?UserID=2" title="访问jdvxworks的个人博客" target="_blank"><img src="skins/Default/boke.gif" border="0" align="middle" /></a>
<a href="http://wpa.qq.com/msgrd?V=1&Uin=20056700&Site=By Dvbbs&Menu=yes" title="点击发送QQ消息给jdvxworks" target="_blank"><img src="http://wpa.qq.com/pa?p=1:20056700:4" border="0" width="16" height="16" align="middle" /></a> QQ
<a href="messanger.asp?action=new&touser=jdvxworks" target="_blank"><img src="skins/Default/message.gif" border="0" alt="给jdvxworks发送一个短消息" align="middle" /></a>
<a href="friendlist.asp?action=addF&myFriend=jdvxworks" target="_blank"><img src="skins/Default/friend.gif" border="0" alt="把jdvxworks加入好友" align="middle" /></a>
<a href="dispuser.asp?id=2" target="_blank"><img src="skins/Default/profile.gif" border="0" alt="查看jdvxworks的个人资料" align="middle" /></a>
<a href="query.asp?stype=1&nSearch=3&keyword=jdvxworks&BoardID=6&SearchDate=ALL" target="_blank"><img src="skins/Default/find.gif" border="0" alt="搜索jdvxworks在≡VxWorks系统原理研究≡的所有贴子" align="middle" /></a>
<a href="mailto:foxqs@126.com"><img alt="点击这里发送电子邮件给jdvxworks" border="0" src="skins/Default/email.gif" align="middle" /></a>
<a href="http://www.jdvxworks.com" target="_blank"><img alt="访问jdvxworks的主页" border="0" src="skins/Default/homepage.gif" align="middle" /></a>
</div>
<hr />
<div style="height:22px;line-height:22px;"><div style="float:left;"><img src="skins/Default/topicface/face1.gif" alt="发贴心情" /></div><b>vxworks任务</b></div>
<div style="height:200px;width:97%;padding-right:0px; overflow-x: hidden;font-size:9pt;line-height:normal;text-indent:24px;margin-top:10px;word-wrap : break-word ;word-break : break-all ;" onload="this.style.overflowX='auto';"> 任何要删除或终止一个设定了删除保护的任务的任务将被阻塞。当被保护的任务完成临界区操作以后,它将取消删除保护以使自己可以被删除,从而解阻塞删除任务<br/>。<br/> 正如上面所展示的,任务删除保护通常伴有互斥操作。<br/> 这样,为了方便性和效率,互斥信号量包含了删除保护选项。(参见"互斥信号量")<br/>任务间通信<br/> 为了提供完整的多任务系统的功能,wind内核提供了一套丰富的任务间通信与同步的机制。这些通信功能使一个应用中各个独立的任务协调他们的活动。<br/>共享地址空间<br/> wind内核的任务间通信机制的基础是所有任务所在的共享地址空间。通过共享地址空间,任务能够使用共享数据结构的指针自由地通信。管道不需要映射一块内存区到两个互相通信任务的寻址空间。<br/> 不幸的是,共享地址空间具有上述优点的同时,带来了未被保护内存的重入访问的危险。UNIX操作系统通过隔离进程提供这样的保护,但同时带来了对于实时操作系统来说巨大的性能损失。<br/>互斥操作<br/> 当一个共享地址空间简化了数据交换,通过互斥访问避免资源竞争就变为必要的了。用来获得一个资源的互斥访问的许多机制仅在这些互斥所作用的范围上存在差别。实现互斥的方法包括禁止中断、禁止任务抢占和通过信号量进行资源锁定。<br/> 中断禁止:最强的互斥方法是屏蔽中断。这样的锁定保证了对CPU的互斥访问。这种方法当然能够解决互斥的问题,但它对于实时是不恰当的,因为它在锁定期间阻止系统响应外部事件。长的中断延时对于要求有确定的响应时间的应用来说是不可接受的。<br/> 抢占禁止:禁止抢占提供了强制性较弱的互斥方式。 当前任务运行的过程中不允许其他任务抢占,而中断服务程序可以执行。这也可能引起较差的实时响应,就象被禁止中断一样,被阻塞的任务会有相当长时间的抢占延时,就绪态的高优先级的任务可能会在能够执行前被强制等待一段不可接受的时间。为避免这种情况,在可能的情况下尽量使用信号量实现互斥。<br/> 互斥信号量:信号量是用于锁定共享资源访问的基本方式。不象禁止中断或抢占,信号量限制了互斥操作仅作用于相关的资源。一个信号量被创建来保护资源。VxWorks的信号量遵循Dijkstra的P()和V()操作模式。<br/> 当一个任务请求信号量,P(), 根据在发出调用时信号量的置位或清零的状态, 会发生两种情况。如果信号量处于置位态, 信号量会被清零,并且任务立即继续执行。如果信号量处于清零态,任务会被阻塞来等待信号量。<br/> 当一个任务释放信号量,V(),会发生几种情况。如果信号量已经处于置位态,释放信号量不会产生任何影响。如果信号量处于清零态且没有任务等待该信号量,信号量只是被简单地置位。如果信号量处于清零态且有一个或多个任务等待该信号量,最高优先级的任务被解阻塞,信号量仍为清零态。<br/> 通过将一些资源与信号量关联,能够实现互斥操作。当一个任务要操作资源,它必须首先获得信号量。只要任务拥有信号量,所有其他的任务由于请求该信号量而被阻塞。当一个任务使用完该资源,它释放信号量,允许等待该信号量的另一个任务访问该资源。<br/> Wind内核提供了二值信号量来解决互斥操作所引起的问题。 这些问题包括资源拥有者的删除保护,由资源竞争引起的优先级逆转。<br/> 删除保护----互斥引起的一个问题会涉及到任务删除。在由信号量保护的临界区中,需要防止执行任务被意外地删除。删除一个在临界区执行的任务是灾难性的。资源会被破坏,保护资源的信号量会变为不可获得,从而该资源不可被访问。通常删除保护是与互斥操作共同提供的。由于这个原因,互斥信号量通常提供选项来隐含地提供前面提到的任务删除保护的机制。<br/> 优先级逆转/优先级继承----优先级逆转发生在一个高优先级的任务被强制等待一段不确定的时间以便一个较低优先级的任务完成执行。考虑下面的假设:<br/> T1,T2和T3分别是高、中、低优先级的任务。T3通过拥有信号量而获得相关的资源。当T1抢占T3,为竞争使用该资源而请求相同的信号量的时候,它被阻塞。如果我们假设T1仅被阻塞到T3使用完该资源为止,情况并不是很糟。毕竟资源是不可被抢占的。然而,低优先级的任务并不能避免被中优先级的任务抢占,一个抢占的任务如T2将阻止T3完成对资源的操作。这种情况可能会持续阻塞T1等待一段不可确定的时间。这种情况成为优先级逆转,因为尽管系统是基于优先级的调度,但却使一个高优先级的任务等待一个低优先级的任务完成执行。<br/> 互斥信号量有一个选项允许实现优先级继承的算法。优先级继承通过在T1被阻塞期间提升T3的优先级到T1解决了优先级逆转引起的问题。这防止了T3,间接地防止T1,被T2抢占。通俗地说,优先级继承协议使一个拥有资源的任务以等待该资源的任务中优先级最高的任务的优先级执行。当执行完成,任务释放该资源并返回到它正常的或标准的优先级。因此,继承优先级的任务避免了被任何中间优先级的任务抢占。<br/> 同步<br/> 信号量另一种通常的用法是用于任务间的同步机制。在这种情况下,信号量代表一个任务所等待的条件或事件。最初,信号量是在清零态。一个任务或中断通过置位该信号量来指示一个事件的发生。等待该信号量的任务将被阻塞直到事件发生、该信号量被置位。一旦被解阻塞,任务就执行恰当的事件处理程序。信号量在任务同步中的应用对于将中断服务程序从冗长的事件处理中解放出来以缩短中断响应时间是很有用的。<br/>消息队列<br/> 消息队列提供了在任务与中断服务程序或其他任务间交换变长消息的一种较低层的机制。这种机制在功能上类似于管道,但有较少的开销。<br/>管道、套接字、远程过程调用和更多<br/> 许多高层的VxWorks机制提供任务间通信的更高层的抽象,包括管道、TCP/IP套接字、远程过程调用和更多。为了保持裁减内核为仅包含足够支持高层功能的一个最小函数集的设计目标,这些特性都是基于上面描述的内核同步方式的。<br/>3. 内核设计的优点<br/> wind内核的一个重要的设计特性是最小的抢占延时。其他的主要设计的优点包括史无前例的可配置性,对不可预见的应用需求的可扩展性,在各种微处理器应用开发中的移植性。<br/>最小的抢占延时<br/> 正如前面所讨论的,禁止抢占是获得代码临界资源互斥操作的通常手段。这种技巧的不期望的负面影响是高的抢占延时,这可以通过尽量使用信号量实现互斥和保持临界区尽量紧凑被减小。但即使广泛地使用信号量也不能解决所有的可能导致抢占延时的根源。内核本身就是一个导致抢占延时的根源。为了理解其原因,我们必须更好地理解内核所需的互斥操作。<br/>内核级和任务级<br/> 在任何多任务系统中,大量的应用是发生在一个或多个任务的上下文。然而,有些CPU时间片不在任何任务的上下文。这些时间片发生在内核改变内部队列或决定任务调度。在这些时间片中,CPU在内核级执行,而非任务级。<br/> 为了内核安全地操作它的内部的数据结构,必须有互斥操作。内核级没有相关的任务上下文,内核不能使用信号量保护内部链表。内核使用工作延期作为实现互斥的方式。当有内核参与时,中断服务程序调用的函数不是被直接激活,而是被放在内核的工作<br/>队列中。内核完成这些请求的执行而清空内核工作队列。<br/> 当内核正在执行已经被请求服务时系统将不响应到达内核的函数调用。可以简单地认为内核状态类似于禁止抢占。如前面所讨论的,抢占延时在实时系统中是不期望有的,因为它增加了对于会引起应用任务重新调度的事件的响应时间.<br/> 管操作系统在内核级(此时禁止抢占)完全避免消耗时间是不可能的,但减少这些时间是很重要的。这是减少由内核执行的函数的数量的主要原因, 也是不采用统一结构的系统设计方式的原因。例如,有一种流行的实时操作系统的每个函数都是在内核级执行。这意味着当一个低优先级的任务在执行分配内存、获得任务信息的函数时所有高优先级的任务被禁止抢占。<br/>一个最小的内核<br/> 已经说明了一个最小内核的优点和构造高层操作系统功能的必要功能,我们使用这些操作原语来执行一个传统的内核级功能,而在VxWorks中作为任务级功能执行,内存管理。 在这个例子中,考虑用户可调用的子例程malloc, 用于分配所请求大小的内存区并返回一个指向该内存区的指针。假定空闲内存区是通过搜索一个空闲内存块的队列找到的,一个信号量必须被用来保护这个非抢占多用户资源。分配内存的操作如下:<br/> 获得互斥信号量<br/>搜索空闲内存块链表<br/> 释放互斥信号量<br/> 值得注意的是搜索一个足够大的空闲内存块的可能的冗长的时间是发生在调用任务的上下文中。这是可以被高优先级的任务抢占的(除了信号量调用的这段执行时间)。<p> 在一个标准的统一结构的实时内核中,内存分配例程操作如下:<br/> 进入内核<br/> 搜索空闲内存块链表<br/> 退出内核<br/> 整个内存分配发生在内核级,任务抢占被禁止如果高优先级的任务在此时变为就绪态,它必须等待直到内核为低优先级的任务完成内存分配。有些操作系统甚至在这段市时间禁止中断。<br/>任务级操作系统服务<br/> Wind River System的实时操作系统,VxWorks,显示了这样设计的一个最小内核是能够满足需求的。VxWorks是现在能够获得的独立于任何处理器的、拥有相当小内核的、功能完全的层次结构的实时操作系统。<br/> VxWorks在内核之上提供了大量的功能。它包括内存管理,一个完整的BSD4.3网络包,TCP/IP,网络文件系统(NFS),远程过程调用(RPC),UNIX兼容的链接加载模块,C语言的解释界面,各种类型的定时器,性能监测组件,调试工具,额外的通信工具如管道、信号和套接字,I/O和文件系统,和许多功能例程。这些都不是运行在内核级,所以不会禁止中断或任务抢占。<br/>可配置性<br/> 实时应用有多种内核需求。没有哪个内核有一个用来满足每种需求的很好的设计折衷。然而,一个内核可以通过配置来调整特定的性能特性,裁减实时系统来最好地适应一个应用的要求。不可预见的内核配置性以用户可选择的内核排队算法的形式提供给应用。<br/>排队策略<br/> VxWorks中的排队库是独立于使用他们的内核队列功能而执行的,这样提供了将来增加新的排队方式的灵活性。<br/> 在VxWorks中有各种内核队列。就绪队列是一个按优先级索引的所有等待调度的任务队列。滴答队列用于定时功能。信号量是一个等待信号量的被阻塞任务的链表。活动队列是一个系统中所有任务的一个先进先出(FIFO)的链表。这些队列中的每个队列都需要一个不同的排队算法。这些算法不是被内嵌在内核中,而是被抽取到一个自治的、可转换的排队库中。这种灵活的组织形式是满足特殊的配置需求的基础。<br/>可扩展性<br/> 支持不可预见的内核扩展的能力与以有功能的可配置性是同样重要的。简单的内核接口和互斥方法使内核级功能扩展相当容易; 在某些情况下,应用可以仅利用内核钩子函数来实现特定的扩展。<br/>内部钩子函数<br/> 为了不修改内核而能够向系统增加额外的任务相关的功能,VxWorks提供了任务创建、切换和删除的钩子函数。这些允许在任务被创建、 上下文切换和任务被删除的时候额外的例程被调用执行。这些钩子函数可以利用任务上下文中的空闲区创建wind内核的任务特性。<br/>未来考虑<br/> 有许多系统函数现在变得越来越重要,而且会影响到内核设计时的抢占延时。尽管涉及这些问题一个完整的讨论超出了本文的范围,但值得简单地提一下。<br/>RISC/CISC<br/> 设计一个独立于CPU的操作系统一直是一个挑战。随着新的RSIC(精简指令集)处理器变得很流行,这些难度也加大了。为了在RISC环境下有效地执行,内核和操作系统需要有执行不同策略的灵活性。<br/> 例如,考虑在任务切换时内核执行的例程。在CISC(复杂指令集,如680x0或80x86)CPU,内核为每个任务存储一套完整的寄存器,在运行任务的时候将这些寄存器换入换出。在一个RISC机器上,这样是不合理的,因为涉及到太多的寄存器。所以内核需要一个更精密复杂的策略,如为任务缓存寄存器,允许应用指定一些寄存器给特殊的任务。</p><p>移植性<br/> 为了使wind内核在他们出现的结构上能够运行,需要有一个可移植的内核版本。这使移植是可行的,但不是最优化的。<br/>多处理<br/> 支持紧耦合的多处理需求要求实时内核的内部功能包含,在理想情况下,在远端请求内核调用,如从一个处理器到另一个处理器。这就要涉及到信号量调用(为处理器间同步)和任务调用(为了控制另一个CPU上的任务)。这种复杂性无疑会增加内核级功能调用的开销,但是许多服务如对象标识可以在任务级执行。在多处理系统中保持一个最小内核的优点是处理器之间的互锁可以有较好的时间粒度。大的内核将在内核级消耗额外的时间,仅能获得粗糙的互锁时间粒度。<br/>Ada<br/> Ada语言为实时系统设计者提供了象聚会机制这样的任务原语。异常处理、任务终止、终止替换和聚会都将潜在地影响内核设计。这些操作可以由前面讨论的任务和同步机制构造,为了保持减小抢占延时的设计目标,许多工作能够在任务级执行。<br/>4. 实时内核的重要尺度<br/> 许多性能特性被用来比较以有的实时内核,这些包括:<br/> 快速的任务上下文切换----由于实时系统的多任务的特性,系统能够快速地从一个任务切换到另一个任务是很重要的。在分时系统中,如UNIX,上下文切换是在ms级。Wind内核执行原始上下文切换只用17us。<br/> 最小的同步开销----因为同步是实现资源互斥访问的基本方法,这些操作所引起的开销最小化是很重要的。在VxWorks中,请求和释放二值信号量仅用8us。<br/> 最小的中断延时----因为外部世界来的事件通常以中断的形式到来,操作系统快速的处理这些中断是很重要的。内核在操作一些临界数据结构的时候必须禁止中断。为了减小中断延时,必须使这些时间最小化。Wind内核的中断延时小于10us。<br/>抢占延时对性能指标的影响<br/> 当许多的实时解决方案被提交给应用工程师时, 性能指标对于评估供应商的产品变得越来越重要。不象上下文切换和中断延时,抢占延时很难测量。所以它很少在说明中被提及。但是考虑到当内核通常禁止上下文切换会长达数百微妙,而声称一个50us的固定长度(与任务个数无关)的上下文切换时间是毫无意义的。除了很难测量外,抢占延时可能会削弱许多性能指标的有效性。<br/> Wind内核通过减小内核的大小来尽量减小抢占延时。 包含繁多功能的内核必将引起长的抢占延时。<br/>5. 结论<br/> 为了满足对实时内核日益增加的要求,如新的调度算法、多处理、Ada和RISC结构,wind内核始终以灵活性和可配置性为设计目标。它所提供的优秀的运行性能将成为实时应用需求新标准。</p>
<div align="right"><font color="#000066">[此贴子已经被作者于2006-10-19 21:07:50编辑过]</font></div></div>
<div style="width:85%;overflow-x: hidden;">
<img src="skins/Default/sigline.gif" /><br />为你提供真诚的服务,让我们互助学习!!<br/>三线接入空间,让你畅通无阻!!请大家选择线路访问!!<br/>Vxworks QQ群交流:6846882<br/>本站声明:本站所有资源均来源于互联网,本站不提供任何下载。如有侵犯您的权力请通知本站,确认属实后本站将作出修改。本站原创保留权利!!</div>
</div>
</div>
<div class="postbottom2" id="postend">
<div class="postuserinfo" style="height:28px;"><div style="float:left;">
<img src="skins/Default/ip.gif" style="margin: 4px;" alt="ip地址已设置保密" /></div>2006-10-19 19:21:19</div>
<div class="postie" style="height:28px;padding:0px;text-indent:10px;">
<div style="float:right;margin-right:5px;">
<div class="menu_popup" id="Menu_2">
<div class="menuitems">
<a href="TopicOther.asp?t=6&BoardID=6&id=262&ReplyID=561" title="向管理员举报该贴">举报帖子</a>
<br /><a title="对本贴使用论坛道具" href="javascript:openScript('plus_Tools_InfoSetting.asp?action=0&BoardID=6&TopicID=262&ReplyID=561',500,400)">使用道具</a>
</div>
</div><a href="post.asp?action=re&BoardID=6&replyID=561&ID=262&star=1&reply=true"><img src="skins/Default/reply.gif" border="0" alt="引用回复这个贴子" style="margin:4px;border:0px;" /></a> <a href="post.asp?action=re&BoardID=6&replyID=561&ID=262&star=1"><img src="skins/Default/reply_a.gif" border="0" alt="回复这个贴子" style="margin:4px;border:0px;" /></a>
<img src="skins/Default/topicmanage.gif" alt="" style="margin:4px;cursor: pointer;" onmouseover="showmenu(event,'','Menu_2');" />
<a href="#top"><img src="skins/Default/p_up.gif" alt="" style="margin:4px;border:0px;" /></a>
</div><div>[声明] 本站部分资料来自于网络,如有问题请联系本站!!</div></div>
</div>
<br />
<div class="mainbar0" style="height:26px;text-align : left;">
<div style="height:26px;float:right;">
<table class="tableborder5" cellpadding="0" cellspacing="1">
<form action="dispbbs.asp?boardid=6&replyid=560&id=262&page=2&skin=0" method="post" name="PageForm" target="">
<tr align="center">
<td class="tabletitle1" title="总数" style="text-align : right; "> 2 </td>
<td class="tabletitle1" title="本页贴数"> 2 </td>
<td class="tabletitle1"> 1/1页 </td>
<td class="tablebody1"> <img src="images/pagelist/First.gif" border="0" alt="" /> </td>
<td class="tablebody2"> <font class="normalTextSmall"><u><b>1</b></u></font> </td>
<td class="tablebody1"> <img src="images/pagelist/Last.gif" border="0" alt="" /> </td>
<td class="tablebody1"><input type="text" name="Star" size="1" value="1" class="PageInput" /><input type="submit" value="GO" name="submit" class="PageInput" /></td>
</tr>
</form>
</table>
<span id="showclose">
</span>
</div>
<select name="BoardJumpList" id="BoardJumpList" onchange="if(this.options[this.selectedIndex].value!='')location='index.asp?boardid='+this.options[this.selectedIndex].value;">
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -