0%

2025春夏开源操作系统训练营4阶段总结-明扬

中断驱动的协程异步网络 - 在ArceOS中实现

一、背景

时间过的飞快,转眼间,训练营四阶段已经迎来尾声。
我由于去年已经参加过一届训练营,所以本次我提前一个月晋级到了四阶段,与向勇老师确定了我的课题方向:“中断驱动的协程异步网络”。
在后续周会的沟通中,向老师也给了我更具挑战性的目标:“在VisionFive2开发板上验证我的工作”。

二、历程

在四阶段,我主要完成了以下几个里程碑:

Rust异步运行时

因为我之前曾经在工作中编写过面向 WASM 平台的 Rust 异步运行时,所以第一个里程碑并没有花掉我太多时间。
为了给自己增加一些挑战,我还额外实现了常见的异步运行时辅助数据结构与函数,如:mutexspawn, block_on, join 等。

异步版本的网络操作

在完成 Rust 异步运行时后,我便开始着手实现异步版本的网络API。
我为所有网络操作中包含block_on的函数都编写了异步版本,并实现了网络操作的异步化。其中包括:

  • socket.recv_async()
  • socket.send_async()
  • socket.accept_async()
  • socket.connect_async()

PLIC中断驱动的Future唤醒

实现以上异步网络操作后,网络异步仍然是以Poll驱动的,而不是以真实的物理世界事件驱动的。
为了实现真正的异步网络,我需要实现一个中断驱动的Future唤醒机制。
在 RISC-V 架构中,PLIC 是中断控制器,可以用于实现中断驱动的Future唤醒机制。
我为 ArceOS 移植了 PLIC 驱动,并实现了 VirtIO-Net 设备的 PLIC 中断驱动的 Future 唤醒机制。

将ArceOS移植到VisionFive2开发板

在完成以上工作后,距离训练营结束仍然有一个半月的时间。这次组会中,向老师给了我一个更具挑战性的目标:将 ArceOS 移植到 VisionFive2 开发板,并在 VisionFive2 开发板上验证我的工作。我也就正式开始了移植工作。
开发板板载了 u-boot 和 OpenSBI v1.2,我可以直接从 u-boot 启动 ArceOS。
幸好我手中还有 jTag 调试器,向老师也给我提供了其他前辈同学的移植经验。
感谢萧络元同学的代码仓库,我很快便完成了 ArceOS 的移植。
VF2 开发版与常见 RISC-V 开发版有些许不同,例如:
* S 态可用内存起点为 0x4000_0000 而不是 0x8000_0000
* OpenSBI v1.2 支持 SBI v1.0 规范,但未实现 Console Extension。所以日志打印时需要使用 Legacy Console API。
以及 u-boot 启动与 Qemu 启动也有些差异,现代镜像打包时更多采用 itb 格式,同时将 dtb 打包进 itb 中。
总的来说,移植工作并不算太难,但是当系统无法加载又没有任何日志输出的时候,还是需要些裸机的调试手段,例如直接通过汇编调用串口打印,或者 sbi call 字符打印来确定程序执行到了哪里,是否进入内核代码。

为VisionFile2启用中断驱动的异步网络

在完成 ArceOS 的移植后,我便开始着手为 VisionFive2 开发板编写网卡驱动,启用中断功能,复现我在 Qemu 中完成的功能。这是本次训练营中我遇到的最大挑战。
首先,启动真实的网卡设备异常复杂,需要按顺序依次启动不下10个时钟信号与复位信号。
然后,VF2 平台使用的网络设备为 dwmac-5.2,参考 Linux 内核中驱动实现时,其历史悠久,代码量庞大,支持功能多且复杂,兼容设备多,还需要兼容多个平台和历史版本,硬啃 Linux 内核驱动代码基本上不太现实。
在必要时候还需要配合 PHY 芯片的同步配置,与设备寄存器交互通过 MMIO 映射,而与 PHY 芯片交互则需要通过 MDIO 总线,Clause 22/45 协议。

同时还需要学习众多的 MMIO 寄存器偏移量,与每个 bit 对应的功能含义,了解 GMAC/DMA/MTL/PHY 相关寄存器。
也学习了 ring buffer 的实现,以及如何使用 ring buffer 实现网络数据收发。

最终我还是没能在 VF2 平台开启中断功能,根据与厂家工程师的交流,PHY 芯片中断引脚并未接入 PLIC 中断控制器,所以无法使用 PLIC 中断驱动网络功能。

遗憾未能亲眼见到自己的工作在真实硬件上运行,但是通过本阶段的学习,我还是学到了海量的知识。

三、总结

通过本次训练营,我弥补了我知识体系中的许多空白,包括:

  • PLIC 中断控制器
  • 网卡驱动
  • U-Boot 运作原理
  • 真实硬件是如何运作的

四、致谢

感谢向勇、陈渝老师,以及所有帮助过我的老师和同学。