Autosar-Os是怎么运行的?(内存保护)
写在前面:
入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!!
1.功能概述
以TC397芯片为例,英飞凌芯片集成了MPU模块, MPU模块采用了硬件机制,可实现用户指定的内存范围免受未经授权地数据读取、数据写入和指令访问;在配置MPU的过程,就是赋予一些对象对一些内存区域一定的数据和代码访问权限,当一些对象访问了一些未经授权的代码和数据时,就会产生MPU Trap。
2.硬件实现
对于MPU都有哪些元素?
2.1Protection Ranges
MPU保护的内存范围有两种,一个是数据,一个是指令,每个内存范围有低地址和高地址,从而实现特定范围。
以TC397芯片为例,TC397芯片有六个Core,每个Core有18个DataMemoryProtectionRanges,10个CodeProctectionRanges。
- 每个CPU内核可设置的数据和代码的保护范围有多个,数量从4到32个不等,不同的系列芯片有所不同;
- 数据内存保护范围的起始地址和结束地址是8字节对齐的,所以可以看到相应寄存器的低3位是Reserve的。
- 指令内存保护范围的起始地址和结束地址是32字节对齐的,所以可以看到相应寄存器的低五位是Reserve的。
2.2Access Permission
MPU针对每个设定的内存范围,数据有读和写的权限设置,指令有执行的权限设置。
- DPRE和DPWE的各位控制了对应的数据内存范围的读和写的权限,(DATA)
- CPXE的各位控制了对应的指令内存范围的执行权限。(Code)
2.3Protection Sets
- 每个CPU内核有保护集的概念,保护集的数量从1-8个不等,不同系列的芯片有所不同,TC397有6个;
- 每个保护集都有DPRE/DPWE/CPXE这三个寄存器,可以实现特定的内存保护策略;
- 保护集允许了不同保护策略的快速切换,当更换权限模式和用户任务时。
- 可以视为一个任务集合,在Application配置界面可以选择当前Application执行哪个等级的ProtectionSet。实现不同保护策略的快速切换。
2.4PSW.PRS
- 程序运行状态字寄存器PSW的位域PRS控制了此时有效的保护集;
2.5SYSCON.PROTEN
- 系统配置寄存器SYSCON的PROTEN位用来使能当前核的内存保护功能。
3.功能实现
3.1Protection Sets
Protections Sets和Code/Data Protection Type在Davinci Configurator的SIP包中根据定制的芯片类型以及预定义好的,只要使用的在配置Protection Range的时候引用就行。
3.2MemoryRegions
相关配置在OS-MemoryProtection-MemoryRegions路径下
3.2.1CodeMemoryRegions
Code-MPU只能添加PSx_X权限。
3.2.2DataMemoryRegions
添加PSx_R权限(read读权限)。若尝试在该memory区写flash会触发MPU hook。
在当前界面配置内存保护区域的起始地址和结束地址,以及其他核通过MemoryRegionProtectionUnit以及哪种ProtectionSets访问当前空间的资源。
MemoryRegionProtectionUnit配置该Protection Range属于哪一个Core的Data/Code MPU Protection Ranges。
举个例子:如果这块区域想要实现只有Core1有Write权限,其他Core只有Read权限。那么6个核都需要分别创建一个DataMemoryRegions,对应MemoryRegionProtectionUnit依次选择0-6。
MemoryRegionAccessRights配置这块区域不同Protection Set的R/W权限。
3.3App Memory Protection identifier
在Application界面可以通过App Memory Protection identifier配置当前Application执行的规则。
举个例子,我在DataMemoryRegions中MemoryRegionAccessRights配置了PS2_R,由于上图中Application配置App Memory Protection identifier = 2,那么当程序运行时,MPU会判断该Application是否执行W的操作,如果是,会触发MPU Hook。
3.4Scalability Class
Os-OS配置项中的Scalability Class选择SC3。
Autosar OS可分为四个等级:SC1~SC4)(SC: Scalability Class,可伸缩的类型 )。各等级支持的功能如下: