HN 日本語サマリー

← 一覧へ戻る
プログラミング

Show HN: Project Oberon System の RISC-V 版

Show HN: A Project Oberon System version running on RISC-V instead of RISC-5 (github.com)

111 pointsby Rochus16 コメント

要約

このプロジェクトは、Niklaus Wirth らによって開発されたオペレーティングシステム「Project Oberon」を、オリジナルのRISC-5プロセッサから広く普及しているRISC-Vアーキテクチャ(RV32)に移植したものです。Oberon-07 を Oberon 90 に移行し、OP2 コンパイラを使用して RISC-V バックエンドを実装しています。また、Wirth の著書に似たエミュレートされたマシン(VM)も含まれており、現代のハードウェアで Oberon のシンプルさと堅牢性を活用することを目指しています。

全文翻訳

これは、Project Oberon System のバージョンで、Oberon 07 からより一般的な Oberon 90 に移行したものです。最近の OP2 コンパイラを RISC-V (RV32) バックエンドで使用しています。リポジトリには、有名な RV32 エミュレータに基づいた、Wirth が Project Oberon Book で説明したものと非常に似たマシンのエミュレーション (VM) も含まれています。後者は、インタープリタのみを持つ、わずかに変更された簡略化されたバージョンで、私のマシンとペリフェラルの実装と組み合わされています。Wirth のマシンのメモリマップは 1:1 で再現されているため、Kernel.Mod、Display.Mod、Input.Mod は変更されていません。 RISC-V VM 上でネイティブに実行されているシステムのスクリーンショットはこちらです。 Project Oberon System 2013 とは何か ご存知かもしれませんが、1986年から1989年の間に、ETH Zürich の Niklaus Wirth と Jürg Gutknecht は、オペレーティングシステム、コンパイラ、プログラミング言語、テキストおよびグラフィックスエディタを含む完全なコンピュータシステムを、実質的に自分たちだけで設計・実装し、それらをすべて Project Oberon - The Design of an Operating System and Compiler (1992) という書籍にまとめました。 Wirth は引退後もこの旅を続けました。projectoberon.net で公開されているソースコードは、Wirth の言語の最後かつ最も急進的な単純化である Oberon-07 で書かれています。Project Oberon Book の無料の 2013 年改訂版も利用可能です。 2013 年プロジェクトの公表された目的は、1992 年から変わっていません。それは、存在する、実際に使用されている、そしてすべての詳細が説明されているシステムの例として機能する単一の書籍を提供することです。 1992 年の書籍とプロジェクトでは、National Semiconductor NS32032 プロセッサが使用されましたが、これは「現在では入手できず、そのアーキテクチャも推奨できません」。Wirth は、コンパイラを他の商用アーキテクチャにリターゲットする代わりに、「シンプルさと規則性への欲求をハードウェアにまで拡張するため」に、独自のプロセッサを設計することにしました。彼はそれをプログラム可能なゲートアレイ (FPGA) で実装し、その設計を「単一チップ上の実際の機能するプロセッサ」に変えました。システム全体は、低コストの開発ボード (Xilinx Spartan-3 by Digilent、1 MB の静的 RAM 付き) で実行され、「コンパイラを含む Oberon System 全体を容易に収容できます」。これにより、1992 年にはソフトウェアだけでなく、Oberon System のハードウェアも完全に、かつ厳密に説明されることになりました。ハードウェアモジュールは Verilog で実装されており、projectoberon.net でも入手可能です。言語とプロセッサの単純化のおかげで、1992 年にはアセンブリコードで書かれていたすべての部分 (書籍には含まれていなかった) が、デバイスドライバからラスター操作まで、Oberon でも表現されるようになりました。 Wirth は、新しいシステムをオリジナルの Ceres バージョンに直接基づいており、後期の Oberon ラインの機能はすべて破棄しました。「25 年前のシステムを、装飾なしで、本質的にそのまま提示したいというのが私の願いでした」。その結果、小さく十分に完全なシステムが生まれ、よく文書化されており、他のアーキテクチャへの移行も容易です。Project Oberon のハードウェア/ソフトウェア契約全体は、メモリマップと命令セットで構成されています。 なぜ移行したのか RISC-V との名前の衝突は面白いですが、RISC 設計哲学のレベルでは親和性は本物です。RISC-V は、2010 年から UC Berkeley で開発された、Berkeley ラインの 5 番目の RISC アーキテクチャ (RISC-I, RISC-II, SOAR, SPUR) であり、Berkeley と Wirth の両方の設計には、例えば、規則的な 32 ビットロード/ストア、コンパイラフレンドリーな ISA、固定 32 ビットベース命令エンコーディングなどの共通の設計目標と特徴があります。Project Oberon System を RISC-5 から RISC-V に移行することは、Oberon を価値あるものにしている原則を維持しながら、システムを広く利用可能な現代のハードウェアにもたらすための実用的な方法です。 Espressif は、いくつかの ESP32 ファミリで安価で入手しやすいマイクロコントローラを提供しており、Olimex のようなボードメーカーは、それらを基盤とした実用的な開発ボードを製造しています。例えば、ESP32-P4-PC は Oberon System が必要とするすべてのリソースを非常に魅力的な価格で提供します。Oberon システムは MMU を必要としないため、この種のマイクロコントローラに適しています。これまでのところ、この移行はエミュレートされた RISC-V マシンで実行されており、デバッグとコードを書籍に近づけるのに役立っています。将来のイテレーションでは、これを (System 3 も同様に) 前述の Olimex ボードに移行する予定です。 Wirth 自身のコンパイラ (OR) は、彼の RISC-5 アーキテクチャをターゲットとし、Oberon-07 をコンパイルします。私はそれに RV32 バックエンドを追加することもできましたが、代わりに、このプロジェクトでは System 3 を Raspberry Pi に移行するためにすでに使用していた OP2 コンパイラを再利用しています。OP2 自体も ETH Oberon の遺産の一部であり、そのフロントエンド/バックエンド分離はまさにこの目的のために設計されました。同じフロントエンドが SPARC, MIPS, i386、そして最近では ARMv7 と RV32 のコードを生成しています。私の OP2 の変更、ARMv7 バックエンド、およびブートリンカは、System 3 の移行でその実証済みです。OR を拡張することは、別のコンパイラを維持することを意味したでしょう。システムを 1990 年の言語に移行することで、両方の移行済みシステムで 1 つのコンパイラを維持でき、ソースコードは書籍に十分に近いため、依然として有用です。 移行の詳細 Project Oberon のソースコードの元のバージョンは、2026-04-14 に https://www.projectoberon.net/ からダウンロードされました。特に以下のアーカイブをダウンロードしました。 http://www.projectoberon.net/zip/inner.zip http://www.projectoberon.net/zip/outer.zip http://www.projectoberon.net/zip/systools.zip http://www.projectoberon.net/zip/graph.zip http://www.projectoberon.net/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 になります。 型ケース文は、IS 関係と型ガードを持つ IF として表現されます。 Oberon 90 が拒否する配列代入は COPY を使用します。 Oberon 07 のバイト文字列リテラル ($..$) は、実行時に SYS.PutHex を介して初期化されます。 OP2 では SYSTEM.BYTE の ORD は符号付きなので、必要に応じて CHAR を使用します。 OP2 の問題により、定数アドレスの代わりに変数を持つ SYSTEM.BIT。 Wirth の PO book に記載されている RISC-5 に似た rv32emu に基づいた RISC-V マシンを実装し、それを実行するために Oberon コードに必要な (最小限の) 変更を加えました。すべてのモジュールはブートリンカによってブートイメージにリンクされ、起動時にその本体が実行されます。動的なロードはありません。 追加のアプリケーションを追加しました。対応するサブディレクトリの readme を参照してください。 プリコンパイルされたバージョン これまでのところ、以下のバージョンが利用可能です。 Linux x64 Windows x86 含まれている po.bin および disk.img ファイルはすべてのプラットフォームで動作することに注意してください。rv32vm 実行可能ファイルのみがプラットフォームに依存します。したがって、VM を別のプラットフォームでビルドしたいだけであれば、他のファイルも再利用できます。 ビルド方法 最初に実行する必要がある vm サブディレクトリに build.sh があります。その後、ルートディレクトリの build.sh を次のように実行できます。 ./build.sh run VM でシステムをビルド、パック、実行する ./build.sh disk システムをビルドしてパックするが、実行しない ./build.sh link ディスクを作成したり実行したりせずにシステムをビルドしてリンクする ./build.sh just すべての Oberon モジュールをコンパイルして停止する ビルドスクリプトは Debian Bookworm Linux で実装およびテストされました。VM をビルドするための qmake (vm.pro) プロジェクトもあります。これは macOS でも動作する可能性が高いですが、これまでのところ Linux でのみテストされています。VM は BUSY ビルドシステムを使用してビルドすることもできます。C99 コンパイラと SDL2 が必要で、Linux と Windows で正常にテストされています。ツールチェーンに一致する SDL2 開発パッケージをダウンロードする必要があります。SDL2 ディレクトリのルート (SDL2/i がある場所) を指すパスを指定して、-P win_sdl_dir=<path> を使用してください。