特权级的软硬件协同设计
实现特权级机制的根本原因是应用程运行的安全性不可充分信任 .所以,计算机科学家和工程师想到了一个方法:让相对安全可靠的操作系统运行在一个硬件保护的安全执行环境中,不受到程序的破坏;而让应用程序运行在另外一个无法破坏操作系统的受限执行环境中.
- 应用程序不能随意访问地址空间
- 应用程序不能执行某些可能破坏计算机系统的指令
同时为了应用程序能获得操作系统的服务——应用程序和操作系统还需要有交互的手段.
- 低特权级的软件只能做高特权级允许它做的操作
- 超出低特权级能力的功能必须寻求高特权级的帮助
这样高特权级(操作系统)就成为低特权级(一般应用)的执行环境的总要组成部分.
为了实现这样的特权级机制,需要进行软硬件协同设计.一种简介的方式是: 处理器设置两个不同安全等级的执行环境,用户态特权级的执行环境和内核态特权级的执行环境.
- 明确指出可能破坏计算机系统的内核态特权指令集子集
- 规定内核态特权级指令子集中的指令只能在内核态特权级的执行环境中执行
- 处理器在执行指令前会进行特权级安全检查,如果在用户态环境中执行内核态特权级指令就会产生异常
传统的call
和ret
指令组合会直接绕过硬件的特权级保护检查,所以需要新的指令:
ecall
: 执行环境调用,具有用户态到内核态的执行环境切换能力的函数调用指令- 从当前特权级切换到比当前高一级
eret
: 执行环境返回,基友内核态到用户态的执行环境切换能力的函数返回指令- 切换到不高于当前特权级
硬件有了这样的机制之后,还需要操作系统的配合才能完成对操作系统自身的保护.
- 操作系统需要提供能在执行
eret
前准备和恢复用户态执行应用程序的上下文 - 在用户程序调用
ecall
后能检查应用程序的系统调用参数,确保参数不会破坏操作系统