一、背景
根据低ASIL等级开发的软件组件可能会错误地访问具有较高ASIL等级的软件组件的内存区域,从而产生干扰。在单独的内存区域或内存分区中执行软件组件可以防止这种内存访问冲突。
TriCore®保护系统具有隔离错误的基本功能。系统是不显眼的,施加很少的开销和避免不确定的运行时行为
保护系统结合了硬件机制来保护用户指定的内存范围不受未经授权的读、写或取指令访问。保护硬件也可以方便应用程序调试
下图为ETAS的一个图示
二、Tc27x相关寄存器
1、注意点
*1
梳理一个点:Tc27x描述 数据UM手册 每个CPU有四个内存保护寄存器集。这些集指定代码和数据的内存保护范围和权限,注意此处的每个CPU,因为每个CPU都有CSFR寄存器的基地址
所以在寄存器Memory Protection Regusters列表里面,只是显示了偏移地址信息,不可误认为总共就那么多。
*2
CPU必须使用MTCR和MFCR指令访问自己的CSFR寄存器。其他cpu的CSFR寄存器可以通过XBAR_SRI调用load和store指令来访问。
MFCR
MTCR
这两个指令用来存取核心寄存器, 也就是所谓的CFSR, 读取的话MFCR可以于任意模式运行, MTCR是写操作, 大多数的CFSR有Watchdog加锁, 写操作需要做解锁操作, 写完了把锁还原。
*3
保护范围是地址空间的连续部分,可以为其指定访问权限。
Lower Boundary <= Address < Upper Boundary
代码和数据保护范围的数量取决于具体的实现,每个范围的最少4个,最多16个
有待商榷的点:PSW.PRS对应了保护集的0\1\2\3
因为下面这句话 :在任何给定的时间,其中一个集是当前保护寄存器集,它决定当前任务访问内存的合法性。PSW.PRS字段确定当前保护寄存器集号。
2、注意几个强相关寄存器
1)、数据保护范围寄存器
DPRx_L -定义数据范围对x的下地址边界
DPRx_U -定义数据范围对x的上地址边界
2)、代码保护范围寄存器
CPRx_L -定义代码范围对x的下地址边界
CPRx_U -定义代码范围对x的上地址边界
此寄存器类似数据保护范围寄存器,不多赘述。
3)、保护集启用寄存器命名约定
CPXE_n为set-n定义启用执行权限的代码保护范围。
这里的ENABLE代表可被调用,16bit只是CPR[7:0]可用,因为CPR只有8组,这里的字节位对应于位置是值得注意的。
DPRE_n -定义set-n启用读权限的数据保护范围
这里有16组数据的范围,所以可以都使用的
DPWE_n—定义set-n启用写权限的数据保护范围
4)、PSW(每个核都有一个)
此寄存器需要十分注意的是PRS、IO寄存器位
PRS:选择活动的数据和代码存储器保护寄存器集。内存保护寄存器的值控制当前进程的负载、存储和指令获取。默认为0
00B:保护寄存器0
01B:保护寄存器1
10B:保护寄存器2
11B:保护寄存器3
IO :定对特殊函数寄存器和外围设备的访问级别(默认为2)
00B : User-0 Mode :禁止访问具有外设空间属性的内存区域,并导致PSE或MPP陷阱
01B : User-1 Mode :定期访问外围。允许访问没有特殊保护的常见外围设备,包括对串行I/O端口的读/写访问,对计时器的读访问,以及对大多数I/O状态寄存器的访问。这个级别的任务可以禁用中断。(该模式的默认行为可能会被系统控制寄存器覆盖)。
10B : Supervisor Mode :允许访问所有外围设备。它允许对核心寄存器和受保护的外围设备进行读写访问。这个级别的任务可以禁用中断。
5)、SYSCON
需要注意的字节位置PROTEN
Memory Protection Enable
启用内存保护系统。内存保护是通过内存保护寄存器集来控制的。注意:在将PROTEN设置为1之前,要对保护寄存器进行初始化。
0:表示关闭内存保护。
1:表示Memory Protection处于开启状态
三、 使用方法
1、内存方面
CPR上下限应该为PF或者PSPR区域
DPR上下限应该为DF或者DSPR区域
PSPR和DSPR地址信息和Core有关
2、在ECUM里面初始化MPU
这个各家看心情吧,STARTOS之前,注意的是假如多核操作的话此函数在每个Core都会调用一次,这样子就会在MPU里面的GetCoreId进行初始化每一个。
3、OS回调CBK检查
这个是必须的,在初始化之后,随着程序的执行,需要观察你要调用的地方是否出现内存保护,出现了不再执行内存保护的地方,进入HOOK。
4、机理
当保护系统启用时,每次内存访问(读、写或执行)在访问之前都要检查合法性。合法性由以下所有因素决定:
•SYSCON寄存器中的保护启用位(SYSCON. PROTEN)
•当前选择的保护寄存器集(PSW.PRS)
•保护寄存器集中选择的范围
•为保护集选择范围的访问权限集
5、补充点
为了从程序空间中读取数据,数据地址范围表中必须有一个包含正在读取的地址的条目。相反,在代码地址范围表中必须有一个包含正在读取的指令的条目。
保护系统不区分访问权限级别。无论当前权限级别为“Supervisor”、“User-1”或“User-0”模式,数据保护和代码保护设置的效果相同。
对于指令获取,将根据当前保护集的启用执行代码保护范围检查获取的PC值。当发现一台PC不在所有启用的执行范围内时,则拒绝该访问的权限。当一台PC被发现在一个允许执行的范围内,就允许访问。
对于读写操作,将针对当前保护集的已启用读数据保护范围检查数据地址值。当发现一个地址不在所有所选范围内时,将拒绝访问权限。当发现一个地址在一个允许的范围内时,就允许访问。
保存或恢复上下文到上下文保存区域不需要保护系统的权限。