微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > VXWORKS内核分析

VXWORKS内核分析

时间:11-11 来源:嵌入式研究 点击:

3. 内核设计的优点

wind内核的一个重要的设计特性是最小的抢占延时。其他的主要设计的优点包括史无前例的可配置性,对不可预见的应用需求的可扩展性,在各种微处理器应用开发中的移植性。

最小的抢占延时

正如前面所讨论的,禁止抢占是获得代码临界资源互斥操作的通常手段。这种技巧的不期望的负面影响是高的抢占延时,这可以通过尽量使用信号量实现互斥和保持临界区尽量紧凑被减小。但即使广泛地使用信号量也不能解决所有的可能导致抢占延时的根源。内核本身就是一个导致抢占延时的根源。为了理解其原因,我们必须更好地理解内核所需的互斥操作。

内核级和任务级

在任何多任务系统中,大量的应用是发生在一个或多个任务的上下文。然而,有些CPU时间片不在任何任务的上下文。这些时间片发生在内核改变内部队列或决定任务调度。在这些时间片中,CPU在内核级执行,而非任务级。
为了内核安全地操作它的内部的数据结构,必须有互斥操作。内核级没有相关的任务上下文,内核不能使用信号量保护内部链表。内核使用工作延期作为实现互斥的方式。当有内核参与时,中断服务程序调用的函数不是被直接激活,而是被放在内核的工作队列中。内核完成这些请求的执行而清空内核工作队列。

当内核正在执行已经被请求服务时系统将不响应到达内核的函数调用。可以简单地认为内核状态类似于禁止抢占。如前面所讨论的,抢占延时在实时系统中是不期望有的,因为它增加了对于会引起应用任务重新调度的事件的响应时间.

管操作系统在内核级(此时禁止抢占)完全避免消耗时间是不可能的,但减少这些时间是很重要的。这是减少由内核执行的函数的数量的主要原因, 也是不采用统一结构的系统设计方式的原因。例如,有一种流行的实时操作系统的每个函数都是在内核级执行。这意味着当一个低优先级的任务在执行分配内存、获得任务信息的函数时所有高优先级的任务被禁止抢占。

一个最小的内核

已经说明了一个最小内核的优点和构造高层操作系统功能的必要功能,我们使用这些操作原语来执行一个传统的内核级功能,而在VxWorks中作为任务级功能执行,内存管理。 在这个例子中,考虑用户可调用的子例程malloc, 用于分配所请求大小的内存区并返回一个指向该内存区的指针。假定空闲内存区是通过搜索一个空闲内存块的队列找到的,一个信号量必须被用来保护这个非抢占多用户资源。分配内存的操作如下:

获得互斥信号量
搜索空闲内存块链表
释放互斥信号量

值得注意的是搜索一个足够大的空闲内存块的可能的冗长的时间是发生在调用任务的上下文中。这是可以被高优先级的任务抢占的(除了信号量调用的这段执行时间)。

在一个标准的统一结构的实时内核中,内存分配例程操作如下:

进入内核
搜索空闲内存块链表
退出内核

整个内存分配发生在内核级,任务抢占被禁止如果高优先级的任务在此时变为就绪态,它必须等待直到内核为低优先级的任务完成内存分配。有些操作系统甚至在这段市时间禁止中断。

任务级操作系统服务

Wind River System的实时操作系统,VxWorks,显示了这样设计的一个最小内核是能够满足需求的。VxWorks是现在能够获得的独立于任何处理器的、拥有相当小内核的、功能完全的层次结构的实时操作系统。

VxWorks在内核之上提供了大量的功能。它包括内存管理,一个完整的BSD4.3网络包,TCP/IP,网络文件系统(NFS),远程过程调用(RPC),UNIX兼容的链接加载模块,C语言的解释界面,各种类型的定时器,性能监测组件,调试工具,额外的通信工具如管道、信号和套接字,I/O和文件系统,和许多功能例程。这些都不是运行在内核级,所以不会禁止中断或任务抢占。

可配置性

实时应用有多种内核需求。没有哪个内核有一个用来满足每种需求的很好的设计折衷。然而,一个内核可以通过配置来调整特定的性能特性,裁减实时系统来最好地适应一个应用的要求。不可预见的内核配置性以用户可选择的内核排队算法的形式提供给应用。

排队策略

VxWorks中的排队库是独立于使用他们的内核队列功能而执行的,这样提供了将来增加新的排队方式的灵活性。

在VxWorks中有各种内核队列。就绪队列是一个按优先级索引的所有等待调度的任务队列。滴答队列用于定时功能。信号量是一个等待信号量的被阻塞任务的链表。活动队列是一个系统中所有任务的一个先进先出(FIFO)的链表。这些队列中的每个队列都需要一个不同的排队算法。这些算法不是被内嵌在内核中,而是被抽取到一个自治的、可转换的排队库中。这种灵活的组织形式是满足特殊的配置需求的基础。

可扩展性

支持不可预见的内核扩展的能力与以有功能的可配置性是同样重要的。简单的内核接口和互斥方法使内核级功能扩展相当容易; 在某些情况下,应用可以仅利用内核钩子函数来实现特定的扩展。

内部钩子函数

为了不修改内核而能够向系统增加额外的任务相关的功能,VxWorks提供了任务创建、切换和删除的钩子函数。这些允许在任务被创建、 上下文切换和任务被删除的时候额外的例程被调用执行。这些钩子函数可以利用任务上下文中的空闲区创建wind内核的任务特性。

未来考虑

有许多系统函数现在变得越来越重要,而且会影响到内核设计时的抢占延时。尽管涉及这些问题一个完整的讨论超出了本文的范围,但值得简单地提一下。

RISC/CISC

设计一个独立于CPU的操作系统一直是一个挑战。随着新的RSIC(精简指令集)处理器变得很流行,这些难度也加大了。为了在RISC环境下有效地执行,内核和操作系统需要有执行不同策略的灵活性。
例如,考虑在任务切换时内核执行的例程。在CISC(复杂指令集,如680x0或80x86)CPU,内核为每个任务存储一套完整的寄存器,在运行任务的时候将这些寄存器换入换出。在一个RISC机器上,这样是不合理的,因为涉及到太多的寄存器。所以内核需要一个更精密复杂的策略,如为任务缓存寄存器,允许应用指定一些寄存器给特殊的任务。

移植性

为了使wind内核在他们出现的结构上能够运行,需要有一个可移植的内核版本。这使移植是可行的,但不是最优化的。

多处理

支持紧耦合的多处理需求要求实时内核的内部功能包含,在理想情况下,在远端请求内核调用,如从一个处理器到另一个处理器。这就要涉及到信号量调用(为处理器间同步)和任务调用(为了控制另一个CPU上的任务)。这种复杂性无疑会增加内核级功能调用的开销,但是许多服务如对象标识可以在任务级执行。在多处理系统中保持一个最小内核的优点是处理器之间的互锁可以有较好的时间粒度。大的内核将在内核级消耗额外的时间,仅能获得粗糙的互锁时间粒度。

Ada

Ada语言为实时系统设计者提供了象聚会机制这样的任务原语。异常处理、任务终止、终止替换和聚会都将潜在地影响内核设计。这些操作可以由前面讨论的任务和同步机制构造,为了保持减小抢占延时的设计目标,许多工作能够在任务级执行。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top