表 2.1 寄存器及其功能
寄存器 功能
xPSR 记录 ALU标志(0 标志,进位标志,负数标志,溢出标志),执行状态,以及
当前正服务的中断号
PRIMASK 除能所有的中断——当然了,不可屏蔽中断(NMI)才不甩它呢。
FAULTMASK 除能所有的 fault——NMI依然不受影响,而且被除能的 faults会“上访”,见
后续章节的叙述。
BASEPRI 除能所有优先级不高于某个具体数值的中断。
CONTROL 定义特权状态(见后续章节对特权的叙述),并且决定使用哪一个堆栈指针
第 3 章对此有展开的叙述。
操作模式和特权极别
Cortex‐M3 处理器支持两种处理器的操作模式,还支持两级特权操作。
两种操作模式分别为:处理者模式(handler mode,以后不再把 handler 中译——译注)和线程模
式(thread mode)。引入两个模式的本意,是用于区别普通应用程序的代码和异常服务例程的代码
——包括中断服务例程的代码。
Cortex‐M3 的另一个侧面则是特权的分级——特权级和用户级。这可以提供一种存储器访问的
保护机制,使得普通的用户程序代码不能意外地,甚至是恶意地执行涉及到要害的操作。处理器支
持两种特权级,这也是一个基本的安全模型。
图 2.4 Cortex‐M3 下的操作模式和特权级别
在 CM3 运行主应用程序时(线程模式),既可以使用特权级,也可以使用用户级;但是异常服
务例程必须在特权级下执行。复位后,处理器默认进入线程模式,特权极访问。在特权级下,程序
可以访问所有范围的存储器(如果有MPU,还要在MPU规定的禁地之外),并且可以执行所有指令。
在特权级下的程序可以为所欲为,但也可能会把自己给玩进去——切换到用户级。一旦进入用
户级,再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写 CONTROL 寄存器
就回到特权级,它必须先“申诉”:执行一条系统调用指令(SVC)。这会触发 SVC 异常,然后由异常
服务例程(通常是操作系统的一部分)接管,如果批准了进入,则异常服务例程修改 CONTROL 寄存
器,才能在用户级的线程模式下重新进入特权级。
事实上,从用户级到特权级的唯一途径就是异常:如果在程序执行过程中触发了一个异常,处
理器总是先切换入特权级,并且在异常服务例程执行完毕退出时,返回先前的状态(也可以手工指
定返回的状态——译注)。
28
2021-07-26 15:37:28
9.63MB
权威指南
1