JSIXは、私がゼロから構築しているカスタムマルチコアX64オペレーティングシステムです。それは完成とはほど遠い、または使用可能であることさえあります(以下のステータスとロードマップセクションを参照)が、現在計画されているすべての主要なカーネル機能は、少なくとも可視性レベルに実装されています。
プロジェクトの設計目標は次のとおりです。
現代性 - レガシーシステムの設計や、そこにあるすべてのハードウェアで実行することには興味がありません。私のターゲットは、わずか64ビットアーキテクチャと最新のコモディティハードウェアです。現在、Nehalemまたは新しいCPUおよびUEFIファームウェアを備えたX64システムを意味します。 (現在必要なCPU機能については、このリストを参照してください。)最終的には、Aarch64ポートで作業したいと思います。これは、コードベースのアーキテクチャに依存する部分を考慮に入れることを強制します。
モジュール性 - マイクロカーネルの方法で、できるだけ多くのシステムを個別のプロセスに引き出したいと思います。これのサブゴールは、このようなマイクロカーネルのボトルネックが現在どこにあるかを探ることであり、レガシーハードウェアを避けることで、従来のマイクロカーネルの問題によってあまり動けないシステムを設計できるかどうかを探ることです。
探索 - 私は本当にこれを実際に行って、現代のOS開発を学び、探索するために楽しいことをしています。最初の機能の実装は、関連するハードウェアの調査を可能にするために、モジュラー設計を一時的に捨てる場合があります。
名前に関するメモ:このカーネルは元々Popcornという名前でしたが、それ以来、Popcorn Linuxプロジェクトもその名前のカーネルを開発していることを発見しました。それで、私はこのカーネルJSIX(常にスタイルを整えたJSIXまたはj6 、決して大文字ではない)と名前を変更しました。
次の主要な特徴領域は、JSIX開発のターゲットです。
終わり。ブートローダーはカーネルと初期ユーザースペースプログラムをロードし、メモリマップとEFI GOPフレームバッファに関する必要なカーネル引数を設定します。将来のアイデアの可能性:
仮想メモリ:十分です。カーネルは、仮想メモリ空間全体を表す1つ以上のvm_spaceオブジェクトに属するマッピング領域を表す多数の種類のvm_areaオブジェクトを使用して仮想メモリを管理します。 (各プロセスにはvm_spaceがあり、カーネル自体も同様です。)
やるべきことのまま:
物理ページの割り当て:十分です。現在の物理ページAllocatorの実装では、ブートローダーで定義されているように、使用可能なメモリの最新のGIB領域を表すブロックのグループを使用します。各ブロックには、無料/使用済みのページを示す3レベルのビットマップがあります。
将来の仕事:
十分な。グローバルスケジューラオブジェクトは、コアごとに個別の準備/ブロックされたリストを保持します。コアは、作業盗みを介して定期的に負荷のバランスをとろうとします。
ユーザースペースのタスクは、他のプロセスだけでなくスレッドを作成できます。
syscalls:十分です。ユーザースペースタスクは、高速Syscall/Sysret命令を介してsyscallsをカーネルに作成できます。 libj6を介して作成されたsyscallsは、標準のSYSV ABI関数呼び出しのようなCalleeとCallerの両方を調べます。実装は、リクエストを検証し、機能をチェックし、実装機能を呼び出す前に適切なカーネルオブジェクトまたはハンドルを見つける生成されたラッパー関数に包まれています。
IPC:動作、最適化が必要です。現在のIPCプリミティブは次のとおりです。
JSIXはNinja Buildツールを使用し、 configureスクリプトでビルドファイルを生成します。ビルドは、JSIX-OS/ツールチェーンのスクリプトを使用してダウンロードまたはビルドできるカスタムツールチェーンSysrootにも依存しています。
その他のビルド依存関係:
configure ScriptにはいくつかのPython依存関係があります - これらはpipでインストールできますが、Python仮想環境でそうすることをお勧めします。 pip経由でインストールすると、 ninjaもインストールされます。
JSIXリポジトリルートから次のコマンドを実行することにより、Debian 11(Bullseye)システムを必要なビルド依存関係で構成できます。
sudo apt install clang lld nasm mtools python3-pip python3-venv
python3 -m venv ./venv
source venv/bin/activate
pip install -r requirements.txt
peru sync上記のJSIX-OS/ツールチェーンを使用して上記のツールチェーンSysrootを構築またはダウンロードし、このプロジェクトのルートにあるsysrootとして構築されたツールチェーンディレクトリをSymlinkします。
# Example if both the toolchain and this project are cloned under ~/src
ln -s ~ /src/toolchain/toolchains/llvm-13 ~ /src/jsix/sysrootツールチェーンがセットアップされると、 ./configure configureスクリプトを実行します( ./configure --help使用可能なオプションについてはヘルプを参照)は、ビルド構成をセットアップし、 ninja -C build (またはビルドディレクトリを置く場所)が実際にビルドを実行します。 qemu-system-x86_64がインストールされている場合、 qemu.shスクリプトはQEMU -nographicモードでJSIXを実行します。
私は個人的にこれを、本物のDebian AMD64ブルズアイマシンまたはWindows WSL Debian Bullseyeyのインストールから実行しています。マイレージは、他のセットアップやディストリビューションによって異なる場合があります。
JSIXには、さまざまな自動テストを実行するtest_runnerユーザースペースプログラムがあります。デフォルトのビルドには含まれていませんが、 test.yml manifestを使用する場合はビルドされ、 test.shスクリプトまたはqemu.shスクリプトで実行できます。
./configure --manifest=assets/manifests/test.yml
if ./test.sh ; then echo " All tests passed! " ; else echo " Failed. " ; fi