Hacker News 中文摘要

RSS订阅

Show HN:在RISC-V而非RISC-5上运行的Project Oberon系统版本 -- Show HN: A Project Oberon System version running on RISC-V instead of RISC-5

文章摘要

该项目将Project Oberon System从Oberon 07迁移至Oberon 90,使用OP2编译器和RISC-V后端,并包含一个模拟Wirth机器内存映射的虚拟机,使核心模块无需修改即可运行。

文章总结

这是一个将Project Oberon System从Oberon 07迁移至更通用的Oberon 90的版本,使用了带有RISC-V(RV32)后端的OP2编译器最新版。该仓库还包含一个虚拟机(VM)模拟器,其架构与Wirth在《Project Oberon》书中描述的机器高度相似,基于知名的RV32模拟器构建。该模拟器是精简版,仅包含解释器,并整合了我自行实现的机器和外设。Wirth机器的内存映射被1:1复现,因此Kernel.Mod、Display.Mod和Input.Mod模块无需修改。

什么是Project Oberon System 2013

1986年至1989年间,Niklaus Wirth和Jürg Gutknecht在苏黎世联邦理工学院独立设计并实现了一整套计算机系统,包括操作系统、编译器、编程语言、文本和图形编辑器,并将所有内容记录在《Project Oberon》一书中。Wirth退休后继续推进该项目。projectoberon.net上发布的源代码使用Oberon-07编写,这是Wirth对语言进行的最后一次、也是最彻底的简化。2013年修订版《Project Oberon》书籍也已免费提供,其宗旨与1992年版本一致:提供一本单一书籍,作为一套真实存在、实际使用且详尽解释的系统范例。

1992年的项目使用National Semiconductor NS32032处理器,但该处理器已不再可用且架构不推荐。Wirth决定设计自己的处理器RISC-5,以将简洁和规整的理念延伸到硬件层面。他甚至用可编程门阵列实现了该处理器,使其成为“单芯片上真实可用的处理器”。整个系统运行在低成本开发板上,首次实现了Oberon系统硬件和软件的完整、严谨描述。硬件模块用Verilog实现,同样可在projectoberon.net上获取。

得益于语言和处理器的简化,1992年需要用汇编代码编写的所有部分(从设备驱动程序到光栅操作)现在都用Oberon表达。Wirth的新系统直接基于原始的Ceres版本,摒弃了后续Oberon系列的特性。结果是一个小巧且足够完整的系统,文档完善,易于迁移到其他架构。Project Oberon的整个硬件/软件契约由内存映射和指令集组成。

为何迁移

与RISC-V的名称巧合很有趣,但两者在RISC设计理念上确实存在亲缘关系。RISC-V是伯克利系列第五代RISC架构,与Wirth的设计共享共同的设计目标和特性,例如规整的32位加载/存储、对编译器友好的ISA以及固定32位基础指令编码。

将Project Oberon System从RISC-5迁移到RISC-V是一种务实的方式,可以在保留Oberon价值原则的同时,将系统带到广泛可用的现代硬件上。乐鑫提供廉价且易得的微控制器,Olimex等板卡制造商围绕它们构建实用的开发板,例如ESP32-P4-PC,它以极具吸引力的价格提供了Oberon系统所需的所有资源。由于Oberon系统不需要MMU,因此非常适合这类微控制器。目前,此迁移运行在模拟的RISC-V机器上,这有助于调试并保持代码与书籍的接近。未来的迭代将把此系统(以及System 3)迁移到上述Olimex板卡上。

Wirth自己的编译器OR针对其RISC-5架构并编译Oberon-07。我本可以为其添加RV32后端,但本项目复用了OP2编译器,该编译器已用于将Oberon System 3迁移到树莓派。OP2本身是ETH Oberon遗产的一部分;其前端/后端分离设计正是为此而生:同一前端已为SPARC、MIPS、i386以及最近的ARMv7和RV32生成代码。我的OP2修改、ARMv7后端和引导链接器已在System 3迁移中得到验证。扩展OR意味着维护另一个编译器。将系统迁移到1990年的语言,使得两个迁移后的系统可以共享一个编译器,且源代码仍与书籍足够接近,保持其实用性。

迁移细节

Project Oberon源代码的原始版本于2026年4月14日从projectoberon.net下载。我特别下载了inner.zip、outer.zip、systools.zip、graph.zip和apptools.zip这些压缩包。最新文件修改日期为2018年11月28日。仓库的每个子目录对应同名的压缩包,但apptools和systools已合并到文件中。

所有Oberon-07源代码已迁移到Oberon 90,以便它们能与ActiveOberon项目的o2c编译器和OP2编译。一些注意事项包括:INTEGER重命名为LONGINT;SYS.Mod提供Oberon 90中不存在的Oberon 07内置函数;字节大小数据尽可能使用SYSTEM.BYTE,或必要时使用CHAR;类型case语句用带有IS关系和类型守卫的IF表达;Oberon 90拒绝的数组赋值使用COPY;Oberon 07字节字符串字面量在运行时通过SYS.PutHex初始化;由于OP2问题,SYSTEM.BIT使用变量而非常量地址。

基于rv32emu实现了一个类似于Wirth在《Project Oberon》书中描述的RISC-5的RISC-V机器,并对Oberon代码进行了必要的最小更改以使其运行。所有模块由引导链接器链接到引导映像中,其主体在启动时执行,无动态加载。还添加了额外的应用程序。

预编译版本

目前提供Linux x64和Windows x86版本。注意,包含的po.bin和disk.img文件在所有平台上均可工作,只有rv32vm可执行文件是平台相关的。因此,如果只想在其他平台上构建虚拟机,可以复用其他文件。

如何构建

vm子目录中有build.sh脚本,需先运行。然后可以执行根目录下的build.sh脚本,支持多种构建模式。构建脚本已在Debian Bookworm Linux上实现并测试。还有一个qmake项目用于构建虚拟机,可能也适用于macOS,但仅在Linux上测试过。虚拟机也可以使用BUSY构建系统构建,仅需要C99编译器和SDL2,并已在Linux和Windows上成功测试。

致谢

Oberon源代码和文档适用oberonlicense.txt。RISC-V模拟器的更多信息见vm/rv32emu/READMEorig.md和vm/rv32emu/LICENSE。Berkeley SoftFloat库的更多信息见vm/softfloat/README_orig.md和vm/softfloat/COPYING.txt。vm子目录中的机器根据GNU通用公共许可证版本2.0或3.0提供。

评论总结

根据评论内容,主要观点和论据总结如下:

1. 对项目硬件选择的讨论 - 观点:有评论认为项目使用低成本开发板(Xilinx Spartan-3)可能影响可用性,建议改用MiSTer FPGA平台。 - 关键引用:OCTAGRAM:"The whole system runs on a low-cost development board... If somebody wants their FPGA work to be available, they better choose MiSTer FPGA from the beginning."

2. 对项目技术实现的疑问 - 观点:有评论询问是否可能让ESP P4实现自托管(self-host)。 - 关键引用:clbrmbr:"Would it be practical to have the ESP P4 self-host?"

3. 对项目理念的赞赏 - 观点:有评论高度认可项目延续Wirth的Oberon哲学,认为其简洁性背后蕴含强大力量,希望该语言更流行。 - 关键引用:thisislife2:"Love your commitment to this... Oberon's philosophy is beautiful for the power it hides behind its simplicity."

4. 对项目背景的补充 - 观点:有评论指出存在更早的Oberon-on-RISC-V项目,并提供了相关链接和讨论记录。 - 关键引用:cxr:"Readers... should be aware that the earlier Oberon-on-RISC-V project exists and was already discussed on the mailing list."

5. 对术语的澄清 - 观点:有评论询问RISC-V与RISC-5的区别。 - 关键引用:tosh:"what does RISC-V instead of RISC-5 mean?"

(注:所有评论均无评分,故未体现认可度差异。)