APP下载

嵌入式实时操作系统中系统调用方法的设计与实现

2011-05-21卫一芃李运喜

电子设计工程 2011年13期
关键词:体系结构调用分区

卫一芃,李运喜

(中航工业西安计算技术研究所 陕西 西安 710068)

随着微电子、容错、软件技术的发展,航空电子系统已逐步从原有的体系结构向综合化模块化航空电子系统(IMA)发展,以提高未来飞机的作战能力[1]。上世纪末,美国就已经开始研制新一代飞机,并制定了满足新一代飞机综合化要求的技术标准ARINC。其中,ARINC 653是美国航电委员会针对数据综合化的要求提出的应用程序接口标准[2-3]。新一代飞机的航电系统将是高度模块化、综合化的,其操作系统需采用专用的航电实时操作系统,在满足综合化要求以及保证实时性的前提下,对安全性要求非常高。在高安全性的实时操作系统中支持两种运行形态:系统态和用户态。用户态的程序在运行过程中可能需要使用系统态的功能,由于跨两态,用户态的应用不能直接调用系统态下的服务,因此需要使用系统调用机制为用户态的应用访问系统态的服务提供解决途径。

笔者详细讨论了某嵌入式实时操作系统中系统调用的机制以及实现方法。

1 概 述

某嵌入式实时操作系统是满足ARINC 653标准要求的嵌入式实时操作系统,其软件结构如图1所示。

图1 某嵌入式实时操作系统软件结构图Fig.1 Software structure diagram of an embedded real-time operating system

ARINC 653为保证IMA系统中运行的多个航电应用程序执行时不相互影响,提出分区的概念。分区是IMA系统中的一组功能相关的应用软件,这些软件在配置和执行时作为一个单一的软件来对待[4]。相当于通用操作系统中的进程,包含自己的存储器,上下文以及配置属性。分区OS运行在用户态,提供分区管理、分区间及分区内通信、时间管理、进程管理等功能。核心OS运行系统态,提供任务管理、任务间通信、信号管理、系统调用管理等功能。位于用户态下的程序不能直接访问系统态下的服务,系统调用机制为应用分区访问核心OS的服务提供解决途径,有效保护核心OS的安全[5-6]。

2 系统调用机制

内核提供应用的服务需统一编号,使用表方式统一管理。当用户态的应用需要调用内核提供的服务时,首先要执行一组特殊的指令使系统进入系统态,通过系统调用号查表得到函数的入口地址,执行内核服务,当调用完成后,内核将执行另一组特征指令将系统返回到用户态。这里将从系统调用号、系统调用表、系统调用生成及工作过程4个方面描述系统调用机制。

2.1 系统调用号

核心OS为每个系统调用定义一个唯一的编号,编号的定义方式如下:

#define__NR_函数名 X

其中,X代表系统调用号,系统调用号定义的部分代码如下:

#define__NR_SysCallInit 1

#define__NR_RegisterDynamicLibrary 2

#define__NR_fstat 18

#define__NR_creat 19

#define__NR_hmEventDispatch 20

通过这个独一无二的编号可以关联到一个特定的系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指定要执行的系统调用,进程不会提及系统调用的名称。

系统调用号一旦分配且完成编译,就不能有任何变更。

2.2 系统调用表

系统调用表(syscall_table)用于记录各个系统调用处理函数的入口地址,以系统调用号为偏移量能够很容易在该表中找到对应处理函数地址,部分代码如下:

.long SYM(syscall_entry) /*0*/

.long SYM(SysCallInit) /*1*/

.long SYM(fstat) /*18*/

.long SYM(creat) /*19*/

.long SYM(hmEventDispatch) /*20*/

2.3 系统调用生成

核心OS内的syscall.h文件中定义了所有核心OS提供给上层应用的函数。通过编译,系统生成系统调用号及系统调用表项,同时为每一个函数生成一个文件名为XXX_trap.c的文件,XXX代表函数名。该文件中记录用_syscallN()封装后的函数。

应用程序本身无法直接执行内核代码,而是通过引发一个异常来促使系统切换到系统态执行系统调用处理程序_syscallN(),其中N表示参数个数,在X86体系结构上支持函数最多带5个参数,PPC体系结构上支持函数最多带7个参数。

在陷入核心OS时,_syscallN()将系统调用号传给核心OS。在PPC体系结构中,系统调用号通过通用寄存器传入,系统调用处理程序一旦执行,可以从通用寄存器中获得数据,以下为PPC体系结构的_syscall2()代码片段:

#define_syscall2(type,name,type1,arg1,type2,arg2)

type name(type1 arg1, type2 arg2)

{

unsigned long__sc_ret;

{

register unsigned long__sc_0__asm__ ("r0");

register unsigned long__sc_3__asm__ ("r3");

register unsigned long__sc_4__asm__ ("r4");

__sc_3= (unsigned long) (arg1);

__sc_4= (unsigned long) (arg2);

__sc_0=__NR_##name;

__asm____volatile__

("sc "

: "=&r" (__sc_3)

: "0" (__sc_3), "r" (__sc_0),

"r" (__sc_4)

: __syscall_clobbers);

__sc_ret=__sc_3;

}

__syscall_return (type);

}

由上述代码片段可以看出,系统调用带有2个参数,分别通过寄存器r3和r4传递,系统调用号通过寄存器r0传递。

以打开文件函数creat()为例,通过编译后将生成creat_trap.c文件,该文件中记录通过系统调用处理程序封装后的creat()函数。应用程序调用creat()时,实际就是通过执行用_syscall2()封装后的函数从用户态进入系统态,完成系统调用功能。creat_trap.c文件中代码片段如下:

_syscall2(T_WORD,creat,T_CONST T_BYTE*,name,T_WORD,mode)

2.4 系统调用工作步骤

系统调用的工作步骤如下:

1)保存所有当前上下文(即用户态上下文);

2)应用程序通过软中断方式通知核心OS需要执行一个系统调用。X86体系结构上的软中断由int 0x80指令产生,PPC体系结构上的软中断由sc指令产生。

3)引起0x0c00中断(系统调用中断),进行异常处理,进入核心OS;

4)判断系统调用号是否合法,如果为非法系统调用号,则退出;否则根据系统调用号在系统调用表syscall_table中查找函数的入口地址,并跳转到该地址。

5)执行完毕后返回。

图2以creat()为例反映了系统调用的工作步骤。

图2 系统调用工作步骤Fig.2 Work steps of system call

3 阻塞性系统调用

分区OS中的进程通过系统调用产生阻塞性请求的时候,进程因等待系统调用的返回而阻塞。当分区OS中一个进程阻塞的时候,将导致整个分区阻塞,影响应用分区的正常执行。为解决阻塞性系统调用带来的问题,引入worker任务机制进行处理。

3.1 worker任务

当应用请求了阻塞性的服务时,核心OS中将会启动相应的系统任务来进行应用请求的操作,通过这样的方法实现异步IO机制。这种为实现异步IO操作而创建的系统任务称为worker任务。笔者将从worker任务创建、分派及清理3方面描述worker任务。

3.1.1 worker任务创建

每个分区可支持的worker任务数在配置数据中定义。在分区创建的过程中,将根据配置的worker任务数创建任务,这些任务隶属于对应的应用分区。所有创建的worker任务都处于worker任务空闲队列中。

3.1.2 worker任务分派

分区OS根据调用的服务是否为阻塞服务决定是否分派worker任务,分派worker任务前,首先从可用的worker任务队列中取得一个worker任务并激活该任务,将系统调用的方法交由worker任务处理,当worker任务能够获得资源则直接处理,完成后发送系统调用完成的事件,否则worker任务将阻塞在等待的资源上,直到资源被释放,方可启动运行,并通知应用分区。

3.1.3 worker任务清理

worker任务在处理阻塞性系统调用过程中,如果处于等待状态,那么在应用分区设置为IDLE模式、应用分区重启动过程中,需要对未完成的系统调用进行刷新操作,在对系统调用进行清理的同时,还需要对阻塞的worker任务进行清理,将阻塞在资源等待链上的worker任务摘除,并停止worker任务的执行。

3.2 worker任务处理机制

采用worker任务机制可以有效地解决应用分区因阻塞性系统调用而无法继续运行的问题。当系统调用发生阻塞时,启动worker任务去等待资源,而当前系统调用返回特定的状态给应用分区,应用分区经过状态判断,挂起分区内相应的应用进程,从而产生进程切换,执行其他应用进程,当worker任务等待的资源得到满足时,则解挂worker任务执行,并通过发送信号通知应用分区阻塞状态的解除。worker任务机制示意图如图3所示。

图3 worker任务处理机制示意图Fig.3 Schematic diagram of worker task processing mechanism

4 结束语

笔者深入研究了嵌入式实时操作系统中系统调用原理、参考国内外先进嵌入式实时操作系统中系统调用的实现方法,设计并实现了一种有效的系统调用方法,解决阻塞性系统调用给分区正常运行带来的影响,保证分区的正常运行。通过在某嵌入式实时操作系统中的实现,文中涉及的设计和实现方法是安全的、可行的、有效的。在今后的工作中,将着重于更进一步提高系统调用的访问效率及安全性方面的研究。

[1]王树红.嵌入式系统的现状及发展趋势[J].太原大学学报,2007,8(2):121-122,139.WANG Shu-hong,The present situation and developing trend of embedded system[J]Journal of Taiyuan university,2007,8(2):121-122,139.

[2]王丽杰.嵌入式实时操作系统设计探讨[J].软件世界,2007(20):51-53.WANG Li-jie.Discussion of embedded real time operating system design[J].Software World,2007(20):51-53.

[3]徐晓光,叶宏.分区间通信在航空电子系统中的设计与实现[J].航空计算技术,2005,35(1):45-47,58.XU Xiao-guang,YE Hong.The design and implementation of inter-partition communication in avionics systems[J].Aeronautical Computing Technique,2005,35(1):45-47,58.

[4]ARINC.Specification 653-1,avionics application software standard interface[S].2003.

[5]Rushby J.Partitioning in avionics architectures requirements mechanisms and assurance[R].NASA,2000.

[6]葛仁北.系统调用与操作系统安全[J].计算机工程与应用,2002(19):97-99.GE Ren-bei.System call and computer operation system security [J].Computer Engineering and Applications,2002(19):97-99.

猜你喜欢

体系结构调用分区
上海实施“分区封控”
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
浪莎 分区而治
基于系统调用的恶意软件检测技术研究
基于粒计算的武器装备体系结构超网络模型
作战体系结构稳定性突变分析
基于DODAF的装备体系结构设计
基于云计算的航天器控制系统自组织体系结构
基于SAGA聚类分析的无功电压控制分区