HN公開: 自作の趣味OSがついにビンテージIBM ThinkPadで動作
(github.com/joexbayer)- RetrOS-32 は、i386アーキテクチャを中心に作られた完全カスタムの32ビット趣味OSで、グラフィックス・マルチタスク・ネットワーキングを含む
- カーネル・ユーティリティ・ビルドシステムは CとAssembly で書かれており、ユーザー空間アプリケーションは C++ で書かれ、ビルドには Make と Docker を使用する
- 実機テスト対象には Lenovo x240、Asus Eee PC series、Dell Optiplex 780、Samsung N150 Plus、Samsung NP-NC10、IBM Thinkpad a21p が含まれる
- 実行方法は QEMU、copy.sh の v86、実機ブートをサポートしており、実機では GRUB ISO を使って
.isoファイルを USB または CD に書き込んで実行する - ロードマップでは、ブートローダー、プリエンプティブなマルチスレッドスケジューリング、ファイルシステム、グラフィカルなウィンドウマネージャー、ネットワークスタック、ユーザー空間スレッド、TCPリモート仮想ターミナルなどが実装済み項目として整理されている
RetrOS-32 概要
- RetrOS-32 は i386アーキテクチャに焦点を当てた32ビットの趣味OSプロジェクト
- プロジェクト説明では、グラフィックス、マルチタスク、ネットワーキングを備えた32ビット趣味OSとしている
- 開始日は 2022年5月12日 と記載されている
- プロジェクトページは Project OSHub page にリンクしている
ログインとユーザー
- デフォルトユーザーは system、admin、guest の3つ
- admin のパスワードは
adminで、guest にはパスワードがない - 現在、admin と guest の違いはない
- ユーザーは
admin create <username> <password>コマンドで作成できる
実装言語とビルド構成
- カーネル、ユーティリティ、ビルドシステムは CとAssembly で書かれている
- ユーザー空間アプリケーションは C++ で書かれている
- コンパイルには Make を使用する
- クロスプラットフォームコンパイルには Docker を使用する
テスト済みハードウェア
- テスト済みの実機ハードウェア一覧は以下の通り
- Lenovo x240
- Asus Eee PC series
- Dell Optiplex 780
- Samsung N150 Plus
- Samsung NP-NC10
- IBM Thinkpad a21p
ビルドと実行方法
- クロスプラットフォーム環境では、イメージファイルのコンパイルに Docker、エミュレーションに QEMU が必要
- ネイティブコンパイルの依存関係はプラットフォームごとに異なる
- MacOS:
i386-elf-gcc,i386-elf-ld,i386-elf-g++ - Linux / WSL Ubuntu:
build-essential,gcc-multilib - GRUB をブートローダーとして使うには
grub2,xorriso,xxdも必要
- MacOS:
- Linux では、リポジトリのクローン、
./debian.sh、Git サブモジュールの初期化、make compile、make img、make qemuの順でビルド・実行する - MacOS はビルドツールが32ビット x86 コードに依存しているため、現状ネイティブコンパイルはできず、Docker が最も簡単な方法
- Windows では Docker または WSL を使用する
- 実行方法は3つある
- copy.sh の v86 で
.imgファイルをハードディスクイメージとしてアップロード - QEMU で
make qemuまたはqemu-system-i386 <image name>を実行 - 実機で
.isoファイルを USB または CD に書き込み、GRUB ISO を使用
- copy.sh の v86 で
プロジェクト構成
- リポジトリ構成は、カーネル、ドライバー、グラフィックス、ネットワーク、ファイルシステム、ライブラリ、ユーザー空間アプリ、テスト、ツールの各ディレクトリに分かれている
bootにはカスタムブートローダーとmultiboot.ldがあるkernelには主要なカーネルソース、アーキテクチャ別コード、カーネルスレッドのコードがあるappsにはユーザー空間アプリケーションとlibcore.a、libgraphic.a、libnet.aがあるnetにはネットワーキングコードがあり、fsにはファイルシステム関連コードがあるtoolsにはビルドツールとスクリプトが含まれる
実装済み項目と残作業
- ブート関連項目では、カスタムブートローダー、GRUB互換、Stage 2 ブートローダーが完了している
- カーネルとシステム機能には以下が含まれる
- マルチスレッドのプリエンプティブスケジューリング
- GDT と TSS ベースのカーネル・ユーザー空間分離
- 割り込み処理
- IPC
- システムコール
- ユーザー空間スレッド
- ドライバーとハードウェア関連機能には PS/2 キーボード・マウス、PIT、VESA
640x480x8、RTC、Serial、E1000、PCI が含まれる - ファイルシステムとストレージ関連では、ATA IDE ドライバー、Ext2ライクなファイルシステム、FAT16、読み書きが完了している
- FAT16 は最大 32MBファイル をサポートする
- Atapi は未完成
- メモリ機能には32ビット仮想メモリ、カーネル
kalloc/kfree、ユーザー空間malloc/freeが含まれる - グラフィックス機能にはウィンドウマネージャー、GFXLib、ダブルフレームバッファレンダリング、マウスイベント、動的リサイズ、フルスクリーン、ウィジェットライブラリが含まれる
- Custom HTML to Widgets は未完成
- ネットワークスタックでは Ethernet、IP、ARP、UDP、Socket API、Loopback インターフェース、DHCP、DNS、TCP、netcat スタイルのコマンドが完了している
- Webserver、FTP、IRC、SSH、Telnet、HTTP、HTML は未完成
- アプリケーションとツールには、ターミナル、ウィンドウサーバー、プロセス情報、Finder、Cコンパイラ/バイトコードインタープリタ、バイトコード実行用カスタムVM、シンタックスハイライトエディタ、電卓、3Dゲーム、テキストモードのSnakeゲーム、TCPリモート仮想ターミナル、LZ圧縮ライブラリが含まれる
- 提案機能と既知の問題の全一覧は open issues にある
ライセンスとプロジェクトリンク
- RetrOS-32 は MIT License で配布されている
- プロジェクトリンクは https://github.com/joexbayer/RetrOS-32
1件のコメント
Hacker News のコメント
こういうプロジェクトはつまらない AIよりずっと見ていて気持ちがいい。売り物にはならないだろうけど、技術者が創造的に自分の技術を発揮している姿だと思う。
10代後半に趣味の OS 開発をたくさん勉強したけど本当に面白かったし、今でもたまに小さなカーネルを作ってみる。最後に作ったのは、パートナー向けにメッセージを表示する小さな RISC-V カーネルだった。
デフォルトのシステムフォントはもっと幅の狭いバリエーションのほうがいいと思う。そうすればシステムがずっと洗練されて見えそうだし、文字に横方向のスペースがもっと必要そうな箇所もかなりある。
各文字の幅を縮め、文字間もできるだけ詰めるべき。今のフォントサイズと解像度なら、1ピクセルの間隔で十分に見える。
フォントシステムのことはよく分からないけど、等幅ビットマップフォントだと仮定した。コードベースで変更するのが難しすぎるなら気にしなくていい。
自分も少し前から Web OS サイトをゼロから作っていて、最近フォントクラス全体を書き直したので、この部分が特に目に入った。
きちんとしたフォントレンダリングも調べたし ToDo リストにはあるけど、ずっと後回しにしていた。
「OS を作りました!」
「うーん、フォントがいまいちですね」
これぞ HN の極みって感じ。
すごい。今日やり直すなら何を変えるのか気になる。
低レベル部分にはどの言語が適していると考えているのかも気になる。C にこだわるのか、単純な C++ のサブセットを使うのか、それとももっと新しい言語を検討するのか、という点。
資料がとにかく多い中で、他人のコードをコピーするのではなく、プロジェクトへの興味を保ち続けた方法も知りたい。
UNIX への依存も減らそうとしたと思う。
言語については、基本的な構文とすぐ本題に入れるスタイルが好きなので C が好き。ユーザー空間アプリケーションには別の言語も検討できる。
最初からすべてを自分で書きたかったし、ソフトウェアを移植しないことがこのプロジェクトの核だった。おおむね「コードではなくアイデアをコピーせよ」というルールを守った。
1977年に Commodore PET 2001 を使っていた者から見ても本当に素晴らしい。KolibriOS と MenuetOSx64 を触っていたところで、自分でも OS を作ってみたくなった。やり遂げたのがすごい。
プロジェクトが本当に印象的で、お祝いを言いたい。10代の頃からOS 開発が好きだったので、こういう成果が実際に実装されているのを見るとうれしい。
グラフィックスサブシステムがどのように初期化されるのかも少し気になる。うまくいくことを願っている。
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
自分もこういう情熱プロジェクトに時間を割けたらいいのに。
実用性は忘れて、市場参入戦略も忘れて、ターゲット市場との適合性も忘れて、ただ作って学ぶだけ。
その一つがトイ OS だったけど、低レベル OS 開発が実際の仕事になって、そのプロジェクトは止まった。
この分野に何十年もいて、OS 開発を学ぼうとしている。FASM、NASM、FASM-G はある程度分かる。
ただ、アセンブラプログラムの出力を調べて、OS がバイナリレベルで実際にどう動くのか理解したい。
特定アーキテクチャの命令コードを学んだのか、デバイスドライバのプログラムはどうしたのか、自分で OS を開発する手順を整理してもらえるのかが気になる。
チュートリアルもいくつかあるが、バグがあることが多く、実質的に彼らの OS を作り直す形になりがちだ。
命令コードはそこまで深く掘り下げておらず、C コンパイラを作るときに調べた程度なので、最も一般的な基本命令しか知らない。
https://forum.osdev.org/
https://wiki.osdev.org/Expanded_Main_Page
本当に素晴らしい。アプリケーションレベルよりもコンピュータそのものをいじることが多かった初期コンピューティングの精神が、もっと戻ってきてほしい。
長期の趣味プロジェクトとして個人用コンピュータを作ってみようかと考えていた。ソフトウェアスタック全体を自分で作り、システム内のすべてのビットの出所が分かるコンピュータだ。
ハードウェアは、FPGA で全体を動かせるだけの性能を得られない限り同じレベルで制御するのは難しいだろうけど、少なくともソフトウェアなら可能そうだ。
これまでは非現実的に見えていたが、可能だと示してくれた。趣味用の C コンパイラも実装中のようだ: https://github.com/joexbayer/C-Compiler
C コンパイラはこの OS 用に作ったもので、OS 内で動作する。プロジェクトが大きくなりすぎたので OS のリポジトリから分けたかったし、特に Linux でも動くからだ。
このコンパイラが OS とどう相互作用するのか、もっと説明してほしい。特に構造体のような機能をどう扱うのか、この領域の現在の制約と予定されている改善点が気になる。
構造体はメンバーに応じてサイズが決まるメモリ領域として扱い、メンバーアクセスはその領域内のオフセットで処理する。
現在は int と char しかなく、switch 文もないなど制約が多い。標準 C との最大の違いは、構造体内の関数を許可していること、そして構造体関数なら構造体を関数に暗黙的に渡す点だ。詳しくはこちらで見られる:
https://github.com/joexbayer/C-Compiler
ここで見た情熱プロジェクトの中でも、かなり久しぶりに最も印象的なものの一つだ。なぜ自作 C コンパイラを使うことにしたのか気になる。