私が取り組んでいる OS 用のカーネル (実際には「コア」と呼んでいますが、基本的には同じです) の設計に取り組んでいます。マルチタスキングやメモリ管理などの基本的なことができなければ、OS 自体の詳細は関係ないので、まずはそこから取り組む必要があります。malloc ルーチンの設計について質問があります。
malloc() はカーネル自体の一部 (私はこれに傾倒しています) またはプログラムの一部になると考えていますが、C 標準ライブラリの独自の実装を作成する必要があります。というわけで、malloc を書きます。この点に関して、私の質問は実際にはかなり単純です。C (または C++) はそのヒープをどのように管理しますか?
私が理論の授業でいつも教えられてきたのは、ヒープは指定されたアドレスから始まり、多くの意味でスタックのように振る舞うメモリの断片であるということです。このようにして、グローバルスコープで宣言された変数が最初にあり、それぞれのスコープで宣言されると、より多くの変数がヒープに「プッシュ」され、スコープ外に出る変数は単にメモリ空間に残されることがわかります。ただし、そのスペースは空きとしてマークされているため、必要に応じてヒープをさらに拡張できます。
私が知る必要があるのは、C がこのように動的に拡大するヒープを実際にどのように処理するのかということです。コンパイルされた C プログラムは、malloc ルーチンへの独自の呼び出しを行い、独自のヒープを処理しますか? それとも、自動的に拡張するスペースを提供する必要がありますか? また、C プログラムはヒープの開始位置をどのように認識していますか?
ああ、同じ概念が他の言語にも当てはまることは知っていますが、私はその言語に最も慣れているので、例を C/C++ にしたいと思います。スタックなど他のことも気にしないようにしたいと思います。このようなことは自分で処理できると思います。
したがって、私の本当の質問は、malloc/free (ページ自体の取得と解放などを処理する) 以外に、プログラムは OS が他に何かを提供する必要があるのでしょうか?
ありがとう!
EDIT mallocルーチン自体の実際の動作よりも、Cがヒープに関連してmallocを使用する方法に興味があります。それが役立つ場合、私はこれを x86 で実行していますが、C はクロス コンパイラであるため、問題にはなりません。^_^
さらに編集:用語が混乱している可能性があることを理解しています。「ヒープ」は、プログラムがグローバル/ローカル変数などを格納する場所であると教えられました。私はアセンブリ プログラミングで「スタック」を扱うことに慣れていましたが、代わりにおそらくそれを意味していることに気付きました。私のちょっとした調査によると、「ヒープ」は、プログラムがそれ自体に割り当てた合計メモリ、または OS が提供したメモリのページの合計数 (および順序) を指すのによく使用されます。
それで、それを念頭に置いて、拡大し続けるスタックにどのように対処すればよいでしょうか? (私の C 理論の授業は軽度の... 欠陥があったようです。)