计算机组成原理 笔记7


Exception

Q&A

  1. 在支持中断异常的监控程序当中一共涉及几个内核态? 监控程序工作在什么内核态上? 什么时候会进入用户态 (U 态)?

    答: 1 个; M 态; 在 shell.S 中执行 G 命令进入 .ENTER_UESR 执行 mret.

  2. 观察监控程序中 CSR 寄存器的变化. 监控程序在执行 G 命令执行用户程序时, 是如何切换内核态, 并跳转到对应位置的?

    答: 设置 mepc, mpp, 执行 mret 指令跳转到对应位置.

  3. 用户程序执行 ecall 指令之后会发生什么?

    答: 引发异常, 进入 M 态 EXCEPTION_HANDLER, 执行 .HANDLE_ECALL 代码段.

  4. 考虑中断处理. 监控程序的异常处理函数中严格过滤掉了在 M 态发生的时钟中断. 如何在异常处理函数中判断当前处理的异常发生在什么态? 来自 M 态的时钟中断会发生吗?

    答: 读取 mstatus.mpp, 判断当前状态; 不会被发生和处理.

  5. 中断发生的具体条件是什么? 监控程序中发生的中断类型是?

    答: mie 和 mip 相应位置 1; 时钟中断.

  6. 用户程序在执行完成后 (执行 jr ra 指令回到监控程序后) 会发生什么?

    答: 跳转到 .USERRET_USER.

  7. 如何判断 CPU 当前运行在什么内核态? 这个信息有暴露给软件吗?

    答: 在 CPU 内部每个流水阶段传递内核态信息; 没有, 软件只有在处理异常时可以获取发生异常时 CPU 的状态.

  8. 如何读写 mtime 和 mtimecmp 寄存器 (与串口的状态和数据寄存器进行类比)?

    答: 在 mem_master 中重定向时钟寄存器地址, 增加单独的读写逻辑.

  9. 监控程序在处理 mtvec 寄存器时使用了复杂的逻辑. 结合 Privileged 2.3 节解释其原因, 并理解什么是 WARL.

    答: mtvec 寄存器用于定义异常处理程序的基地址, RISC-V 允许两种异常处理模式: 直接模式和向量模式, 通过 mtvec 寄存器的最低位来设置; WARL 属性意味着对于某些寄存器, 当写入一个地址时, 系统可能会进行某些内部调整或转换, 但读取时, 总是得到你写入的地址.

Exception

  • 处理器内部产生, 可能可恢复, 也可能无法恢复.
  • 异常恢复后重新执行本条指令.
  • IF: 访存地址不对齐; 访存缺页.

    • ID: 非法指令.
  • EXE: 除 0 计算.

  • MEM: 访存地址不对齐; 访存缺页.

  • WB: 无.

Interruption

  • 处理器外部产生, 可恢复执行.
  • 中断处理后跳到下一条指令执行.
  • 保存和恢复由软件和硬件一同进行. 通用寄存器由软件操作, 特殊寄存器 (包括 PC, cause, IE) 由硬件进行.
  • 发生中断时, 硬件将 PC 设为中断处理函数入口地址, 入口地址可以使用固定常数 (MIPS), 硬件将其进行硬编码, 也可以写入特殊寄存器 (Risc-V), 由硬件进行设置. 中断处理函数可以有多个, 操作系统提供多个入口; 也可以有一个, 根据中断 cause 跳转到不同的地址, 如中断向量表.
  • 将中断安排在 EXE 和 MEM 阶段之间, 等待前面指令执行完毕, 使用 bubble 信号排空后面的指令, 再进行中断异常处理, 称为精确的中断和异常.

Privileged Mode

  • 硬件隔离: 性能损失少; 软件隔离: 性能损失多.
  • mtvec, mepc, mcause 在异常处理中由硬件保存.
  • mie, mip, mtval, mscratch, mstatus.
  • 内存隔离机制: 通知 CPU 内存地址范围及处理权限, 将 APP 与 OS 隔离.
    • 地址映射将 APP 与 APP 隔离;
    • 限制用户程序不更改监控程序;
    • 限制 MEM 段 load/store 指令的行为;
    • 否则抛出异常 (X86: Segment; Risc-V: PMP).
  • 只有 mret 将 pc 设置为 mepc, 切换 M 模式为 U 模式. 可以通过将 mepc 设置为其他程序的运行入口, 实现操作系统调度器.
  • 异常、中断、硬件控制 (外设) 由 M 模式进行, 例如发起系统调用时, U 模式会主动切换到 M 模式, 相当于主动触发异常.
  • 进入中断处理函数, 硬件保存中断地址到 mepc, 中断原因到 mcause, 将地址置为 mtvec, 将 mstatus 中的中断使能 mie 保存到 mpie, mie 置 0, 将权限模式保存到 mpp; 进入中断处理函数, 软件保存 mepc, mcause 到 stack 上, 然后软件将 mie 置 1, 此时可以支持嵌套的中断和异常; 离开中断处理函数, 软件将 mie 置 0, 并恢复 mepc, mcause, 硬件将 mie 置 1.

文章作者: Chengsx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chengsx !
  目录