HN公開: ゼロから書かれたUnix風オペレーティングシステム Banan-OS
(github.com/Bananymous)banan-os
このプロジェクトはC++で書かれた趣味のオペレーティングシステムで、x86_64およびi686アーキテクチャをサポートする。他の製品や既存のオープンソースプロジェクトと比べて、独自の学習体験を提供する。
機能
-
一般
- Ring3ユーザー空間
- SMP(対称型マルチプロセッシング)
- リニアフレームバッファ(VESAおよびGOP)
- ネットワークスタック
- ELF実行ファイルのロード
- AMLインタープリタ(部分的)
- 基本的なグラフィカル環境
- ターミナルエミュレータ
- ステータスバー
- プログラムランチャー
- いくつかの便利なアプリ
- ELF動的リンク
- copy-on-writeメモリ
- ファイルマッピング
- 匿名マッピング
-
ドライバ
- NVMeディスク
- ATA(IDE、SATA)ディスク
- E1000およびE1000E NIC
- RTL8111/8168/8211/8411 NIC
- PS2キーボード(すべてのスキャンコードセット)
- PS2マウス
- USB
- キーボード
- マウス
- 大容量ストレージ
- ハブ
- virtioデバイス(ネットワーク、ストレージ)
-
ネットワーク
- ARP
- ICMP
- IPv4
- UDP
- TCP(部分的、かつバグあり)
- Unixドメインソケット
- SSL
-
ファイルシステム
- 仮想ファイルシステム
- Ext2
- FAT12/16/32
- Dev
- Ram
- Proc
- Sys
- 9P
-
ブートローダー対応
- GRUB
- カスタムBIOSブートローダー
- カスタムUEFIブートローダー
コード構造
各主要コンポーネントとライブラリは、それぞれ専用のサブディレクトリを持つ。各ディレクトリには、そのコンポーネントのすべてのヘッダファイルを含む include ディレクトリがある。すべてのヘッダは絶対パスでインクルードされる。
ビルド
必要なパッケージ
-
apt (Ubuntu 22.04でテスト済み)
build-essential,git,ninja-build,texinfo,bison,flex,libgmp-dev,libmpfr-dev,libmpc-dev,parted,qemu-system-x86,cpu-checker
-
pacman
base-devel,git,wget,cmake,ninja,parted,qemu-system-x86
コンパイル
-
このオペレーティングシステム向けのツールチェーンをビルドするには、次のコマンドを実行できる。このステップは一度だけ行えばよく、時間がかかる場合がある。
./bos toolchain
-
オペレーティングシステム本体をビルドするには、次のコマンドのいずれかを実行できる。ディスクイメージの生成/変更にはroot権限が必要。
./bos qemu./bos qemu-nographic./bos qemu-debug./bos bochs
-
カーネルやディスクイメージを実行せずにビルドすることもできる。
./bos kernel./bos image
-
別のアーキテクチャ向けにビルドするには、環境変数
BANAN_ARCH=_arch_を設定する(例:BANAN_ARCH=i686)。 -
ブートローダーを変更するには、環境変数
BANAN_BOOTLOADERを設定する。サポートされる値はBANAN(カスタムブートローダー)とGRUB。 -
UEFIで実行するには、環境変数
BANAN_UEFI_BOOT=1を設定する。加えて、OVMF_PATHを正しいOVMFに設定する必要がある(デフォルトは/usr/share/ovmf/x64/OVMF.fd)。 -
ディスクイメージが破損した場合や作り直したい場合は、手動で
_build/banan-os.img_を削除するか、次のコマンドを実行できる。./bos image-full
-
zsh向けのシェル補完スクリプトも生成される。ファイル
_script/shell-completion/zsh/_bos_を/usr/share/zsh/site-functions/にコピーするか、.zshrcのfpathに_script/shell-completion/zsh_を追加できる。
コントリビューション
-
アップストリームは個人サーバーでホストされているため、コントリビューションのマージはGitHubのように簡単ではない。GitHubでPRを送れば、diffをダウンロードして手動で適用できる。希望すれば個人gitサーバーのアカウントを提供できる。その場合はメールまたはDiscordで連絡してほしい。
-
これは主に学習体験のためのプロジェクトなので、新機能を追加する前に、まずメール、Discord、Issueなどで連絡してほしい。もし私が予定していた作業について事前の相談なくPRを送った場合、そのPRを閉じる可能性が高い。バグ修正はいつでも歓迎する。
-
コミットメッセージは次のようにフォーマットする必要がある。
- 1行目は " Subject: Description " 形式にすること。Subject は影響を受ける領域(Kernel、Shell、BuildSystemなど)を示し、Description は変更内容の簡単な説明にすること。1行目は72文字以内で書くこと。
- メッセージ本文では、変更内容とその理由を詳しく説明すること。
-
すべてのコミットは
.pre-commit-config.yamlで定義されたpre-commitフックを通過しなければならない。pre-commitの設定方法については pre-commit.com を参照。
1件のコメント
Hacker Newsのコメント
cat doom1.wadを入力してシステムを壊したと述べているPlatanOSを提案している