Feralは、たとえそれが非常にゆっくりであっても、ゼロから完全なオペレーティングシステムを構築するための小さな趣味のプロジェクトとして、モノリシックカーネルです。
Feralは、適度に互換性のあるBIOSを使用して、最近のPCシステムで実行するように設計されています。今のところ、FeralはUEFIをサポートしていませんが、ポートが進行中です。
Feralは、今のところ、従来のPC互換マイクロコンピューターに存在する2つの8259A写真の存在を想定しています。最新のマイクロでは、X399やX470などのサウスブリッジにはおそらく互換性があります。将来的には、FeralはAPIC、最終的にはXapicとX2APICなどの新しいプロセッサ機能の利用に進むつもりです。さらに、Feralは対称的なマルチプロセスをサポートします。
現在、テストされているハードウェアには、4 "x4"マザーボードを備えたPCと4GBのRAMを備えたN3700 CPU(「Braswell」)、2500U(前述のZen 1)を備えた17zのラップトップ、および将来、2GBのRAM(「Cherry Trail」)を備えたX5-Z8350が含まれます。
将来、FeralはAarch64(BCM2711)、Power(SFORZA)、およびRV64GC(U540)ハードウェアで実行され、ポートがその順序で書かれていることを目的としています。
建築的には、Feralは単純なモノリシックカーネルであり、MachとPlan 9、特に後者と多くの類似点を建築的に共有しています。 Feralは、より柔軟性を可能にし、ネットワークの場所とソケットとしてリソースを公開し、最新のプロセスとストレージの仕組みをよりよく反映するために、カーネル自体に直接焼き付けするよりも、ほとんどの機能をドライバーに配置することを好みます。
たとえば、ファイルを開くには、1つのファイルサーバーをクエリします。これは、カーネルが所有するプロセスであり、着信トラフィックを受け入れるソケットを開きます。その後、ソケットの開く方法に応じて、それを読み取るか、書くことができます。
主なアイデアは、マイクロカーネルのモジュール性と柔軟性を取り、それを従来のモノリシックカーネルアーキテクチャに接ぎ込み、クリーンアーキテクチャ、ドライバーのレイヤー化、複数のドライバープロバイダーなどの利点を維持しながら、ファイルシステムドライバーを再起動する能力を犠牲にすることです。
Feralは、オペレーティングシステムの設計についてさらに学ぶために作成されます。これを行う従来の「別の *nixクローンを作成する」方法から逸脱しています。それは問題はありませんが、どこかでファイルを作成する以外に、ハードウェアとシステム機能をプログラムに公開するさまざまな方法を探りたいと思います。さらに、既存のソフトウェアを簡単に移植できるようにしながら、新しいOSが従来のシステムとはどのように異なるかを調査したいと思います。
この画像は時代遅れですが、これらのサブシステムのいくつかはカーネルに吸収されるはずなので、ほとんどの場合、これは意図にとって正確です。
FeralはCmakeを使用して構築します。 vm_test.shのx86_64とqemuの建物の一般的なケースと、 vm_test_gdb.shでGDBスタブが有効になっているため、ユーティリティスクリプトが含まれています。
手動で構築するには、ClangをCコンパイラとして使用する必要があります。 EFIサポートなしのX86-64-PCターゲットの場合、ToolChainファイルCMAKE/X86_64-PC.CMAKEを-DCMAKE_TOOLCHAIN_FILE=cmake/x86_64-pc.cmakeパラメーターで使用できます。これにより、「Feralker」として適切なカーネルが構築され、起動可能なISOファイルを作成するには追加の手順が必要になります。詳細については、 vm_test.shファイルを参照してください。
Feralは、X86-64命令セット(つまり、少なくともK8 CPUなど)を実装するPCで、少なくとも1GBのシステムメモリで快適に実行する必要があります。このメモリの要件は将来下がっていますが、最初にカーネルをセットアップするときに物事を少し簡単にするために今のところ必要です。
Feralは、VGA互換ディスプレイアダプターがPCに存在することを期待しています。そのため、VGAモードで実行できる何らかの形のビデオアダプターが必要です。ほとんどの消費者クラスCPUとGPUは、少なくとも1つのGPUでこれを実装しています。
現在、FeralはZen 1 1950xの上にある仮想マシンと、少数の小さなZen 1マシンでのみテストされています。他のハードウェアではFeralが正常に実行される可能性がありますが、テストされていません。
フォルダーは、不必要な文字(すなわち、 '' 'vs' include 'を避けるために名前が付けられている必要があります。同様に、特定のモジュールについては、メモリ管理が「MM」にあり、オブジェクト管理が「OB」などになるように、フォルダー名がプレフィックスを反映する必要があります。
関数thaatは、モジュール間でエクスポートする必要があります。通常、「kestartprocessor」などの(function-purpose)(optional-argument-type)の命名規則が必要です。関数がアーキテクチャ固有の場合、「aarch64startpaging()」や「x86setupidt()」など、それが属するアーキテクチャの前に接頭する必要があります。詳細については、formatting.txtを参照してください
さらに、関数はマクロを使用して、Inout、Optなどを使用して、関数が引数で何をするかを明確に識別する必要があります。これらのマクロは何も拡大しておらず、ドキュメントを支援するためだけにあります。
軽量コアカーネル。ドライバーの機能の大部分。プロセスはlibosに通信します(syscallsは、これが呼ばれたことをLibosドライバーに伝えるカーネルテーブルに移動します。)
ドライバーはシステムコールを処理して、GCCのGNUマッハバージョン、またはMARSでセットされた全員のお気に入りのDOSゲームなど、「外国の」プログラムを実行していないことを許可します。
安定した内部カーネルABI。サードパーティのドライバーは、マイナーな改訂版で作業する必要があります。深刻な変更には、pnextポインターを使用します。
偶発的なdeltreeすべてを永久に削除しないように、安定したバージョンファイルシステムが含まれています。ユーザーがバックアップを行わないと仮定します。
(最終的に)GPUの「Vega」および「Navi」ファミリーの完全なVulkan準拠のドライバーを作成します。
サポートx86-64仮想化拡張機能( "Pacifica")。
Feralがサーバー操作に役立つようにするために、Chroot刑務所や容器のようなもの。
それに取り組むのが楽しいことはいつか役に立つかもしれませんか?