照例先上两段原文:
不是人话的翻译:
线程模式(Thread mode)是ARMV7-M 的复位后的运行模式。线程模式又分为“用户等级”(直译“无特权级”,unprivileged)和“有特权级”(privileged)。
线程模式下可以使用SVC指令,来触发 SVCall 例外,该例外能将运行模式改为“管理者模式”(Hander mode);也可以直接处理系统访问和控制。
所有的例外,都运行在管理者模式。
ARM内核设计了 SVCall 例外, 可以用来代替应用程序管理资源, 例如外设交互、软件栈的内存管理和分配
CONTROL.nPRIV 用来配置,线程模式下内核的特权等级。
管理者模式下,永远处于“有特权级”
以下为是人话的翻译:
ARMV7-M 有两种运行模式和两种特权等级:
ARMV7-M的两种运行模式
线程模式:系统复位(进入复位例外)后处于该模式。
管理者模式:进入除了“复位例外”的其它例外后,处于该模式。
ARMV7-M 的两种特权等级,“有特权级”和“无特权级”,通过 CONTROL.nPRIV 或 运行模式控制:
有特权级:只要进入例外,将处于该等级。此时可以执行所有指令,访问所有寄存器。
无特权级:线程模式下,CONTROL.nPRIV 写 1,将处于该等级。此时执行指令和访问寄存器,都会受限。比如,该等级下 CONTROL.nPRIV 为只读(写操作会被忽略),即无法通过将 CONTROL.nPRIV 写0来恢复“有特权级”。
管理者模式下,内核特权等级与CONTROL.nPRIV无关,将永远处于“有特权级”。
当系统处于“无特权级”状态时,可以通过SVC指令,触发 SVCall 中断(例外),就可以进入“管理者模式”
运行模式 | CONTROL.nPRIV | 特权等级 | 备注 |
线程模式 | 0 | 有特权级 | 系统启动后默认状态 |
线程模式 | 1 | 无特权级 | |
管理者模 | 0 | 有特权级 | |
管理者模 | 1 | 有特权级 |
参考资料: