上一篇 | 返回主目录 | 下一篇
内存保护_2:RTA-OS内存保护逻辑及配置说明
- 3 OS配置说明
- 3.1 OS一些基本概念及相互关系
- 3.1.1 基本概念
- 3.1.2 相互关系
- 3.2 内存保护基本逻辑(RTA-OS)
- 3.2.1 应用集的基本分类
- 3.2.2 内存保护与应用集的关系
- 3.3 OS等级相关概念
- 3.4 一种可用的RTA-OS配置
- 3.4.1 OS等级配置
- 3.4.2 应用集参数设置
- 3.4.3 生成的重要参数及Hook函数说明
- 3.4.3.1 保护集参数说明
- 3.4.3.2 内存保护范围修改Hook函数说明
- 3.4.3.3 错误处理Hook函数说明
- 3.4.3.4 内存访问权限检查Hook函数说明
- 3.4.4 RTA-OS内存保护处理逻辑说明
- 3.4.4.1 内存范围保护逻辑
- 3.4.4.2 变量/地址访问权限检查逻辑
3 OS配置说明
3.1 OS一些基本概念及相互关系
3.1.1 基本概念
- SWC(软件组件:Software Compont):一个以功能或者功能集合为基础的概念,比如说开关采样、行车、泊车等,具体取决于软件上层功能划分
- Runnable(执行实体):软件组件的重要组成,功能实现的载体,比如说一个功能需要三种周期的任务去完成不同的任务,则至少需要三个不同的Runnable
- Task(任务):由OS直接管理调度的实体,也是软件功能组件Runnable的载体(简单来说,就是Runnbale在Task中被调用,在基础任务中,Runnable的周期取决于Task周期)
- ISR(二类中断):与传统意义上的中断类似,不过它由OS进行管理,可调用OS的部分服务
- Application(应用集):资源组成的功能单元,由中断、调度表、Alarm、任务等构成。这是一个资源集合的概念,在应用集之间访问存在较多限制(此处与内存保护、服务保护等概念紧密相关)
3.1.2 相互关系
3.2 内存保护基本逻辑(RTA-OS)
3.2.1 应用集的基本分类
- 可信应用集(Trust OS-Application):无内存访问限制、操作系统API以及可不必进行时间保护,可以在特权模式运行,并且假定不会发生内存保护错误(若发生此类错误,系统将会关闭OS或者跑飞)
- 不可信应用集(Non-Trust OS-Application):不允许在没有监控及保护的情况下运行,存在内存访问限制、OS相关API访问限制以及时间行为限制,并且不允许运行在特权模式下
3.2.2 内存保护与应用集的关系
如上一章所说,应用集为内存保护处理的分块单位(即在此应用集中的中断、任务等在没有特殊访问设置的情况下,访问权限会受到应用集类型的限制)。如下图所示,为非可信应用集的访问许可情况。
3.3 OS等级相关概念
SC1 | SC2 | SC3 | SC4 | |
---|---|---|---|---|
支持多核 | 支持 | 支持 | 支持 | 支持 |
内存保护 | — | — | 支持 | 支持 |
时间保护 | — | 支持 | — | 支持 |
调度表 | 支持 | 支持 | 支持 | 支持 |
OSEK OS | 支持 | 支持 | 支持 | 支持 |
备注:根据表格可知需要设定为SC3才可使用内存保护功能
3.4 一种可用的RTA-OS配置
3.4.1 OS等级配置
结合章节3.3知道,内存保护需要修改配置:
- “OsScalabilityClass”设置为”SC3/SC4“(取决于是否配置时间保护)
- “OsStatus”设置为“EXTENDED”
- “OsProtectionHook”设置为“True”
3.4.2 应用集参数设置
根据图中两个参数可设置三种应用集(可信、不可信、可信带保护)
3.4.3 生成的重要参数及Hook函数说明
3.4.3.1 保护集参数说明
如下,在"Os_Cfg.h"文件中生成三个配置参数
- 可信应用集默认值在此处无参数说明
- 不可信应用集掩码(0x1000),对比备注中的参数可知PRS = 1,IO = 0。即此时设置的保护集为“Protection Set 1”,用户模式为“ User-0 Mode”
- 可信带保护应用集掩码(0x2800),对比备注中的参数可知PRS = 2,IO = 2。即此时设置的保护集为“Protection Set 2”,用户模式为“Supervisor Mode”
从生成的参数可以看出来,不可信应用集使用保护集“Protection Set 1”,可信带保护应用集使用保护集“Protection Set 2”,因此在进行内存保护集选择时需要根据相应应用集配置的属性进行选择。
#define OS_TARGET_TRICORETASKING
#define OS_TRICORE_UNTRUSTED_MASK 0x1000U
#define OS_TRICORE_TRUSTEDWITHPROTECTION_MASK 0x2800U
备注: 1)、IO——[11: 10];
2)、PRS[2]——[15];
3)、PRS[1: 0]——[13: 12];
3.4.3.2 内存保护范围修改Hook函数说明
此函数调用的位置:
- 在调用访问受限的应用集之前
- 在调用属于访问受限的应用集的二类中断之前
- 在调用访问受限的应用集中的“Startup”、“Shutdown”、“ErrorHook”之前
- 调用访问受限的应用集中的“TrustedFunction”之前
在此函数中可根据传入的参数“ApplicationContext”对内存范围区域进行适当设置,“ApplicationContext”包含如下信息:
- Application:应用集ID
- CoreID:内核ID
- TaskID:任务ID(当为二类中断时,此处为INVALID_TASK)
- ISRID: 中断ID(当为任务时,此处为INVALID_ISR)
- Address:将分配的栈指针
- Size:用于设置栈溢出阈值(未见效果)
- Trusted:是否为可信应用集
FUNC(void, OS_CALLOUT_CODE) Os_Cbk_SetMemoryAccess(Os_UntrustedContextRefType ApplicationContext)
{
/* Set memory protection */
}
3.4.3.3 错误处理Hook函数说明
在出现错误时,会进入该函数,可根据传入的参数分别是否为内存保护错误(E_OS_PROTECTION_MEMORY)。可通过API获取核ID、应用集ID、中断ID或任务ID、Trap数据等信息,可根据这些数据进行不同的处理。
FUNC(ProtectionReturnType, OS_CALLOUT_CODE) ProtectionHook(StatusType FatalError)
{
/* Deal with error*/
}
3.4.3.4 内存访问权限检查Hook函数说明
在函数中可对变量、地址等的访问权限进行检查,可通过“Os_CheckTaskMemoryAccess”、“Os_CheckISRMemoryAccess”(根据所在函数的位置进行选择)进行检查。在调用这两个API后,OS会进入“Os_Cbk_CheckMemoryAccess”回调函数,在此函数中,可根据传入的参数进行相应地址权限检查,并返回相应的访问权限。
FUNC(AccessType, OS_CALLOUT_CODE) Os_Cbk_CheckMemoryAccess(ApplicationType Application, TaskType TaskID, ISRType ISRID, MemoryStartAddressType Address, MemorySizeType Size)
{
/* Judge memory range*/
}
FUNC(AccessType, OS_CODE) Os_CheckTaskMemoryAccess(TaskType TaskID, MemoryStartAddressType Address, MemorySizeType Size)
FUNC(AccessType, OS_CODE) Os_CheckISRMemoryAccess(ISRType ISRID, MemoryStartAddressType Address, MemorySizeType Size)
3.4.4 RTA-OS内存保护处理逻辑说明
3.4.4.1 内存范围保护逻辑
Task/Isr调度过程如下:
- 设置内存保护范围
- 根据应用集属性,设置保护集Id以及用户模式(IO模式)
- 进入Task/Isr
3.4.4.2 变量/地址访问权限检查逻辑
内存访问权限检查过程如下:
- 软件模块调用"Os_CheckTaskMemoryAccess/Os_CheckISRMemoryAccess"
- 将会进入“Os_Cbk_CheckMemoryAccess”,在此函数内检查地址的合法性,并返回相应的权限
- 返回软件调用模块,并得到相应的权限数据
上一篇 | 返回主目录 | 下一篇
#实现代码设计公司需求及设计,不方便展示