嵌入式实时操作系统的实时进程机制研究

2022-06-02 11:23杨弋仝敏卫一芃
中国新通信 2022年6期
关键词:嵌入式进程应用程序

杨弋 仝敏 卫一芃

【摘要】    为了满足嵌入式操作系统对空间保护、隔离故障、防止故障蔓延、空间和资源之间的分离保护机制等能力,本文在嵌入式操作系统中提出了实时进程的概念。通过研究实时进程的功能架构、实时进程的资源管理、空间管理划分及映射、实时进程的通信、运行方式等功能,剖析了实时进程在嵌入式操作系统与UNIX/Linux等传统桌面系统的功能差异,以及不同于传统进程模型的功能特点。随着嵌入式实时操作系统在各个领域应用越来越广泛,越来越多的新技术的应用都需要高可靠实时性强高安全的系统作为技术支撑,实时进程机制将在嵌入式实时操作系统中发挥关键作用。

【关键词】    嵌入式实时操作系统    实时进程

引言:

嵌入式操作系统产品出现于20世纪80年代初,从最初的只有一个微内核到发展到现在成了一个具有庞大生态的复杂系统。早期的嵌入式操作系统的应用场景单一,功能简单,嵌入式硬件的结构和功能也相对单一,应用的开发人员甚至不需要使用操作系统就可以完成一个产品的研发;早期的嵌入式操作系统与应用之间并没有空间和资源之间的分离保护机制,这种特性具有更好的灵活性与性能,但随着嵌入式操作系统的发展,以及应用场景逐渐复杂,原有的操作系统架构已经不能够很好的支撑当下的应用场景。在面向航空、航天、核电、轨道交通等强实时性高安全领域,系统集成复杂度的提升,带来的就是应用与系统的确定性和稳定性的下降。随着空间保护、隔离故障防止故障蔓延的概念的提出,近年来一些新型的嵌入式实时操作操作系统提出了实时进程(Real Time Process)的机制,该机制实现了应用与应用、应用与操作系统空间隔离的能力。实时进程能力不仅可以保证应用程序的故障不会蔓延到其他应用程序及核心,同时可以满足应用程序对于实时性的要求。本文主要介绍在嵌入式实时操作系统中的实时进程的主要能力及特点。

一、实时进程的功能组成

(一)实时进程的结构

操作系统管理和分配资源的基本单位为进程,[1]进程运行在用户态,每个进程都包含独立的地址空间,其中存放了应用程序所需的代码段、数据段、堆栈以及进程的相关资源(线程、信号量、消息队列等),进程内可以创建若干线程。对于传统的桌面系统,例如Linux/Unix,进程除了管理用户程序的空间和对象资源外,其本身也参与调度,而根据进程的调度属性,又可将进程分为实时进程与普通进程,其中普通进程的调度策略为CFS策略,[2]即公平调度原则策略;实时进程的调度策略为基于优先级抢占的先来先服务调度策略。本文探讨的嵌入式实时操作系统中的实时进程框架与上文描述的进程框架略有不同,首先,实时进程主要提供的是空间隔离保护的功能,其本身并不参与调度;其次,实时进程内运行的为任务,为了保证实时性,任务的调度策略为基于优先级抢占的先来先服务调度策略。实时进程的结构如图1所示:

(二)实时进程的运行单元

实时进程内包含有多个运行在用户态的任务,实时进程与任务之间是一对多的关系。用户可以创建多个实时进程,每一个实时进程又可以创建多个任务。实时进程提供任务之间的空间隔离和操作系统之间的空间隔离;实时进程内的所有任务共享实时进程内的资源,包括对象、堆空间、设备等。实时进程内的任务调度策略包括基于优先级抢占的先来先服务策略及同优先级时间片轮转策略。实时进程内的任务在操作系统核心内均可见,系统内的所有实时进程的任务拉平调度,竞争的对象还是任务,与实时进程没有关系。

二、实时进程的空间管理

实时进程运行在逻辑空间内,通过操作系统提供的存储管理功能,由系统给应用分配独立的物理空间。不同的实时进程逻辑空间可以重叠,在应用程序访问内存时,通过处理器的MMU单元将实时进程的逻辑地址转换为实际的物理地址。

(一)实时进程的物理空间划分

操作系统的物理空间划分如图2所示,从低到高依次为:操作系统空间、IO空间,操作系统的物理空间访问范围为0x00000000-0xFFFFFFFF(此处仅描述32位系统的情况);对于实时进程而言,实时进程的空间,包括用于实时进程间通信的共享存储区空间均在操作系统运行时从操作系统堆中动态申请获得。

(二)实时进程的逻辑空间划分

每个实时进程应用都有自己的逻辑空间,且每个实时进程的逻辑空间访问范围均为0x00000000-0xFFFFFFFF(此处仅描述32位系统的情况)。实时进程可运行在用户态,也可以通过系统调用进入到核心态;运行在用户态时,可以直接访问实时进程的空间,当应用通过系统调用进入核心态时,由于实时进程保存了一份核心的页表拷贝,所以可以直接访问核心的空间。当实时进程发生切换时,需要进行MMU的切换。逻辑空间划分如图3所示:

(三)实时进程的空间映射

实时进程空间隔离能力基于处理器所支持的存储管理能力来实现,通过MMU机制,一方面可以实现虚拟地址空间到物理地址空间的映射,另一方面,可以为这种映射关系附加相应的读写属性,操作系统根据每个实时进程的不同的空间需求,将空间映射表作为实时进程管理的私有数据记录,每个实时进程都有相互独立且不重叠的物理空间。

实时进程的逻辑空间可以根据用户的需求进行设定,不同实时进程的逻辑地址可以相同或者不同。

三、实时进程的启动与资源管理

(一)实时进程的启动过程

实时进程的启动过程主要分为以下步骤:1.加载实时进程映像,读取映像信息;2.根据映像信息创建资源并跳转到映像的起始地址开始执行。实时进程的映像为一个标准的elf格式的可执行文件,在操作系统运行时动态的被加载到内存空间中并开始运行。通过操作系统的elf文件加载模块,对可执行文件映像进行解析,步骤如下:读取映像的elf文件头;计算文件头部信息中代码段、数据段、bss段的总大小,以及用户需要的实时进程堆空间大小,并针对以上空间大小申请物理空间;根据映像中段信息中的逻辑地址,建立逻辑空间到物理空间的映射;将映像中的代码段和数据段加载到内存中,并对bss段清零;刷新并无效数据cache和指令cache;读取映像头部中的映像的入口地址作为实时进程初始任务的跳转地址。在加载完毕实时进程映像后,还需要初始化一些基本的實时进程数据,主要包括:包括进程控制块,MMU空间等。在初始化完毕后,创建一个实时进程的初始任务,初始任务的启动入口为实时进程初始任务的跳转地址,初始任务开始执行则代表实时进程程序开始执行。

(二)实时进程的资源管理

实时进程在执行过程中,需要管理一些与实时进程相关的资源,主要包括:代码段、数据段和bss段空间、用户堆栈空间,以上空间均从核心操作系统堆空间中分配;其他的用户应用所需的资源空间,包括用户申请的物理空间、对象空间、任务栈等,均从用户堆栈空间中分配。

四、实时进程间通信

实时进程间空间互相隔离,实时进程不能够通过访问其他实时进程内的空间。实时进程间通信主要采用公共对象或者共享存储区的方式。

(一)实时进程的公共/私有对象

实时进程内的消息队列或者信号量等可用于通信的对象具有私有/公共的属性,具有私有属性的对象仅能够在当前实时进程内使用,其他实时进程无法访问;如果实时进程内的任务需要与其他实时进程内的任务进行通信,则需要使用具有公共属性的消息队列或信号量等对象。对于一个公共对象,创建时其名称格式为“/***”,对于私有对象,名称前不允许加“/”,系统通过“/”来区分公共和私有。

公共消息队列缓冲空间为内核空间,由于每个实时进程间空间隔离,消息的发送与接收需要使用操作系统内核的一块缓冲空间进行数据过渡。当用户任务通过公共消息队列发送消息给另一个实时进程的任务时,首先通过系统调用访问进入核心态,之后将用户的消息缓冲空间的内容拷贝至操作系统内核的消息缓冲空间中;当用户任务通过公共消息队列接收另一个实时进程的任务发送的消息时,首先通过系统调用访问进入核心态,之后将操作系统内核的消息缓冲空间的内容拷贝至用户的消息缓冲空间中。

(二)共享存储区

共享存储区是一个或多个实时进程都可以访问的一块内存区域。共享存储区分为两种:共享数据区和共享IO区。一块共享数据区必须与一块物理内存区域进行关联。共享数据区对应于内核中的一块可用的内存区,用户可以自行指定一段已经映射但没有使用的物理空间或者由操作系统动态分配一段物理空间,作为映射的物理空间;用户可以自行指定一段已经映射但没有使用的逻辑空间或者由操作系统动态分配一段逻辑空间,作为映射的逻辑空间;最后建立逻辑空间到物理空间之间的映射。物理空间和逻辑空间必须按照MMU页面对齐。一块共享IO区必须与一块IO空间进行关联。共享IO区对应于系统中的某个IO设备,物理地址需要用户根据设备情况指定。用户可以自行指定一段已经映射但没有使用的逻辑空间或者由操作系统动态分配一段逻辑空间,作为映射的逻辑空间;最后建立逻辑空间到IO空间之间的映射。IO空间和逻辑空间必须按照MMU页面对齐。

共享存储区空间操作系统内核以及实时进程均可访问,根据共享存储区属性对共享存储区进行组织管理。共享存储区的属性主要包含:只读、只写、读写、不允许访问。完成共享存储区的建立后,共享存储区空间的访问属性已经确定,不能通过程序进行更改。

共享存储区由发起的实时进程通过接口进行创建,其他的实时进程要操作这段共享存储区时,通过接口对这块共享存储区打开后操作。

五、实时进程的中断异常

当中断/异常产生时,处理器进入核心操作系统的中断异常入口,对现场上下文进行保护,之后转入核心操作系统安装的中断异常处理程序,处理完成后,如果不需要通知实时进程,则执行上下文现场恢复,最后中断异常返回;如果需要通知实时进程,则通过信号的方式通知实时进程的任务。

当系统从核心返回用户任务时,如果此时系统产生了信号,系统会发送信号给用户任务,之后返回到用户任务,并执行信号处理。如果需要通过信号的方式在核心产生中断/异常时通知实时进程,则需要通过信号相关的服务挂接相应的信号处理服务。

六、实时进程的设备管理

实时进程使用设备管理的方式有以下两种:1.在核心操作系统中通过设备管理注册设备驱动,之后通过系统调用方式直接对核心设备管理进行调用使用,在实时进程应用中即可直接通过标准的IO接口来访问核心的设备。2.通过共享IO区将设备地址映射到实时进程中,通过直接访问IO空间的方式来访问设备。

七、实时进程的故障处理

实时进程中的应用在发生故障后,通过操作系统通过的故障检测报告机制来接管。应用程序使用故障检测报告接口注入的故障和操作系统内核通过通用故障注入接口注入的故障均交由故障检测报告处理。在故障发生后,可以通过故障检测报告机制对故障信息进行获取、记录和展现。故障相关信息包括故障位置、类型、操作系统状态、寄存器、堆栈信息等。在发生故障后可通过接口输出相关的故障信息。

实时进程故障注入包括以下来源:1.用户应用程序注入故障。用户应用程序自行判断运行逻辑错误,使用操作系统提供的用户故障注入用户接口注入故障,调用操作系统的故障处理功能,试图恢复应用程序的错误状态以及防止应用程序错误对操作系统和其他实时进程造成影响。2.实时进程运行状态检查。实时进程运行过程中在各关键环节检查数据、状态的正确性,如用户输入、请求资源等时机,当检测到故障时即调用故障处理功能。

故障检测报告的主要功能包括:1、记录应用程序和操作系统的故障信息,故障记录不会因重启而丢失。2.根据参数选择记录的故障信息内容,包括:时间、故障点文件位置、故障任务、内存信息、异常信息、寄存器信息、CoreDump、栈追踪信息等。3.提供记录故障前和记录故障后调用用户定义的故障处理动作的功能。4.提供管理故障日志记录的功能,如显示故障记录、清空故障记录等。5.可根据参数选择特定的故障日志显示方式,如仅显示致命故障、仅显示警告信息等。

八、结束语

本文研究了嵌入式实时操作系统中的实时进程机制,通过实时进程的功能架构、空间管理和划分及映射、实时进程的资源管理、实时进程的加载运行方式、实时进程间通信、实时进程对于中断异常,设备管理的处理以及实时进程错误处理方面,简要阐述了在嵌入式实时操作系统中的实时进程特性。随着嵌入式实时操作系统的发展,以及应用场景的逐渐复杂,安全性、数据保护以及空间隔离变得越来越重要。随着嵌入式实时操作系统在各个领域应用越来越广泛,越来越多的新技术的应用,如容器技术、深度学习等新兴技术都需要高可靠实时性强高安全的系统作为技术支撑,实时进程机制将在嵌入式实时操作系统中发挥关键作用。

作者单位:杨弋    仝敏    卫一芃    中国航空工业集团公司西安航空计算技术研究所

参  考  文  獻

[1] 仇阳. Linux内核进程调度算法发展.电子世界,2017,(07).

[2] 苏淑霞. Linux进程调度算法的研究及改进.数字技术与应用,2014,(09).

猜你喜欢
嵌入式进程应用程序
删除Win10中自带的应用程序
Dalvik虚拟机进程模型研究
谷歌禁止加密货币应用程序
快速杀掉顽固进程
不留死角 全方位监控系统
中外民主法制进程专题复习
嵌入式LINUX操作系统的研究
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序
嵌入式组件技术的研究及应用