第二节 权限级模型

2.1 基本概念

CPU在运行时都会处于一个权限级中。从程序员角度看,权限级可以简单地看作是CPU被允许运行的指令范围、可以访问的寄存器集合和地址范围。一般而言,CPU可以支持多个权限级,CPU可以运行在不同的权限级上,但是在一个时间点上只能处于其中一个权限级上。

  1. 当CPU处于低权限级时,CPU的权限能力比较低,即可以执行的指令类型和数量较少,访问的寄存器类型和数量也比较少,可以访问的物理和虚拟地址范围也受限。
  2. 当CPU处于高权限级时,CPU不仅具有较高的权限能力,同时也可以定制低权限级的访问能力。

飞腾arm架构报错 飞腾 cpu 架构_寄存器


图1-1 飞腾CPU权限级模型

飞腾CPU支持四种权限级EL0/1/2/3:

  1. EL0是应用级权限,权限最低,CPU主要运行应用软件;
  2. EL1是特权级,CPU主要运行Linux操作系统内核软件;
  3. EL2是超特权级,CPU主要运行虚拟机监控器软件,主要用于虚拟机创建和管理;
  4. EL3是安全级,也是最高权限级,CPU主要运行安全监控软件。

大部分飞腾CPU系统寄存器的命名都有一个权限级ELx(x=0/1/2/3)后缀,表示允许操作该寄存器的最低权限级。例如中断状态寄存器ISR_EL1,除了EL0权限级不能访问,其他都可以访问。

在权限级EL1/2/3下,软件可以通过读取当前权限级寄存器CurrentEL,来识别当前的权限级。

2.2 权限级切换

有且只有CPU触发异常时,CPU才可能从低权限级到高权限级的切换,当异常触发时,CPU的权限级要么升高,要么不变,一定不会降低;
CPU从高权限级到低权限级切换,只需要异常返回就可以实现,当异常返回时,CPU的权限级要么降低,要么不变,一定不会升高。

需要注意,在EL0级异常触发后,飞腾CPU的权限级一定会升高。

在异常触发或者异常返回之后,CPU进入新的权限级之前的这段过程,我们称之为“权限级切换”过程。

飞腾CPU在异常触发后切换到新的权限级之前,飞腾CPU会将发生异常时的处理器状态和异常返回地址分别自动保存起来,这过程会用到两类寄存器:

32位的保存处理器状态寄存器。保存处理器状态寄存器是一个处理器状态记录寄存器,记录了最近一次异常发生时的处理器状态。
64位的异常链接寄存器。异常链接寄存器根据异常类型来保存异常返回地址,例如页故障异常,就保存触发异常的访存指令地址;如果是系统调用,就保存触发异常指令的下一条指令地址。

飞腾CPU提供了三组保存处理器状态寄存器SPSR_EL1/2/3和异常链接寄存器ELR_EL1/2/3。当异常触发要进入权限级ELx时,SPSR_ELx和ELR_ELx就会自动被CPU使用。例如 飞腾CPU在EL0权限级下进行系统调用,即自陷指令SVC触发系统调用异常,CPU先会自动将在EL0时的状态保存在寄存器SPSR_EL1中,并将返回地址保存在寄存器ELR_EL1中,最后才进入EL1权限级。
在权限级ELx运行的飞腾CPU,一旦调用异常返回指令ERET,飞腾CPU会在跳转到异常链接寄存器ELR_ELx指定的地址之前,并将CPU恢复到保存处理器状态寄存器SPSR_ELx记录的状态。需要说明的是,异常返回指令ERET执行之前,系统软件可以根据需要修改这两个寄存器。

2.3 安全态

除了权限级,飞腾CPU的运行状态,还有另一个维度描述,即安全态和非安全态。

  1. 非安全态下,CPU主要用于通用软件,可用于虚拟机、云平台等应用场景;
  2. 安全态下,CPU主要用于运行可信度量、安全认证、密钥服务等安全软件。

飞腾CPU在非安全态下,支持EL0/1/2三个权限级;

当飞腾CPU在安全态下,当前只支持EL0/1/3三个权限级,不支持EL2主要是考虑在安全态下的软件比较紧凑,一般不会用到虚拟机。

安全态和非安全态的状态切换,只能通过权限级EL3来实现;也就是说,只有在权限级EL3时,飞腾CPU才可以通过安全态配置寄存器SCR_EL3,直接实现安全态和非安全态的切换。

非安全态EL0不能通过一次权限切换直接进入安全态EL1;
安全态EL0也不能通过一次权限切换直接进入非安全态EL1。