Tricore TC1.6.2内核关于MPU(内存保护单元)的原理及应用实践
阐述英飞凌AURIX系列MCU TC1.6.2内核关于MPU模块的实现原理及应用实践过程。
目录
一、版本控制
版本 | 撰写日期 | 撰写记录 | 字体颜色 |
V1.0 | 2023.12.09 | 以当前时间点对英飞凌TC1.6.2内核MPU模块的认识及实践,撰写了此文档,旨在阐述TC1.6.2内核关于MPU模块的实现原理及应用实践过程。 | 黑色(有部分红色字体仅为辨识突出) |
二、功能概述
MPU模块采用了硬件机制,可实现用户指定的内存范围免受未经授权地数据读取、数据写入和指令访问;在配置MPU的过程,就是赋予一些对象对一些内存区域一定的数据和代码访问权限,当一些对象访问了一些未经授权的代码和数据时,就会产生MPU Trap。
三、主要模块
按照TC1.6.2内核关于MPU的实现原理,可分为以下几个主要模块来分开阐述,以便更好地理解TC1.6.2内核如何有效、高效地实现内存保护。
(一)Protection Ranges
- MPU保护的内存范围有两种,一个是数据,一个是指令,每个内存范围有低地址和高地址,从而实现特定范围。
- 每个CPU内核可设置的数据和代码的保护范围有多个,数量从4到32个不等,不同的系列芯片有所不同;
- 数据内存保护范围的起始地址和结束地址是8字节对齐的,所以可以看到相应寄存器的低3位是Reserve的。
- 指令内存保护范围的起始地址和结束地址是32字节对齐的,所以可以看到相应寄存器的低五位是Reserve的。
(二)Access Permission
- MPU针对每个设定的内存范围,数据有读和写的权限设置,指令有执行的权限设置。
- DPRE和DPWE的各位控制了对应的数据内存范围的读和写的权限,CPXE的各位控制了对应的指令内存范围的执行权限。
(三)Protection Sets
- 每个CPU内核有保护集的概念,保护集的数量从1-8个不等,不同系列的芯片有所不同;
- 每个保护集都有DPRE/DPWE/CPXE这三个寄存器,可以实现特定的内存保护策略;
- 保护集允许了不同保护策略的快速切换,当更换权限模式和用户任务时。
(四)PSW.PRS
- 程序运行状态字寄存器PSW的位域PRS控制了此时有效的保护集;
(五)SYSCON.PROTEN
系统配置寄存器SYSCON的PROTEN位用来使能当前核的内存保护功能。
(六)DMI
- 数据存储器接口(DMI)向CPU提供数据值并存储CPU提供的数据值;
- 每当发生数据存储器保护陷阱时,DSTR(数据同步陷阱寄存器)和DEADD(数据错误地址寄存器)都会更新;
- 发生了数据访问错误时,会在DMI寄存器DSTR的位域MPE置位,DEADD寄存器会显示错误发生的地址。
四、功能实践示例
理解以上所述的主要模块后,编辑代码做一个简单的功能实践,总体的步骤有:
1. 根据需求设置Protection Ranges,包括代码和数据;
2. 在特定的保护集设置各个内存保护区间的访问权限,即设置Access Permission,包括代码的执行权限,数据的读、写权限。
3. 设置PSW的PRS位域,选择特定的保护集;
4. 设置系统配置寄存器SYSCON.PROTEN == 1,使能内存保护。
需要注意的是,这些内核特殊功能寄存器(CSFR)的读写应使用MFCR指令读取,使用MTCR指令写入。
设置CPU0对数据MPU_Test_Data[0]~MPU_Test_Data[5]的内存空间没有写权限,但有程序给MPU_Test_Data元素赋值时,发生MPE故障,如下图所示:
MPE表示DMI发生了内存保护故障,故障的地点在0x70000450,正合适是MPU_Test_Data[0]~MPU_Test_Data[5]所在的内存空间:
五、参考文档
1.《TC3xx User Manual part1.pdf》
2.《TC3xx Architecture vol1.pdf》
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)