これは、GOプログラミング言語でOSカーネルを作成しようとする場所に取り組んでいる小さな実験です。
目標は、「完全に」機能的なオペレーティングシステムを作成することではなく(これが何を意味するか)、オペレーティングシステムとそれらの作成方法についてさらに学ぶことです。
もともと私はFAT32-Filesystemを実装することを計画していました。 (cで)1つを実装しましたが、Harwareが欠落しているため、プロジェクトに取り組み続けることはできません。もちろん、Linuxにファイルシステムを簡単に実装できますが、それはちょっと退屈です。
代わりに、私はこのプロジェクトのために自分のOSを書き始めました。また、学習を開始する方法でもあります。まあ、少なくともやや。
オペレーティングシステムを書くというアイデアを得たとき、Cを使用したくないことを知っていました。CでOSを書いた経験がすでにあったので、錆を使用するかOSを書くかを審議しました。最終的な決定要因は、それが大きな課題になることでした。
さて、あなたはカーネルを書くために行くのはそれほど良いアイデアではないと思うかもしれません、そしてあなたは正しいでしょう。 Go-Runtimeは、オペレーティングシステムのユーザースペースで使用するように設計されています。 Syscallsを呼び出す能力や動的メモリ割り当ての使用など、これが意味する多くの仮定があります。カーネルでは、OSであるため、OSを処理するためにOSに頼ることはできません。ただし、注意深いプログラミングと特定のゴーフィーチャーをあきらめることで、それを行うことができます。それは挑戦です。
このプロジェクトの目標の1つは、物事を迅速に達成することです。そのため、OSの設計に時間を費やしませんでした。プロセス全体をスピードアップするために、LinuxのSyscallインターフェイスを使用することにしました。このようにして、自分のユーザースペースライブラリを書く必要はなく、ユーザースペースで必要なプログラミング言語を使用できます。ただし、かなりの数の欠点があります。私はLinuxと同じ方法でsyscallsを行いますが、これにはLinuxのすべての仮定も使用する必要があります。たとえば、プロセスを開始すると、Linuxと同じようにメモリスペースをセットアップするように再Quurが設定します。SyscallsはLinuxカーネルで予想される値を返す必要があり、カーネル設計はモノリシカルであると想定されます。
このデザインに固執するかどうかはまだわかりません。私が持っていたもう1つのアイデアは、自分のABIを書くだけでなく、Linux Syscallsを傍受してOSに翻訳するLinux-Syscallラッパーライブラリを書くことです。