[产品应用] Cortex-M 级别转换

[复制链接]
421|11
 楼主| eefas 发表于 2025-6-19 09:34 | 显示全部楼层 |阅读模式
一、 简述
          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》


xiaoqizi 发表于 2025-7-3 18:31 | 显示全部楼层
处理器通过 特权模式和 非特权模式实现权限分离
木木guainv 发表于 2025-7-3 20:50 | 显示全部楼层
在特权模式下,可访问所有寄存器和所有内存区域
Jiangxiaopi 发表于 2025-7-3 23:07 | 显示全部楼层
CONTROL[0]:
[size=0.875em]0 = 特权模式
[size=0.875em]1 = 非特权模式

荣陶陶 发表于 2025-7-4 09:22 | 显示全部楼层
一旦进入非特权模式,只能通过异常或复位返回特权模式
Zhiniaocun 发表于 2025-7-4 11:41 | 显示全部楼层
异常返回时,通过 EXC_RETURN 决定返回后的模式
Zuocidian 发表于 2025-7-4 13:56 | 显示全部楼层
若需永久返回特权模式,需在异常中修改栈帧中的 [size=0.875em]EXC_RETURN 值。
Puchou 发表于 2025-7-4 16:20 | 显示全部楼层
若启用了 内存保护单元,特权级别与 MPU 区域权限共同决定访问权限:
Xiashiqi 发表于 2025-7-4 18:32 | 显示全部楼层
临时权限提升通过 SVC 系统调用,需预先设计异常处理程序
小海师 发表于 2025-7-4 20:50 | 显示全部楼层
如果非特权模式调用 [size=0.875em]__set_PRIMASK() 导致 HardFault,那么可以尝试改用 __disable_irq()
Haizangwang 发表于 2025-7-4 23:01 | 显示全部楼层
正确使用特权级别可显著增强系统安全性
星空魔法师 发表于 2025-7-7 21:41 | 显示全部楼层
这个帖子很好地解释了Cortex-M核中的特权级别和操作模式,对于嵌入式开发人员来说非常有用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

98

主题

3152

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部