2011-12-30 7 views
4

オペレーティングシステムの設計では、カーネルはほとんどの場合、高い仮想メモリアドレスにマップされるため、上位メモリ部分の制御が得られます。以下のスペースは、「Linux 3/1 virtual address split」という優れた方法で説明されているように、ユーザー空間で動作するアプリケーション用です。カーネルのハイメモリ

私が知りたいのは、なぜですか?この設計決定はどうですか?なぜカーネルはメモリの下位部分を使用しないのですか?これは私にとって本当に明確ではない、あるいは私は何かを監督したかもしれない。

編集:この質問は物理アドレスではなく仮想アドレスに関するものです。

+0

ユーザスペースコード – ren

+0

から保護する必要があるメモリの部分を覚えやすくするための規則ですが、カーネルのメモリは常に制限されているか、ユーザー空間のメモリが無駄になっている可能性があります。したがって、カーネルが(例えば、モジュールをロードするために)追加のメモリを必要とするとき、それを確保するための特定のパーミッションを割り当てることができます(ページングが有効な場合)。 –

答えて

6

このような設計のために/理由のいくつかの利点:

  • アプリケーションは、カーネルのサイズや位置を気にする必要はありません、彼らはから始まる、メモリ内のものだけをしているふりをしますコードやデータの再配置が最小限に抑えられます。したがって、アプリケーションは設計および実装が容易であり、メモリ管理に関連するバグが発生しにくい可能性があります。
  • アプリケーションでは、より小さい/より短いアドレス/ポインタを使用して、メモリを節約できます。
  • x86 CPUでは、16ビットおよび32ビットのアドレス空間は仮想アドレス0から始まり、約1MB(実仮想8086モードの場合)、16MB(i80286 +の場合は16ビット保護モード)、4GB (32ビットモード、非現実モード)。カーネルをより低いアドレスに配置すると、アプリケーション(例えば、32ビットモードでは16ビットアプリケーション、64ビットモードでは32ビットアプリケーション)で使用できるアドレスの範囲が狭くなり、メモリ管理が複雑になります。カーネルを仮想アドレス空間の先頭に移動させることは、一般にx86上では意味があります。

他の理由があります。通常はプラットフォーム固有です。いくつかのプラットフォームでは、2つのオプションの間にほとんどまたはまったく違いがないかもしれません。しかし、他のものでは、好ましいカーネルの位置は、より低い仮想アドレスにある可能性があります。詳細は重要です。

+1

これはちょっとわかります。カーネルは仮想メモリ管理を実装しているため、すべてのユーザアプリケーションに0x0番地の再配置機能を提供します。その場合、カーネルがメモリを制御する唯一のインスタンスである場合、カーネルをメモリに配置することは重要ではありません。意味がありますか? –

+1

カーネルが再配置を行う前に、コンパイラは再配置可能なバイナリを生成する必要があることを忘れないでください。すべてのアプリケーションが〜0で開始できる場合、バイナリのコードはよりシンプルになり、バイナリには再配置情報が含まれない可能性があります。コンパイラは簡単になるか、作業が少なくて済みます。 –

+0

私はそれを認識していますが、これはカーネルのコンパイルには影響しません。カーネルが再配置情報でコンパイルされ、仮想メモリ管理を実装する場合、すべてのアプリは〜0で始めることができますが、(私の意見では)カーネルの「位置」は関係ありません。 –

関連する問題