gem5 中的 LupIO 设备支持
全面开源 I/O 设备集合的理由
正如所有 gem5 用户可能知道的那样,计算机体系结构研究人员通常需要构建完整的硬件系统,例如,实验一种新颖的微体系结构方法。在这种情况下,为系统创建 I/O 设备通常不是主要目标,而只是必要步骤,因此研究人员将寻找最容易实现的硬件设计。不幸的是,他们在此过程中可能仍面临多重困难。
首先,即使许多硬件设计在现有计算系统中广泛可用并因此得到软件堆栈的良好支持,它们的规范可能仍然难以实现:例如,16550 兼容的 UART、IDE 磁盘存储等。其次,许多硬件规范是专有的,这迫使研究人员遵守其许可条款。最后,即使他们能够找到一些易于实现的开源规范,它也仅适用于设计的完整系统中的少数设备。
系统软件研究人员面临非常相似的挑战,但从设备驱动程序方面。在构建新颖的操作系统时,开发一些设备驱动程序也是研究人员应该优化的必要步骤。然而,为典型设备开发驱动程序通常很困难(例如,16550 兼容的 UART、IDE 磁盘存储等)。
我们的 LupIO 设备集合旨在弥合这一差距。通过提供一套全面且开源的 I/O 设备,这些设备足够强大以构建复杂的多核系统,但又易于实现,LupIO 可以帮助计算机体系结构和系统软件研究人员更轻松地进行探索性研究。此外,LupIO 可以用作教学资产,因为它对本科生和研究生级别的学生来说是可访问的。
LupIO 概述
LupIO 是一套全面且开源的教育友好型 I/O 设备集合。此集合定义了在现代基于 RISC 的计算机中发现的最常见设备的接口,并使得仅使用 LupIO 设备构建完整系统成为可能,甚至是复杂的对称多处理器 (SMP) 系统。
LupIO 包括核心设备(如中断控制器或定时器)以及通用 I/O 设备(如块设备、实时时钟或终端)。LupIO 设备旨在与处理器无关,因此它们应该可与任何支持内存映射设备的处理器体系结构一起使用(例如,RISC-V、ARM、MIPS 等)。
每个设备接口都设计得简单明了,在功能和复杂性之间取得最佳平衡。设备公开的寄存器映射按类型(例如,数据、控制和状态)整齐地组织,并在设备之间一致地排列,以便于它们的可编程性。开发 LupIO 设备的实现以及相应的设备驱动程序应该是直接的。
LupIO 设备的完整规范可在 https://gitlab.com/luplab/lupio/lupio-specs 获得。
在 gem5 中的实现
在 QEMU 中的概念验证实现之后(https://gitlab.com/luplab/lupio/qemu),Jason Lowe-Power 和我决定联合起来,将 LupIO 集合移植到 gem5,在那里它将接触到更多的 comparch/系统研究社区。
去年夏天,我们聘请了来自 UC Davis 的两名有才华的本科生 Laura Hinman 和 Melissa Jost 来从事此实现。
他们成功实现了 LupIO 集合的所有八个设备(https://gem5.googlesource.com/public/gem5/+/refs/tags/v21.2.0.0/src/dev/lupio/)并创建了一个名为 LupV 的示例板,基于 RISC-V 处理器(https://gem5.googlesource.com/public/gem5/+/refs/tags/v21.2.0.0/src/python/gem5/components/boards/experimental/lupv_board.py)。
此实验板可以启动 Linux,甚至具有 SMP 支持!
此示例板中使用的引导加载程序/内核和磁盘镜像资源的源代码可以在这里找到。

结论
虽然只创建了基于 RISC-V 的板,但 LupIO 在技术上应该与处理器无关。我们目前正在通过基于其他处理器构建其他板并仅嵌入 LupIO 设备来证明这一点(例如,目前正在尝试使用 ARM32)。
您也可以在硬件系统中单独使用任何 LupIO 设备。 纯外围 I/O 设备,如实时时钟、终端等,应该可以在任何支持 MMIO 的系统中工作。