RISC-V AIA学习---IPI 处理器间中断

发布于:2025-04-08 ⋅ 阅读:(43) ⋅ 点赞:(0)

对于有多个hart的机器,必须为每个 hart 提供一个由具体实现定义的内存地址。向这个地址写入数据,就能向该 hart 发送一个机器级软件中断(主代码为 3)。换句话说,机器级的 IPI 可以通过这种方式,以机器级软件中断的形式发送给任何一个 hart。

接收中断的 hart 上的软件需要负责识别这个进入的软件中断是一个 IPI,并进一步解析其目的。通常,这需要借助发送方存储在普通内存中的额外数据来实现。比如,发送方按了 “门铃”(触发中断)后,还会在旁边留个纸条(普通内存中的数据),接收方听到门铃后,要通过纸条来明白发送方的意图。

  • 监督级软件中断的传递

    • 对于向远程硬件线程(hart)发送监督级软件中断(主代码为 1),可能存在与机器级软件中断类似的机制(但使用不同的内存地址),也可能不存在。
    • 若没有直接支持这种机制,监督级软件中断通常通过从监督模式到机器模式的环境调用发送给另一个 hart。例如,运行在 S 模式(监督模式)的操作系统会调用特定的 SBI(Supervisor Binary Interface)函数,将软件中断传递给另一个 hart。这会促使源 hart 的机器级软件向目标 hart 发送机器级处理器间中断(IPI),然后目标 hart 的软件在控制状态寄存器(CSR)的 mip 寄存器中设置监督级软件中断挂起位(SSIP)。
  • 有 IMSIC 时 IPI 的发送

    • 当 hart 配备 IMSIC(中断管理和安全中断控制器)时,无需使用特权架构中向远程 hart 发送软件中断的机制。可以像发送普通消息信号中断(MSI)一样,通过向目标 hart 的 IMSIC 写入数据来发送 IPI。
    • 在这种情况下,进入目标 hart 的 IPI 表现为通过 IMSIC 路由的外部中断,而非之前的软件中断。不过,只要 IPI 的源和目标两端由相同的软件(如操作系统或机器监视器)控制,目标 hart 就不会误解这个代表 IPI 的外部中断的意图。

 有无 IMSIC 时 IPI 机制的变化

  • 无 IMSIC 的情况:如果硬件线程(hart)没有配备中断管理和安全中断控制器(IMSIC),那么就会采用 RISC - V 特权架构规定的方法来处理 IPIs,也就是通过向目标 hart 发送软件中断信号来实现 IPI。
  • 有 IMSIC 的情况:当 hart 有 IMSIC 时,原本用于触发远程 hart 软件中断的机制就变得多余了,因为 IMSIC 本身具备类似功能。所以,这个机制从必须实现的要求变成了可选功能,其主要作用可能只是为了保证不同 RISC - V 系统(有或没有 IMSIC)之间的软件兼容性。要是机器实现了 IMSIC 但没有实现之前的软件中断机制,那么在 hart 中,控制状态寄存器(CSR)里用于机器级软件中断的mipmie寄存器中的MSIPMSIE位会被硬连线设置为 0。

2. 软件中断机制的模拟实现

即使机器实现了 IMSIC 但没有实现软件中断机制,在监督模式(S - mode)或虚拟监督模式(VS - mode)下,仍可以完全模拟该软件中断机制。具体做法是捕获对那些本应触发监督级软件中断的特殊内存地址的写操作。当捕获到这样的写操作时,软件会通过 IMSIC 向目标 hart 发送一个更高级别的 IPI,目标 hart 上的高级软件会在相应特权级(S 或 VS)的sip寄存器中设置监督级软件中断待处理位(SSIP)。而且,这样一来,支持发送 IPIs 的 SBI 环境调用依然可以正常工作,客户端甚至都不会察觉到底层硬件在 IPI 传输方式上的变化。

3. 发送 IPIs 时 FENCE 指令的使用

当软件通过向其他 hart 的 IMSIC 写入消息信号中断(MSI)来发送 IPIs 时,程序员需要考虑在每次写入 MSI 的存储指令之前执行一个 FENCE 指令。这是因为很多系统只保证 hart 对单个设备的加载和存储操作的顺序,对于多个设备之间以及对主内存的访问顺序不做保证。在这种系统中,每个 IMSIC 通常被视为一个独立的设备。例如,若 hart A 要通知 hart B 它已经完成了一个涉及对某个 I/O 设备访问的任务,那么 hart A 在向 hart B 的 IMSIC 发送 MSI 之前,可能需要执行一个 FENCE 指令,以确保在 MSI 到达 hart B 之前,hart A 对该设备的所有访问操作都已经实际完成。同样,如果 hart A 向内存中存储了一些数据,并且希望 hart B 能够看到这些数据,那么在向 hart B 的 IMSIC 发送 MSI 的存储指令之前,也很可能需要执行一个 FENCE 指令。


网站公告

今日签到

点亮在社区的每一天
去签到