Skip to content

[FEAT] IPI 核间中断支持 #211

@ZIYAN137

Description

@ZIYAN137

🌟 动机与目标

IPI (Inter-Processor Interrupt) 是多核系统中 CPU 间通信的关键机制。用于调度唤醒、TLB 刷新、系统关机等场景。

当前状态:

  • 无 IPI 支持
  • 无法跨核唤醒任务
  • 无法通知其他 CPU 刷新 TLB

目标:

  • 实现基于 SBI 或 CLINT 的 IPI 发送
  • 实现 IPI 接收和处理
  • 支持多种 IPI 类型 (调度、TLB 等)

💡 建议的解决方案

核心思路

  1. IPI 类型定义: 定义调度、TLB 刷新等 IPI 类型,使用 Per-CPU 位图存储待处理 IPI
  2. SBI IPI 接口: 使用 SBI IPI 扩展发送核间中断,支持单核和多核发送
  3. 软件中断处理: 在中断处理入口识别软件中断,根据 IPI 类型执行相应操作

实现要点

  • 创建 ipi.rs 模块定义 IpiType 枚举和 Per-CPU IPI_PENDING
  • 使用 SBI send_ipi() 发送 IPI 到目标 CPU
  • trap_handler 中添加软件中断分支处理
  • 提供 send_reschedule_ipi()send_tlb_flush_ipi() 高层接口

📋 实现任务

  • 创建 os/src/arch/riscv/ipi.rs 模块
  • 定义 IpiType 和 Per-CPU IPI_PENDING
  • 添加 SBI IPI 扩展支持
  • 实现 send_ipi()send_ipi_many()
  • 实现软件中断处理函数
  • 修改中断处理入口识别软件中断
  • 实现 send_reschedule_ipi() 用于调度器
  • 实现 send_tlb_flush_ipi_all() 用于 TLB shootdown
  • 编写 IPI 测试

替代方案 (可选)

方案 B: 直接 CLINT 访问

  • 不依赖 SBI,直接读写 CLINT MSIP 寄存器
  • 更快但不够通用,依赖硬件实现
  • 可作为 SBI 不可用时的后备方案

额外的上下文

相关文件:

  • os/src/arch/riscv/trap/ - 中断处理
  • os/src/arch/riscv/lib/sbi.rs - SBI 调用

依赖于:

被依赖于:

参考:

Metadata

Metadata

Assignees

Labels

P-High优先级较高,应尽快处理。T-Feature一个新的功能请求或实现。
No fields configured for Feature.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions