RISCV架构 Linux AIA支持
目标:在 Qemu 中运行一个支持 riscv aia 的 linux
翻译参考自:https://lwn.net/Articles/963231/
文章日期:2024年2月22日,星期四(截至2024年3月,最新)
这个网站里在不断更新 Linux RISC-V AIA Support ,需要可以
Search
-> 查找最新
前置内容
RISC-V AIA 规范是根据 RISC-V 国际流程批准的。最新批准的 AIA 规范可在以下网址找到:
https://github.com/riscv/riscv-aia
从高层次来看,AIA 规范增加了三项内容:
- AIA CSRs
- 改进的本地中断支持
- 接收信息信号中断控制器(IMSIC)
- 每个 HART 一个 MSI 控制器
- 支持 MSI 虚拟化
- 在虚拟化的同时支持 IPI
- 高级平台级中断控制器(APLIC)
- 有线中断控制器
- 在 MSI 模式下,将有线中断转换为 MSI(即 MSI 生成器)
- 在直接模式下,将外部中断直接注入 HART
有关 AIA 规范的概述,请参阅 KVM 论坛 2022 上的 AIA 虚拟化讲座。2022 年 KVM 论坛上的演讲:
PPT https://static.sched.com/hosted_files/kvmforum2022/a1/AIA_Virtualization_in_KVM_RISCV_final.pdf
视频 https://www.youtube.com/watch?v=r071dL8Z0yo
要测试该系列,请使用 QEMU v7.2(或更高版本)和 OpenSBI v1.2(或更高版本)。
这些补丁也可在 riscv_aia_v14 分支中找到,网址是:https://github.com/avpatel/linux
部分更新记录如下:
Changes since v13:
- Split PATCH1 into six granular patches
- Addressed nit comments from Thomas and Bjorn
Changes since v12:
- Rebased on Linux-6.8-rc5
- Dropped per-device MSI domain patches which are already merged by Thomas (tglx)
- Addressed nit comments from Thomas and Clement
- Added a new patch2 to fix lock dependency warning
- Replaced local sync IPI in the IMSIC driver with per-CPU timer
- Simplified locking in the IMSIC driver to avoid lock dependency issues
- Added a dirty bitmap in the IMSIC driver to optimize per-CPU local sync loop
...
实践:qemu 运行 linux riscv aia
按照前文内容,在 Linux-6.8-rc5 的基础上,添加相应的patch即可
但我在文中提供的仓库中,未发现 patch 文件(仅找到了对比,如果一个一个复制粘贴则太多了,也可能是我的方式不正确),索性直接下载其源代码
https://github.com/avpatel/linux/tree/riscv_aia_v14
Code
-> Download ZIP
,直接下载 riscv_aia_v14分支的代码
unzip linux-riscv_aia_v14.zip
cd linux-riscv_aia_v14
# 配置并编译内核, defconfig 表示 default config 默认配置
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)
编译完成内核后,启动qemu
这里我使用了ubuntu-base的文件系统,如果有需要可以参考我之前的博客,或者使用其他文件系统也可以
添加aclint=on,aia=aplic-imsic
,然后成功启动 linux riscv with AIA!
# qemu doc中关于启用aia的命令行参数描述 aia=[none|aplic|aplic-imsic]
# 启动 Qemu 针对 virt 板子启用 aclint 以及 aplic
sudo /opt/qemu/bin/qemu-system-riscv64 \
-M virt,aclint=on,aia=aplic-imsic \
-nographic \
-smp 8 \
-m 16G \
-kernel ../linux-riscv_aia_v14/arch/riscv/boot/Image \
-append "root=/dev/vda rw console=ttyS0" \
-drive file=riscv64.image,if=none,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0
# 挂载系统的文件系统
mount -t proc proc /proc
mount -t sysfs sysfs /sys
通过查设备树(该设备树是qemu自动传给linux内核的),可以确定,成功!