4.5. 特权等级和特权指令概述

现代软件系统出于接口安全和资源隔离考虑,通常采用分层、分模块的设计与管理方式。不同层级和模块拥有不同的处理器或硬件资源访问权限,这些权限等级称为特权等级(Privilege Level,PLV)。简单的软件分层和模块化设计如图3-2所示。

系统分层

一般来说,越接近底层的模块,特权等级越高,可访问的资源级别或权限也越高。龙芯架构将处理器核划分为4个特权等级,即PLV0~PLV3。其中,PLV0权限最高,也是唯一能够执行特权指令并访问全部特权资源的等级。PLV1~PLV3在MMU采用映射地址翻译模式时具有不同访问权限。对于Linux系统,只有PLV0对应核心态,通常建议使用PLV3对应用户态。

特权指令是需要特殊权限才能执行的指令,主要供操作系统或其他系统软件完成特定功能,例如改变系统工作方式、检查用户访问权限、修改虚拟存储管理中的段表和页表、完成任务创建与切换等,一般不会直接提供给普通用户程序使用。龙芯基础指令集支持的特权指令包括:CSR(Control and Status Register,控制状态寄存器)访问指令,用于读、写或修改CSR;IOCSR访问指令;Cache维护指令,用于Cache初始化和一致性维护;TLB(Translation Lookaside Buffer,转译后备缓冲器)维护指令,用于维护TLB表;软件页表遍历指令,用于访问软件页表遍历过程中的目录项和页表项;其他特权杂项指令,包括从例外处理返回、进入调试模式、停止取指并进入等待(IDLE)状态等。

例如,要获取当前进程运行在哪个处理器核上,可以通过CSR访问指令读取处理器编号(CPUID)控制状态寄存器:

csrrd 	$r7, 0x20

这里,CSR访问指令csrrd用于读取某个CSR寄存器,0x20是处理器编号CPUID控制寄存器的地址。处理器编号用于软件在多核系统中区分不同处理器核。通常,处理器核号从0开始递增;例如龙芯3A5000处理器为4核,因此CPUID分别为0、1、2、3。

通常情况下,特权指令只能在PLV0特权等级下执行,因此应用软件开发者日常接触较少。若需要了解各类特权指令和控制寄存器的详细信息,可查阅龙芯架构参考手册。