これは、私がこれまでにやったことのないことで遊ぶための小さな趣味です...それは機能的、便利、安全、または信頼性を持つことを意図していません。実装するのはほぼ楽しいことです。
私が今までで最新のことを見たい場合は、このリポジトリのdevブランチをチェックしてください。通常、 masterコンパイルして実行する必要があります。
librsから始めます(このプロジェクトのLIBCに相当)。
user/src/main.rs参照してください。cargo xbuild --target target.jsonを使用してユーザースペースのプログラムをコンパイルしますページング
memory::paging::map_regionIPCに合格するゼロコピーメッセージ。メッセージを送信するには、
私は、プロセスをまったく持っていないという考えをいじっています。能力を渡すことを選択したかもしれない継続の継続的なものだけです。
現在、1500 locを少し超えるloc(コメント + Whitespace +依存関係は含まれていません)。悪くない!
カーネル自体は、kthreadsのようなものを使用するのではなく、継続ベースです。最初のパスでは、私はただ物事を機能させています。後で、私は戻って効率的にするかもしれません。
カーネルスペースやユーザースペースでのタイマーベースの先制はありません(ただし、タイマーが機能するようにタイマー割り込みは発生します)。ユーザースペースにロック、マルチスレッドはありません。すべてのプロセスは、シングルスレッドで継続ベースです。各Continuation 、追加の継続的なセットを返すことができ、任意の順序で実行されます。継続は、I/Oや別のプロセスの終了などのイベントを待つこともできます。
単一のアドレススペース。すべてが同じアドレス空間に住んでいます。ページテーブルの入力ビットは、いくつかの継続のためにアドレス空間の特定の部分を無効にするために使用されます。
動的メモリ割り当てのための小さなカーネルヒープ。
物理フレーム割り当てのためのバディアロケーター。
仮想アドレススペース領域のバディアロケーター。
メモリ領域など、システム内のリソースへのアクセスを管理するためのシンプルな機能システム。
UsermodeおよびBackに切り替えます。
syscallおよびsysret命令を介したシステム呼び出し。
ポジションに依存しないELFバイナリをユーザーモードタスクとしてロードし、実行し、syscall経由で終了します。
ほとんど機能している基本カーネルがあるので、私はもので遊んでください!
錆、毎晩
rustc 1.45.0-nightly (99cb9ccb9 2020-05-11) llvm-tools-preview Rustup rustup component add llvm-tools-preview
cargo xbuildおよびcargo bootimage cargo install cargo-xbuild bootimage
build-essentialsと標準的なユーティル: gcc 、 make 、 ld 、 objcopy 、 dd
実行するqemu
構築して実行します
$ cd os2/user
$ cargo xbuild --target x86_64-unknown-elf.json --release
$ cd ../kernel
$ bootimage run bootimageオプションで渡すことができます--release最適化されたビルドのリリース。