特权级、用户级间的切换:
程序特权级可以访问所有的存储器,而在用户级时便有所限制,以此来保护系统不被一些程序给破坏;
在特权级下只需通过修改CONTROL寄存器的第0位,置为1则进入用户级;当用户级要进入特权级则需要先进入handler模式(异常模式),在handler中配置CONTROL第0位置为1则可以回到特权级;在用户级是无法操作CONTROL寄存器的。
下表是CONTROL寄存器的两个位的功能:
CONTROL[1] | 堆栈指针选择 0=选择主堆栈指针 MSP(复位后缺省值) 1=选择进程堆栈指针 PSP 在线程或基础级(没有在响应异常——译注),可以使用PSP。在handler模式下, 只允许使用 MSP,所以此时不得往该位写1。 |
CONTROL[0] | 0=特权级的线程模式 1=用户级的线程模式 Handler 模式永远都是特权级的。 |
特殊功能寄存器不存在地址,只能被专用的MSR和MRS指令访问。
使用方式:
MRS <gp_reg> , <special_reg>; 读特殊功能寄存器的值到通用寄存器;
MSR <special_reg> , <gp_reg>; 写通用寄存器的值到特殊功能寄存器; 其中<gp_reg>是通用寄存器,<special_reg>是特殊寄存器;
程序启动后,线程模式会在CONTROL的指引下进入从特权级转为用户级运行,如果在用户级下面MSR命令自然是不能更改CONTROL特权的,那么如何解决?
刚才表格中说了handler模式下肯定是特权级的,那么我们就利用handler模式来解决这个问题。 在中断处理的时候(handler mode),加入代码&