一种实时操作系统中的沙盒实现方法及系统与流程

摘要: 本发明涉及一种实时操作系统(rtos)中的轻量级沙盒(sandbox)实现方法。背景技术:1、适用于嵌入式系统的cpu通常在硬件上设计不同的运行模式,这些运行模...
一种实时操作系统中的沙盒实现方法及系统与流程

本发明涉及一种实时操作系统(rtos)中的轻量级沙盒(sandbox)实现方法。

背景技术:

1、适用于嵌入式系统的cpu通常在硬件上设计不同的运行模式,这些运行模式分为特权级(privileged)和非特权级(unprivileged)两类,两者对cpu硬件资源的控制权不同。特权级可以执行cpu的所有机器指令,可以读写cpu内部的系统控制寄存器(也称特权寄存器)。非特权级只能执行普通的计算、跳转和通用数据读写指令,无法直接修改影响cpu全局运行状态的系统控制寄存器。

2、适用于嵌入式系统的cpu可选地在硬件上设计有内存保护单元(memoryprotection unit,mpu)。mpu是cpu中的一个硬件组件,用于提高嵌入式系统的安全性和稳定性。mpu用于将内存划分为多个独立的区域,为每个区域设置特权级和非特权级的读、写、执行权限,防止一个任务意外修改其他任务或操作系统内核的数据。无mpu或者未开启mpu的cpu中,特权级和非特权级都可以直接读写任何外设、访问任何内存地址。有mpu且开启mpu的cpu中,特权级可以直接读写任何外设、访问任何内存地址;非特权级无法直接访问外设、只能访问mpu分配好的内存地址。

3、在传统的轻量级rtos(如threadx等)中,系统内核代码与用户应用代码通常被编译为单一的二进制固件,共享同一特权级与内存地址空间。

4、在opencpu方案中,系统内核代码与用户应用代码被编译为两个完全独立的二进制固件。系统内核将所有开放给用户的api(应用编程接口)函数指针填入存储器固定位置的跳表(jump table),供应用模块间接寻找api函数。系统内核还导出符号表,其中指定符号与所述跳表的绝对物理地址的映射关系,供应用模块编译链接使用。

5、现有的实时操作系统中的沙盒实现方法存在以下不足。

6、第一,如果轻量级rtos基于arm cortex-m架构的cpu,当触发内存越界时,cpu会自动将当前任务的上下文(如pc、状态寄存器)强行压入当前任务的堆栈中,开发者可从栈内存中读取导致崩溃的pc(program counter,程序计数器)指针。

7、如果轻量级rtos基于arm cortex-r架构的cpu,当发生数据终止(data abort)异常、预取终止(prefetch abort)异常等致命异常时,cpu不会自动压栈,而是进入特定的终止(abort)模式并使用专属的影子寄存器(banked registers)、协处理器cp15的特定的故障状态寄存器保存导致异常的错误信息。此时cpu隐藏了引发异常的应用任务的真实栈指针及状态,传统的错误与异常处理程序(error & exception handler,eehandler)无法进行异常溯源,无法提取上下文信息。

8、第二,rtos中的用户应用崩溃后丧失执行能力,其申请的互斥量、动态内存及驱动会话无法主动释放,其申请的全局变量在简单的就地重启后也无法清理,带着错误值重启后该应用容易引发二次崩溃。

9、第三,rtos中的一个用户应用可能包含多个用户任务,这些用户任务共享同一应用的全局变量、私有堆、消息对象及驱动会话,同时分别具有独立任务栈和调度状态。当其中任一任务发生越界访问或执行流异常时,若仅重启故障任务,其余任务仍可能持有旧实例的指针、队列消息、互斥量状态、定时器回调或驱动句柄,并继续访问已经被污染的共享内存,带有错误值的全局变量将极易引发二次崩溃。若直接整机复位,又会导致与故障应用无关的通信、定位、存储等系统业务同时中断。因此,需要将一个用户应用及其包含的全部用户任务、共享可写内存、私有堆和关联内核资源作为统一的故障恢复对象,而不是将单个任务控制块(tcb)作为故障恢复对象。

技术实现思路

1、本发明所要解决的技术问题是:如何针对arm cortex-r架构的cpu遇到异常时的终止模式,实现一种低开销、高稳定性、应用级隔离的沙盒实现方案。

2、为解决上述技术问题,本发明提出了一种实时操作系统中的沙盒实现方法,包括如下步骤。步骤s1:嵌入式系统采用实时操作系统rtos,嵌入式系统中的cpu具有且开启内存保护单元mpu;实时操作系统中的任务根据来源分为用户任务和特权任务两类,为每类任务设置cpu的运行模式和内存的允许访问范围;每个任务有一个对应的任务控制块;所有正在运行及挂起的用户任务构成一个沙盒。步骤s2:当实时操作系统首次启动或切换到一个用户任务时,特权包装入口将cpu由特权模式切换为非特权模式,并切换至该用户任务的用户栈。步骤s3:用户任务进入用户入口执行;一旦用户任务需要使用实时操作系统内核能力,就将对实时操作系统内核能力的使用请求编码为系统调用号及参数,并通过svc指令进入svc中断服务程序及分发器;所述svc中断服务程序及分发器从异常现场取得当前触发系统调用的用户任务对应的任务控制块,校验系统调用号、参数范围、沙盒状态。如果校验未全部通过,svc中断服务程序及分发器拒绝cpu切换至特权模式调用实时操作系统内核的能力。如果校验全部通过且判断该用户任务没有耗时或阻塞风险,svc中断服务程序及分发器允许cpu切换至特权模式执行该用户任务,后续进入步骤s4。如果校验全部通过且判断该用户任务存在耗时或阻塞风险,svc中断服务程序及分发器从异常现场提取出系统调用号及参数,封装为内核服务请求包提交给特权代理与分发任务。步骤s4:实时操作系统内核在特权模式下执行该用户任务;一旦为该用户任务完成资源创建后,实时操作系统内核生成对应影子节点;影子节点用于记录创建的资源类型、资源句柄或地址;影子节点挂载至该用户任务的任务控制块中的资源链表。步骤s5:当用户任务对特权模式的调用结束后,实时操作系统根据保存的异常前状态返回非特权模式下执行该用户任务。

3、进一步地,所述步骤s1中,来自用户应用的任务均为用户任务;每个用户任务在正常调度期间均以cpu的非特权模式执行;mpu将用户任务的内存访问范围限制为该用户任务所属用户应用的代码区、共享可写区、私有堆、对应用户栈和经授权的共享窗口;用户任务对系统内核、系统服务的访问均通过svc入口完成。来自用户应用以外的任务均为特权任务;每个特权任务在正常调度期间均以cpu的特权模式执行;特权任务的内存访问范围是全部内存地址。

4、进一步地,所述步骤s1中,每个用户任务对应的任务控制块用于记录资源链表、模式位、用户入口、用户栈顶和权限属性。

5、进一步地,所述步骤s3中,用户任务执行svc指令后,cpu自动将当前的当前程序状态寄存器cpsr复制一份存入备份程序状态寄存器spsr中,同时cpu进入特权模式处理者模式上下文;所述特权模式处理者模式上下文是执行硬件中断的地方,具有不能阻塞的特点。

6、进一步地,所述步骤s3中,所述svc中断服务程序及分发器通过读取链接寄存器计算出引发中断的svc指令的物理地址,从中解析出内嵌的立即数就是系统调用号;校验系统调用号是判断提取到的系统调用号是否超出实时操作系统内核维护的系统调用派发表的最大索引值;若未超出,系统调用号的校验通过。校验参数范围是指判断涉及内存读写的系统调用参数是否在沙盒内存空间起始地址和结束地址之间;如果是,参数范围校验通过。校验沙盒状态是指当svc中断服务程序被触发时,判断沙盒是否为正常状态;如果是,沙盒状态校验通过。

7、进一步地,所述步骤s3中,如果校验全部通过且判断该用户任务存在耗时或阻塞风险,所述特权代理与分发任务在特权模式线程模式上下文中调用真正的rtos内核函数,再将结果返回对应用户任务;所述特权模式线程模式上下文是日常任务或线程排队运行的地方,具有允许阻塞、允许切换的特点。

8、进一步地,所述步骤s5中,cpu自动将当前的spsr复制一份存入cpsr中,恢复之前被打断的任务的模式位与状态位。

9、进一步地,所述步骤s3至步骤s4的执行过程中,实时操作系统的故障处理方法包括如下步骤。步骤s31:如果嵌入式系统使用arm cortex-r架构的cpu,实时操作系统中的错误与异常处理程序捕获数据终止异常、预取终止异常后,在终止模式下读取影子寄存器、协处理器cp15的特定寄存器,并结合异常类型、异常前状态位修正故障代码地址。步骤s32:错误与异常处理程序综合异常前权限模式、当前任务控制块的模式位、故障程序计数器所属代码区间、故障代码地址及异常发生阶段,综合判定故障类型与修复方式。若出现异常前cpu处于非特权模式、且引发异常的任务控制块属于用户任务,则按照沙盒故障处理,后续进入步骤s33。若出现异常前cpu处于特权模式、或故障来源于系统内核、特权任务、关键驱动及异常处理代码,则按照操作系统故障处理。步骤s33:错误与异常处理程序修改链接寄存器中的内存地址,该内存地址让cpu在终止模式下执行一段预设代码;所述预设代码用于将引发异常的用户任务对应的任务控制块的状态由运行改为错误挂起,同时阻止沙盒内所有用户任务再发起新的svc指令请求,同时向阻塞等待的特权守护任务发送错误信号。步骤s34:特权守护任务遍历沙盒内的所有用户任务对应的任务控制块的资源链表,并按照依赖顺序进行清理。步骤s35:特权守护任务将沙盒内的所有用户任务加载至对应用户应用的内存空间,再将存储器中的有初始值的全局变量内容重新复制到对应用户应用的内存空间,清零无初始值的全局变量、沙盒内的所有用户任务对应的用户应用的私有堆及共享缓冲区、沙盒内的所有用户任务的用户栈。步骤s36:实时操作系统重新创建沙盒内的全部用户任务,并恢复各用户任务的入口地址、优先级、用户栈、初始参数和mpu配置;后续由实时操作系统的调度器依次运行沙盒内所有用户任务。

10、本发明还提出了一种实时操作系统中的沙盒实现系统,包括任务分类与沙盒构成模块、用户任务初始化模块、用户任务非特权执行模块、用户任务特权执行模块、调用结束返回模块。所述任务分类与沙盒构成模块用于将实时操作系统中的任务根据来源分为用户任务和特权任务两类,为每类任务设置cpu的运行模式和内存的允许访问范围;每个任务有一个对应的任务控制块;所有正在运行及挂起的用户任务构成一个沙盒。所述用户任务初始化模块用于当首次启动或切换到一个用户任务时,将cpu由特权模式切换为非特权模式,并切换至该用户任务的用户栈。所述用户任务非特权执行模块用于在用户入口执行用户任务;一旦用户任务需要使用系统内核能力,就将使用请求编码为系统调用号及参数并执行svc指令;从异常现场取得当前触发系统调用的用户任务对应的任务控制块,校验系统调用号、参数范围、沙盒状态;如果校验未全部通过,拒绝cpu切换至特权模式调用实时操作系统内核的能力;如果校验全部通过且判断该用户任务没有耗时或阻塞风险,允许cpu切换至特权模式执行该用户任务,后续进入用户任务特权执行模块;如果校验全部通过且判断该用户任务存在耗时或阻塞风险,将异常现场提取出系统调用号及参数封装为内核服务请求包提交给特权代理与分发任务进行处理。所述用户任务特权执行模块用于在特权模式下执行该用户任务;一旦为该用户任务完成资源创建,就生成对应影子节点挂载至该用户任务的任务控制块中的资源链表;影子节点用于记录创建的资源类型、资源句柄或地址。所述调用结束返回模块用于当用户任务对特权模式的调用结束后,根据保存的异常前状态返回非特权模式下执行该用户任务。

11、进一步地,所述沙盒实现系统中,用户任务非特权执行模块与用户任务特权执行模块共同构成了用户任务执行模块;所述用户任务执行模块中还包括用于故障处理的异常信息获取单元、修复方式判定单元、预设代码执行单元、资源清理单元、内存与变量重置单元、用户任务恢复单元。所述异常信息获取单元用于当嵌入式系统使用arm cortex-r架构的cpu时,捕获异常后,在终止模式下读取导致异常的错误信息,并结合异常类型、异常前状态位修正故障代码地址。所述修复方式判定单元用于综合判定故障类型与修复方式;若出现异常前cpu处于非特权模式、且引发异常的任务控制块属于用户任务,则按照沙盒故障处理,后续进入预设代码执行单元;若出现异常前cpu处于特权模式、或故障来源于系统内核、特权任务、关键驱动及异常处理代码,则按照操作系统故障处理。所述预设代码执行单元用于修改链接寄存器中的内存地址,该内存地址让cpu在终止模式下执行一段预设代码;所述预设代码用于将引发异常的用户任务对应的任务控制块的状态由运行改为错误挂起,同时阻止沙盒内所有用户任务再发起新的svc指令请求,同时唤醒资源清理单元。所述资源清理单元用于遍历沙盒内的所有用户任务对应的任务控制块的资源链表,并按照依赖顺序进行清理。所述内存与变量重置单元用于将沙盒内的所有用户任务加载至对应用户应用的内存空间,再将存储器中的有初始值的全局变量内容重新复制到对应用户应用的内存空间,清零无初始值的全局变量、沙盒内的所有用户任务对应的用户应用的私有堆及共享缓冲区、沙盒内的所有用户任务的用户栈。所述用户任务恢复单元用于重新创建沙盒内的全部用户任务,并恢复各用户任务的入口地址、优先级、用户栈、初始参数和mpu配置;后续由实时操作系统的调度器依次运行沙盒内所有用户任务。

12、本发明取得的技术效果是:将arm cortex-r架构的cpu遇到异常时的终止模式转换为可控的局部恢复事件;通过任务控制块中的资源链表与影子节点的设计,便于完整统计与彻底清理每个用户任务所申请的资源;将沙盒内所有用户任务作为统一的故障恢复对象。