2

私は実験として C 言語とアセンブリで簡単な小さなおもちゃの OS を開発していますが、システム メモリに関する知識が不足しているため、自分自身を心配し始めています。

カーネルをコンパイルし、Bochs (GRUB によってロード) で実行して、「Hello, world!」と出力することができました。今、私は簡単なメモリ マネージャーを作成しようとしています。

メモリ管理に関するリソースをいくつか見つけましたが、実際には十分なコードがありませんでした (概念は理解していましたが、実際に実装する方法を知ることができませんでした)。

多かれ少なかれ複雑な戦略をいくつか試した後、変更が必要になるまで、途方もなく単純な戦略 (メモリにオフセットを保持し、割り当てられたオブジェクトのサイズだけ増加させるだけ) に落ち着きました。断片化の制御、保護などはまだありません。

そのため、より堅牢なマネージャーが必要な場合に、どこでより多くの情報を見つけることができるかを知りたい. また、ページング、セグメンテーション、およびその他の関連事項についても学びたいと思います。ページングについては今のところまったく扱っていませんが、OS の開発現場でよく言われているので、そのうち対応しなければならないと思います。

また、メモリ マネージャーによって実際の場所にリダイレクトされるポインターをアプリケーションが保持する、何らかの形式の間接ポインターについても読みました。それは私にとってはかなり先のことだと思いますが、仮想メモリやデフラグを試してみたいと思った場合は重要なようです.

また、メモリオフセットをどこに置くべきですか? 最適な場所がどこなのかわからなかったので、ランダムに選んだだけで0x1000、後でカーネルなどを上書きしたときに戻ってくると確信しています。

また、パフォーマンスに関して何を期待すべきか (割り当てと解放の Big-O 値など) と、実際に管理されているメモリに対するメモリ管理構造の妥当な比率を知りたいです。

もちろん、これらの質問のサブセットだけに自由に答えてください。どんなフィードバックでも大歓迎です!

4

2 に答える 2

3

まだ知らない場合は、http://wiki.osdev.org/が一般的に優れたリソースであり、メモリ管理に関する記事が複数あります。特定のメモリ割り当てアルゴリズムを探している場合は、「バディ システム」メソッド (http://en.wikipedia.org/wiki/Buddy_memory_allocation) を読むことをお勧めします。おそらくインターネットで実装例を見つけることができると思います。ライブラリでコピーを見つけることができれば、The Art Of Computer Programming のメモリ管理に関するセクション (Volume 1、Section 2.5) も読む価値があるでしょう。

メモリ オフセットをどこに配置すればよいかわかりません (正直なところ、カーネルを書いたことはありません)。そのアドレスの後の割り当て。何かのようなもの:

(In the memory manager)
extern char endOfKernel;
... (also in the memory manager)
myOffset = &endOfKernel;
... (at the end of the file that gets placed last in the binary)
char endOfKernel;

言うまでもありませんが、オペレーティング システムにどれだけ真剣に取り組んでいるかにもよりますが、オペレーティング システムの設計に関する本が必要になるでしょう。

于 2011-03-17T00:10:59.243 に答える
2

LD で GCC を使用している場合は、.BSS セクションの最後にシンボルを定義するリンカー スクリプトを作成できます (これにより、カーネルのメモリ フットプリントの完全なサイズが得られます)。実際、多くのカーネルは、この値を GRUB の AOUT_KLUDGE ヘッダーのパラメーターとして使用しています。

詳細については、 http://wiki.osdev.org/Bare_bones#linker.ldebssを参照してください。リンカー スクリプト内のシンボルの宣言に注意してください。

于 2011-03-29T17:12:15.177 に答える