Cortex-M 级别转换
一、 简述 Cortex-M 里面有特权级别的概念,不同级别可以设定不同的权限,如何转换特权级别基本是本章的内容。二、操作模式 ARM M 核操作模式有两个:
[*]线程(Thread)模式:在复位时或异常处理完成返回后进入此模式。此模式可以为特权,也可以为非特权.可使用任意栈指针(stack pointer)
[*]处理(Handler)模式:在进入异常处理时进入此模式,只有此模式才能从异常中退出。此模式总是特权的。只能使用主栈指针(main stack pointer)
注意: Reset 是异常的一种特殊形式,会以一种可能不可恢复的方式终止当前执行。
2.1 特权 代码可以运行在特权和非特权运行,非特权执行限制或排除对某些资源的访问。特权可以访问所有资源。
可以分为以下两种:2.1.1 Supervisor 在此特权下,可以往 CONTROL 寄存器的 bit0 位(nPRIV)写入 1,那么,就会进入非特权。
2.1.2 User 在 User 级别下,可以调用 SCV 指令,进入Supervisor 异常,由于在 Handler模式下透视特权级别,所以可以在这里面往 CONTROL 寄存器的 bit0 位(nPRIV)写入 0,那么就可以进入特权模式。 在 User 级别下,如果访问权限不允许的数据访问,会导致异常。如处于非特权下去访问一个设置为仅有特权才能访问的内存区域,那么就会发生 MemManage 异常。 User 级别下,特殊寄存器(如 CONTROL)的访问被忽略。
可以参考 Contex-M4,对此的限制为:
[*]对 MSR 和 MRS 指令限制访问
[*]不能访问系统定时器、NVIC 或系统控制块(SCB)
[*]可能对外设和内存有访问限制
注意:CONTROL 是特殊寄存器,需要是用 MSR 才能进行赋值,如 MSR CONTROL, r0。需要用 MRS 才能赋值给通用寄存器,如:MRS r0, CONTROL。
三、参考文档(1) ARM:《DDI0403E_d_armv7m_arm.pdf》
处理器通过 特权模式和 非特权模式实现权限分离
在特权模式下,可访问所有寄存器和所有内存区域
CONTROL:0 = 特权模式
1 = 非特权模式
一旦进入非特权模式,只能通过异常或复位返回特权模式
异常返回时,通过 EXC_RETURN 决定返回后的模式
若需永久返回特权模式,需在异常中修改栈帧中的 EXC_RETURN 值。
若启用了 内存保护单元,特权级别与 MPU 区域权限共同决定访问权限:
临时权限提升通过 SVC 系统调用,需预先设计异常处理程序
如果非特权模式调用 __set_PRIMASK() 导致 HardFault,那么可以尝试改用 __disable_irq()
页:
[1]