Skip to content

Chapter 4 Software-Hardware Interface

1 异常与中断

基本概念

  • 异常(Exceptions):指控制流的任何意外变化,可来自内部或外部
  • 中断(Interrupts):来自外部 I/O 控制器的请求
事件类型 来源 RISC-V 术语
系统重置 外部 异常
I/O 设备请求 外部 中断
从用户程序调用操作系统 内部 异常
使用未定义指令 内部 异常
硬件故障 任一 任一

1. 1 RISC-V 异常处理

  • 监管者异常程序计数器(SEPC, Supervisor Exception Program Counter):保存引发异常指令或被中断指令的 PC,用于标识故障指令
  • 监管者异常原因寄存器(SCAUSE, Supervisor Exception Cause Register):保存异常触发原因
  • 向量中断(Vectored Interrupts):控制转移地址由异常原因决定,通过向量表基址寄存器和异常向量地址偏移确定处理入口
异常类型 异常向量地址偏移
未定义指令 0001000000
系统错误(硬件故障) 0110000000

1. 2 处理器动作(Handler Actions)

  1. 读取 SCAUSE 的异常原因,转移到对应异常处理器
  2. 确定处理动作
    • 可重启异常
      • 采取纠正措施,流水线可清空引发异常的指令
      • 利用 SEPC 返回原程序,重新获取并执行引发异常的指令
    • 不可重启异常:终止程序,利用 SEPC、SCAUSE 等信息报告错误

1. 3 流水线中的的异常

  • 本质是控制冒险的一种形式,以 EXE 阶段加法指令add x1, x2, x1故障为例,其处理步骤为:
    1. 防止目标寄存器 x1 被错误修改
    2. 完成之前的指令
    3. 清空该加法指令及后续指令
    4. 设置 SEPC 和 SCAUSE 寄存器
    5. 将控制转移到异常处理器
  • 分支预测错误机制类似,复用大量硬件

Example

以加法指令 add x1, x2, x1(地址4C)引发异常为例,指令序列:

40    sub x11, x2, x4
44    and x12, x2, x5
48    or  x13, x2, x6
4C    add x1, x2, x1
50    sub x15, x6, x7
54    ld  x16, 100(x7)
则有异常处理器代码示例(保存寄存器状态):
1C090000    sd x26, 1000(x10)
1c090004    sd x27, 1008(x10)

1. 4 多异常处理

  • 流水线的指令重叠执行可能导致多个异常同时发生
  • 简单处理策略:
    • 优先处理最早指令引发的异常
    • 清空后续指令,实现精确异常
  • 在复杂流水线(多发射、指令乱序完成)中,维持精确异常机制是困难的

2 软硬件接口(Software-Hardware Interface)

CPU 软硬件协作实例

类别 硬件方案 软件方案
数据冒险 转发(Forwarding) 代码重排(Code Reordering)
控制冒险 分支预测(Branch Prediction) 代码调度(Code Scheduling)

Hello World

    1. 计算字符 'H' 的 ASCII 码(72)
    2. 通过 UART 外设地址(基址 0x64000000),将数据写入 UART 发送数据寄存器(txdata,偏移 0x00)

    System-I 版本(机器模式):直接操作硬件,无需操作系统/固件介入

    指令示例
    80000000: 04800413  li s0, 72        # 加载 'H' 的 ASCII 码
    80000004: 640004b7  lui s1, 0x64000  # 设置 UART 基址
    80000008: 00848023  sb s0, 0(s1)     # 写入 txdata 寄存器
    
  1. System-II版本(M/S模式):用户程序运行在监督模式(S模式),通过系统调用(ecall)请求机器模式(M模式)固件(如OpenSBI)完成硬件操作

    1. 计算字符 'H' 的 ASCII 码
    2. 调用 SBI 控制台输出函数(a7=1 表示系统调用号,a0 存储数据)
    3. 固件接收系统调用,操作 UART 硬件完成输出
    指令示例
    80000000: 04800413  li s0, 72        # 加载'H'的ASCII码
    80000004: 8522      mv a0, s0        # 设置系统调用参数
    80000006: 4885      li a7, 1         # 设置系统调用号
    80000008: 00000073  ecall            # 触发系统调用
    80002000: 640004b7  lui s1, 0x64000  # 固件:设置UART基址
    80002004: 00a48023  sb a0, 0(s1)     # 固件:写入txdata寄存器
    

4. 3 Brief Introduction of OS

  • 定义:作为用户与计算机硬件之间的中介程序,是系统软件的核心。
  • 核心目标:方便用户使用计算机,简化用户程序执行;高效利用计算机硬件资源,合理分配冲突请求。
功能模块 作用
进程管理 调度任务、协调进程执行、处理进程同步与通信
内存管理 分配内存空间、管理虚拟内存、避免内存泄漏
存储管理 管理磁盘等外存设备,处理文件系统、存储分配与回收
I/O子系统 协调CPU与I/O设备(如UART、磁盘)的通信,提供设备驱动接口
保护与安全 隔离不同用户/程序的资源,防止非法访问与操作