RISC-V 虚拟平台级中断控制器
English | 中文
RISC-V 虚拟平台级中断控制器(Virtual Platform-Level Interrupt Controller),为 RISC-V Hypervisor 提供符合 PLIC 1.0.0 规范的中断控制器模拟实现。支持 #![no_std],可用于裸机和虚拟化开发。
本库导出以下核心内容:
VPlicGlobal— 虚拟 PLIC 全局控制器,管理中断优先级、待处理中断和活跃中断- PLIC 常量 — PLIC 1.0.0 内存映射常量定义(优先级、待处理、使能、上下文控制等)
- 符合 PLIC 1.0.0 规范的内存映射
- 支持中断优先级、待处理状态和使能管理
- 基于 Context 的中断处理,支持 Claim/Complete 机制
- 与 Hypervisor 设备模拟框架集成(实现
BaseDeviceOpstrait)
- Rust nightly 工具链
- Rust 组件: rust-src, clippy, rustfmt
# 安装 rustup(如未安装)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 安装 nightly 工具链及组件
rustup install nightly
rustup component add rust-src clippy rustfmt --toolchain nightly# 1. 克隆仓库
git clone https://github.com/arceos-hypervisor/riscv_vplic.git
cd riscv_vplic
# 2. 代码检查(格式检查 + clippy + 构建 + 文档生成)
./scripts/check.sh
# 3. 运行测试
# 运行全部测试(单元测试 + 集成测试)
./scripts/test.sh
# 仅运行单元测试
./scripts/test.sh unit
# 仅运行集成测试
./scripts/test.sh integration
# 列出所有可用的测试套件
./scripts/test.sh list
# 指定单元测试目标
./scripts/test.sh unit --unit-targets x86_64-unknown-linux-gnu在 Cargo.toml 中添加:
[dependencies]
riscv_vplic = "0.2.2"use riscv_vplic::VPlicGlobal;
use axaddrspace::GuestPhysAddr;
fn main() {
// 创建一个支持 2 个上下文的虚拟 PLIC
let vplic = VPlicGlobal::new(
GuestPhysAddr::from(0x0c000000),
Some(0x4000),
2
);
// 访问 PLIC 属性
println!("PLIC address: {:#x}", vplic.addr.as_usize());
println!("PLIC size: {:#x}", vplic.size);
println!("Contexts: {}", vplic.contexts_num);
// 检查中断位图状态
assert!(vplic.assigned_irqs.lock().is_empty());
assert!(vplic.pending_irqs.lock().is_empty());
assert!(vplic.active_irqs.lock().is_empty());
}use riscv_vplic::*;
// 中断源数量(PLIC 1.0.0 定义为 1024)
assert_eq!(PLIC_NUM_SOURCES, 1024);
// 内存映射偏移量
assert_eq!(PLIC_PRIORITY_OFFSET, 0x000000); // 优先级寄存器
assert_eq!(PLIC_PENDING_OFFSET, 0x001000); // 待处理寄存器
assert_eq!(PLIC_ENABLE_OFFSET, 0x002000); // 使能寄存器
assert_eq!(PLIC_CONTEXT_CTRL_OFFSET, 0x200000); // 上下文控制寄存器
// Context 间距
assert_eq!(PLIC_ENABLE_STRIDE, 0x80); // 使能区域间距
assert_eq!(PLIC_CONTEXT_STRIDE, 0x1000); // 上下文间距
// 上下文内部控制偏移
assert_eq!(PLIC_CONTEXT_THRESHOLD_OFFSET, 0x00); // 阈值寄存器
assert_eq!(PLIC_CONTEXT_CLAIM_COMPLETE_OFFSET, 0x04); // Claim/Complete 寄存器生成并查看 API 文档:
cargo doc --no-deps --open在线文档:docs.rs/riscv_vplic
- axdevice_base - 基础设备抽象
- axvisor_api - Hypervisor API 定义
- axaddrspace - 地址空间管理
- Fork 仓库并创建分支
- 运行本地检查:
./scripts/check.sh - 运行本地测试:
./scripts/test.sh - 提交 PR 并通过 CI 检查
本项目采用 Apache License, Version 2.0 许可证。详见 LICENSE 文件。