在处理器的安全方面,我们在ARM Cortex-M处理器系列上需要了解特权/用户模式,这个机制为访问不同资源提供了不同的访问控制,因此我们也可以使用特权/用户访问等级来理解,以避免对Cortex-M处理器的两种处理模式产生混淆。
访问等级
Cortex-M系列处理器提供两种代码执行等级,也即访问等级,分为特权等级与非特权等级。
非特权模式限制了对某些系统寄存器以及受保护的内存区域的访问。当尝试在非特权等级下,去访问这些受限资源时,处理器会忽略访问请求或者产生异常。
特权访问等级可以访问所有资源以及分区。
处理模式
Cortex-M系列处理器有两种模式:Thread Mode以及Handler Mode。
Thread Mode是程序运行所处的普通模式,Thread Mode既可以使用特权等级或者非特权等级的访问权限,处理器启动运行时即运行在Thread Mode,且拥有特权等级。[1]
Handler Mode是指处理器执行异常处理(或者是中断服务)时所在模式。[2]在这个模式当中,代码可以操作系统资源以及受保护内存分区。Handler Mode一定拥有特权等级。
例子
系统使用SysTick作为周期任务的时钟参考,如果希望在运行时修改时钟,那么你就需要修改SysTick控制寄存器,如果是在非特权模式进行操作,会产生错误。
另外一个用例是,当你希望对某些内存分区进行保护时,你需要用到MPU特性以及特权等级来进行控制。Cortex-M的MPU介绍可阅读:
特权等级的控制
对于特权等级的控制,对应于CONTROL寄存器的bit 0。处理器启动时PRIV为0,即特权等级,设置为1后进入非特权等级。但是此时无法在此状态下设置0回到特权等级,需要先进入Handler模式,然后才能设置PRIV并返回特权等级。
AUTOSAR OS
Trusted Application运行在特权等级的Thread Mode下,当然,它的中断和钩子函数也都运行在这个模式下。在执行这些任务,中断等的时候,MPU是不工作的。
对于Non-Trusted Application,是运行在非特权等级的Thread Mode下,但是它的中断和钩子函数等会运行在特权等级的Handler Mode下。这些情况下,MPU是使能的。
参考
-
^Introduction to Cortex-M3/M4 M0+ Security (Privileged/Non-Privileged Access Level) http://www.vlsiip.com/socsec/socsec_0004.html
-
^Understanding Access Levels – ARM Cortex-M https://www.iotality.com/armcm-access-levels/
原文始发于微信公众号(车载嵌入式软件开发):[Classic AUTOSAR学习] ARM Cortex-M处理器系列的访问等级/处理模式