CPU与指令集架构
指令集架构(Instruction Set Architecture, ISA)是CPU和软件之间的桥梁,包含指令集、特权级、寄存器、执行模式、安全扩展、性能加速扩展等诸多方面。
指令集
CPU在运行操作系统或应用程序时,实际上时在执行它们被编译后所包含的指令。
AArch64的指令集属于RISC,每条指令长度固定为4字节
指令类型包括:
- 数据搬移指令(如mov)
- 寄存器计算指令(如加法add,减法sub)
- 内存读写指令(如内存加载指令ldr,内存写入指令str)
- 跳转指令(如无条件跳转指令b)
- 过程调用指令(如调用指令bl、返回指令ret)
- 特权指令(如读取系统寄存器指令ms、写入系统寄存器指令mrs)等
特权级
TrustZone将整个系统划分为安全世界和普通世界,计算资源可以被划分到这两个世界中。安全世界可以不受限制的访问所有计算资源,而普通世界不能访问被划分到安全世界的计算资源。
通常来说,应用程序运行在EL0,操作系统运行在EL1.
发生EL0到EL1切换的可能场景:
- 应用程序需要调用操作系统提供的系统调用,此时应用程序会执行svc指令将cpu特权级从EL0切换到EL1
- 应用程序执行的指令出发了异常,该异常导致CPU特权级切换到EL1,交由操作系统内核处理异常。
- CPU收到中断
其中,第1、2种称为同步的CPU特权级切换,而第三种称为异步的CPU特权级切换。
在发生特权级切换的时刻,CPU负责保存当前执行状态。CPU保存的主要状态有:
- 触发异常的指令地址(即当前程序计数器(PC))
- 异常原因。
- 栈指针进行切换(操作系统可以设置这个寄存器来配置处理异常过程中使用的栈
- 其他的状态
异常向量表
操作系统可以在异常向量表种为不同的异常类型配置相应的处理函数。发生特权级切换时,CPU会读取VBAR_EL1(向量地址寄存器)来获取异常向量表的基地址,然后调用相应的处理函数
寄存器
在AArch64中,有31个64位通用寄存器,被命名为X0~X30。其中X29用作帧指针(Frame Pointer, FP)寄存器。一般保存的是函数调用过程中栈顶的地址。X30用在链接指针(Link Pointer, LP)寄存器,因为CPU在执行函数调用指令bl时,会自动把返回地址保存在其中。
EL1特权级下有两个页表基地址寄存器,负责翻译虚拟地址空间中不同的地址段,负责的范围由另一个控制寄存器(TCR_EL1)来决定。
CPU缓存
CPU缓存是由若干个缓存行(cache line)组成的,每个缓存行包括:一个有效位(valid bit),用于表示其是否有效;一个标记地址(tag address),用于标识其对于的物理地址;一些其他状态信息。
通常,CPU以缓存行(64bit)为单位把物理内存中的数据读取到CPU缓存中。将数据写回到内存也是以缓存行为单位的。
物理地址在逻辑上分为Tag、Set(也称为index)以及offset三段。组(set)与路(way)是cpu缓存的经典概念。物理地址中的set段能表示的最大数目称为组。同一组的最大tag数称为路,也就是同一组下的缓存行数目。
内存映射输入输出
内存映射输入输出(Memory-Mapped I/O, MMIO)的原理是:把输入输出设备和物理内存放到同一个地址空间,为设备内部的内存和寄存器也分配相应的地址。当CPU通过MMIO的方式为一个设备分配了地址之后,CPU可以使用和访问物理内存一样的指令去读写这些属于设备的地址。设备会通过总线监听CPU分配给自己的地址,然后完成相应的CPU访问请求。
参考资料
《现代操作系统:原理与实现》陈海波 夏虞斌等著
转载请注明来源:https://www.longjin666.top/?p=1159
欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~