Loading... # 现代操作系统 原理与实现(银杏书) 第2章 硬件结构 ## 指令集架构 指令集架构(ISA)是CPU和软件之间的桥梁。ISA包括指令集、特权级、寄存器、执行模式、安全扩展、性能加速扩展等诸多方面。 RISC和CISC的比较:  ## 特权级 AArch64中的特权级被称为异常级别(EL),共有四种特权级。 - EL0:最低的特权级,应用程序通常运行在该特权级,也称用户态。 - EL1:操作系统运行在该特权级,也称内核态。 - EL2:在虚拟化场景下,虚拟机监控器(VMM)运行在该特权级。 - EL3:和安全特性TrustZone相关,负责普通世界和安全世界的切换。 从用户态应用程序(EL0)切换到内核态操作系统(EL1)的可能场景有三种: - 系统调用,通过执行svc指令。(同步) - 应用程序执行了一条指令,触发了异常。如缺页异常。(同步) - CPU收到外设的中断。(异步) EL0和EL1之间的切换流程。由CPU负责保存当前执行状态。 - 触发异常的指令地址(PC),保存在ELR_EL(异常链接寄存器)中。 - 异常原因保存在ESR_EL1(异常症状寄存器)中。 - CPU将栈指针(SP)从SP_EL0(用户栈)切换到SP_EL1(操作系统配置的异常处理过程中使用的栈)。 - 将CPU相关状态保存到SPSR_EL1(已保存的程序状态寄存器)中,将缺页地址存在FAR_EL1中。 特权级切换时,CPU读取VBAR_EL1获得异常向量表的基地址,然后根据异常原因跳转相应的异常处理函数执行。 异常处理完成后,操作系统会恢复应用程序上下文,然后执行eret指令以恢复CPU自动保存的EL0状态,使程序继续执行。  ## 寄存器 ### ARM - 31个64位通用寄存器X0-X30。X29用作帧指针(FP)寄存器; X30用作链接指针(LP)寄存器,一般用于保存函数调用过程中返回地址。 - 1个PC寄存器 - 4个栈寄存器SP_EL0~3(切换时保存SP) - 3个异常链接寄存器ELR_EL1~3(保存异常返回地址) - 3个程序状态寄存器SPSR_EL1~3(切换时保存PSTATE) - 两个页表基地址寄存器TTBR_EL0和TTRB_EL1  ### X86-64 - 16个通用寄存器(GPR) - 1个%rip寄存器(PC) - 1个%rsp寄存器 - call指令调用函数时,返回地址压栈;ret指令返回; - 程序状态寄存器EFLAGS(发生异常时压栈保存状态)。 - 系统控制寄存器CR0~CR4  ## 缓存Cache 计组的内容。CPU缓存是由若干个缓存行(Cache Line)组成,每个缓存行包括:有效位、标记地址(Tag)和其他状态信息。 - 组(Set):物理地址中的Set段能保存的最大数目称为组。例如Set段的位数是8 -> 256组。 - 路(Way):同一组(即Set段相等)下,支持的最大Tag数称为路。 将地址分为Tag、Set(Index)和Offset字段。根据Set找到缓存行,对比Tag并检查有效位。 ## MMIO和PMIO - 内存映射输入输出(MMIO):把输入输出设备和物理内存放到同一地址空间,为设备内部内存和寄存器有分配相应的地址。可以使用访存指令ldr和str去读写这些地址。 - 端口映射输入输出(PMIO):IO设备具有独立的地址空间,使用特殊的指令访问。(如x86中的in/) ## 中断和异常 ### 通用概念 - 中断(Interrupt) - 外部硬件设备所产生的信号 - 异步:产生原因和当前执行指令无关,如程序被磁盘读打断 - 异常(Exception) - 软件的程序执行而产生的事件,包括系统调用(System Call) - 同步:产生和当前执行或试图执行的指令相关 不同体系结构术语的对应关系  ### 中断 中断控制器需要考虑的问题 - 如何指定不同中断的优先级 - 是否运行中断抢占和嵌套 - 中断交给谁处理 - 如何与软件协同 AArch64中断的分类  ### 案例:Linux中断处理 处理理念 - 在中断处理中做尽量少的事 - 推迟非关键行为 - 结构:Top half & Bottom half - Top half : 做最少的工作后返回 - Bottom half :推迟处理(softirq, tasklets, 工作队列,内核线程) Top Half:马上做 - 最小的、公共行为 - 保存寄存器、屏蔽其他中断 - 恢复寄存器,返回原来场景 - 最重要:调用合适的由硬件驱动提供的中断处理handler - 因为中断被屏蔽,所以不要做太多事情(时间、空间) - 使用将请求放入队列,或者设置标志位将其他处理推迟到bottom half Bottom Half:延迟完成 - 提供一些推迟完成任务的机制(softirq, tasklets, 工作队列,内核线程) - 可以被中断 Last modification:November 30th, 2021 at 03:22 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments Pay by AliPay Pay by WeChat