🌟 动机与目标
IPI (Inter-Processor Interrupt) 是多核系统中 CPU 间通信的关键机制。用于调度唤醒、TLB 刷新、系统关机等场景。
当前状态:
- 无 IPI 支持
- 无法跨核唤醒任务
- 无法通知其他 CPU 刷新 TLB
目标:
- 实现基于 SBI 或 CLINT 的 IPI 发送
- 实现 IPI 接收和处理
- 支持多种 IPI 类型 (调度、TLB 等)
💡 建议的解决方案
核心思路
- IPI 类型定义: 定义调度、TLB 刷新等 IPI 类型,使用 Per-CPU 位图存储待处理 IPI
- SBI IPI 接口: 使用 SBI IPI 扩展发送核间中断,支持单核和多核发送
- 软件中断处理: 在中断处理入口识别软件中断,根据 IPI 类型执行相应操作
实现要点
- 创建
ipi.rs 模块定义 IpiType 枚举和 Per-CPU IPI_PENDING
- 使用 SBI
send_ipi() 发送 IPI 到目标 CPU
- 在
trap_handler 中添加软件中断分支处理
- 提供
send_reschedule_ipi() 和 send_tlb_flush_ipi() 高层接口
📋 实现任务
替代方案 (可选)
方案 B: 直接 CLINT 访问
- 不依赖 SBI,直接读写 CLINT MSIP 寄存器
- 更快但不够通用,依赖硬件实现
- 可作为 SBI 不可用时的后备方案
额外的上下文
相关文件:
os/src/arch/riscv/trap/ - 中断处理
os/src/arch/riscv/lib/sbi.rs - SBI 调用
依赖于:
被依赖于:
参考:
🌟 动机与目标
IPI (Inter-Processor Interrupt) 是多核系统中 CPU 间通信的关键机制。用于调度唤醒、TLB 刷新、系统关机等场景。
当前状态:
目标:
💡 建议的解决方案
核心思路
实现要点
ipi.rs模块定义IpiType枚举和 Per-CPUIPI_PENDINGsend_ipi()发送 IPI 到目标 CPUtrap_handler中添加软件中断分支处理send_reschedule_ipi()和send_tlb_flush_ipi()高层接口📋 实现任务
os/src/arch/riscv/ipi.rs模块IpiType和 Per-CPUIPI_PENDINGsend_ipi()和send_ipi_many()send_reschedule_ipi()用于调度器send_tlb_flush_ipi_all()用于 TLB shootdown替代方案 (可选)
方案 B: 直接 CLINT 访问
额外的上下文
相关文件:
os/src/arch/riscv/trap/- 中断处理os/src/arch/riscv/lib/sbi.rs- SBI 调用依赖于:
被依赖于:
参考: