Project Oberon Systeem: Migratie naar RISC-V (RV32)
De repository bevat daarnaast een emulatie van een machine (VM) die zeer sterk lijkt op de machine die Wirth beschreef in zijn boek over Project Oberon. Deze VM is gebaseerd op de bekende RV32-emulator, waarvan een vereenvoudigde en licht gewijzigde versie is gebruikt (uitsluitend de interpreter). Dit is gecombineerd met een eigen implementatie van de machine en de randapparatuur. De geheugenkaart van Wirths machine is 1:1 gereproduceerd, zodat Kernel.Mod, Display.Mod en Input.Mod ongewijzigd zijn gebleven.
Wat is het Project Oberon Systeem 2013?
Tussen 1986 en 1989 ontwierpen en implementeerden Niklaus Wirth en Jürg Gutknecht aan de ETH Zürich vrijwel zelfstandig een volledig computersysteem. Dit systeem omvatte een besturingssysteem, compiler, programmeertaal, tekst- en grafische editors. Alles is gedocumenteerd in het boek Project Oberon - The Design of an Operating System and Compiler (1992).
Wirth zette dit werk na zijn pensionering voort. De broncodes die op projectoberon.net zijn gepubliceerd, zijn geschreven in Oberon-07, wat Wirths laatste en meest radicale vereenvoudiging van de taal is. Er is ook een gratis herziene versie van het Project Oberon-boek uit 2013 beschikbaar.
Het doel van het project uit 2013 is ongewijzigd gebleven ten opzichte van 1992: het bieden van één enkel boek dat dient als voorbeeld van een systeem dat daadwerkelijk bestaat, in gebruik is en in alle details wordt uitgelegd.
Evolutie van hardware
Het oorspronkelijke project uit 1992 maakte gebruik van de National Semiconductor NS32032-processor, maar deze architectuur is inmiddels verouderd en niet meer beschikbaar. In plaats van de compiler aan te passen aan een andere commerciële architectuur, besloot Wirth zijn eigen processor te ontwerpen: de RISC-5. Hiermee wilde hij de eenvoud en regelmaat uitbreiden naar de hardware.
Hij implementeerde deze processor met een programmable gate array (FPGA), waardoor het een echt functionerende processor op één chip werd. Het gehele systeem draait op een goedkope ontwikkelmodule (Xilinx Spartan-3 van Digilent, met 1 MB statisch RAM) die het volledige Oberon-systeem, inclusief de compiler, gemakkelijk kan huisvesten. Voor het eerst werden zo zowel de software als de hardware van het Oberon-systeem volledig en strikt beschreven. De hardwaremodules zijn geïmplementeerd in Verilog.
Door de vereenvoudigingen van de taal en processor zijn alle onderdelen die in 1992 in assembly waren geschreven (en dus niet in het boek stonden), nu ook in Oberon uitgedrukt, van apparaatstuurprogramma's tot rasteroperaties. Wirth baseerde dit nieuwe systeem direct op de oorspronkelijke Ceres-versie en liet functies van latere Oberon-lijnen weg. Het resultaat is een compact en voldoende volledig systeem dat goed gedocumenteerd is en eenvoudig kan worden gemigreerd naar andere architecturen. Het hardware/software-contract van Project Oberon bestaat uit een geheugenkaart en de instructieset.
Waarom de migratie?
Hoewel de naamsovertreding met RISC-V amusant is, is de verwantschap op het niveau van de RISC-ontwerpprofilosofie echt. RISC-V, ontwikkeld aan UC Berkeley vanaf 2010, is de vijfde RISC-architectuur van de Berkeley-lijn (RISC-I, RISC-II, SOAR, SPUR). Zowel de architectuur van Berkeley als die van Wirth delen gemeenschappelijke ontwerpdoelen en kenmerken, zoals een regelmatige 32-bit load/store-structuur en een compiler-vriendelijke ISA met vaste 32-bit basisinstructiecoderingen.
Het migreren van het Project Oberon-systeem van RISC-5 naar RISC-V is een pragmatische manier om het systeem naar breed beschikbare hedendaagse hardware te brengen, terwijl de principes die Oberon waardevol maken behouden blijven. Espressif biedt goedkope microcontrollers in verschillende ESP32-families, en fabrikanten zoals Olimex bouwen praktische ontwikkelmodules (zoals de ESP32-P4-PC) die alle benodigde middelen voor het Oberon-systeem bieden tegen een aantrekkelijke prijs. Omdat het Oberon-systeem geen MMU vereist, is het zeer geschikt voor dit type microcontroller.
Vooralsnog draait deze migratie op een geëmuleerde RISC-V-machine, wat helpt bij het debuggen en ervoor zorgt dat de code dicht bij het boek blijft. Toekomstige iteraties zullen dit (en ook Systeem 3) migreren naar de genoemde Olimex-module.
Keuze voor de compiler
Wirths eigen compiler (OR) is gericht op zijn RISC-5 architectuur en compileert Oberon-07. In plaats van een RV32-backend aan OR toe te voegen, maakt dit project gebruik van de OP2-compiler. Deze is reeds gebruikt voor de migratie van Oberon Systeem 3 naar de Raspberry Pi.
OP2 maakt deel uit van het ETH Oberon-erfgoed; de scheiding tussen front-end en back-end is specifiek ontworpen voor dit doel. Dezelfde front-end heeft code geproduceerd voor SPARC, MIPS, i386 en recentelijk ARMv7 en RV32. Door het systeem te migreren naar de taalversie uit 1990 (Oberon 90), kan één compiler worden gebruikt voor beide gemigreerde systemen, terwijl de broncode bruikbaar blijft omdat deze dicht genoeg bij het origineel staat.
Details van de migratie
De oorspronkelijke broncode van Project Oberon is op 2026-04-14 gedownload van https://www.projectoberon.net/. De volgende archieven zijn gebruikt:
inner.zipouter.zipsystools.zipgraph.zipapptools.zip
De laatste wijzigingsdatum van deze bestanden is 2018-11-28. In deze repository komt elke subdirectory overeen met het archief met dezelfde naam, behalve apptools en systools, die zijn samengevoegd in de map files.
Aanpassingen aan de broncode
Alle Oberon-07 bronnen zijn gemigreerd naar Oberon 90 om compatibiliteit met de ActiveOberon project o2c compiler en OP2 te garanderen. De belangrijkste wijzigingen zijn:
INTEGERis overal hernoemd naarLONGINT.SYS.Modbiedt de Oberon-07 built-ins die niet aanwezig zijn in Oberon 90.- Byte-gebaseerde data is waar mogelijk omgezet naar
SYSTEM.BYTE, of naarCHARwaar dit onvermijdelijk was. Type case-statements zijn uitgedrukt alsIFmet eenIS-relatie en type-guards.- Array-toewijzingen die door Oberon 90 worden geweigerd, maken nu gebruik van
COPY. - Oberon-07 byte-string literals (
$..$) worden tijdens runtime geïnitialiseerd viaSYS.PutHex. - Omdat
ORD(SYSTEM.BYTE)in OP2 signed is, wordt waar nodigCHARgebruikt. - Voor
SYSTEM.BITis een variabele in plaats van een constante address gebruikt vanwege een probleem met OP2.
Daarnaast is een RISC-V machine geïmplementeerd op basis van rv32emu, vergelijkbaar met de RISC-5 uit het boek van Wirth. Er zijn minimale wijzigingen in de Oberon-code aangebracht om dit mogelijk te maken. Alle modules worden door de boot linker gekoppeld aan het boot-image en hun bodies worden bij opstarten uitgevoerd; er is geen sprake van dynamisch laden.
Voorgecompileerde versies
Momenteel zijn de volgende versies beschikbaar:
- Linux x64
- Windows x86
Let op: de meegeleverde po.bin en disk.img bestanden werken op alle platforms. Alleen het rv32vm executable is platformafhankelijk. Indien u de VM op een ander platform wilt bouwen, kunt u de overige bestanden hergebruiken.
Instructies voor het bouwen (Build)
Er bevindt zich een build.sh in de subdirectory vm die als eerste uitgevoerd moet worden. Daarna kan de build.sh in de root-map als volgt worden gebruikt:
./build.sh run: bouwt, pakt en start het systeem in de VM../build.sh disk: bouwt en pakt het systeem zonder het te starten../build.sh link: bouwt en linkt het systeem zonder een disk-image te maken of het te starten.- (Zonder argumenten): compileert alle Oberon-modules en stopt.
De build-scripts zijn geïmplementeerd en getest op Debian Bookworm Linux. Er is ook een qmake (vm.pro) project om de VM te bouwen, wat waarschijnlijk ook op macOS werkt, hoewel dit alleen op Linux is getest.
De VM kan ook worden gebouwd met het BUSY build-systeem; hiervoor is enkel een C99-compiler en SDL2 nodig (getest op Linux en Windows). Hiervoor moet een SDL2 development package worden gedownload dat past bij de toolchain. Gebruik -P winsdldir=<pad> waarbij het pad verwijst naar de root van de SDL2-directory.
Het systeem kan op Windows worden gestart met: rv32vm.exe --base 0x0 --disk disk.img po.bin
Credits en Licenties
- Zie
oberon_license.txtvoor de licentievoorwaarden die gelden voor de Oberon-broncode en documentatie. - Voor meer informatie over de RISC-V emulator, zie
vm/rv32emu/README_orig.mdenvm/rv32emu/LICENSE. - Voor meer informatie over de Berkeley SoftFloat library, zie
vm/softfloat/README_orig.mdenvm/softfloat/COPYING.txt. - De machine in de subdirectory
vmis beschikbaar onder de voorwaarden van de GNU General Public License (GPL) versie 2.0 of 3.0, zoals gepubliceerd door de Free Software Foundation.
Groetjes,