Linux 3/1 仮想アドレス分割
-
11-09-2019 - |
質問
1GB を超える RAM に対処するための highmem の必要性を理解するには、何かが欠けています。誰かが私が間違っているところを指摘してもらえますか?ありがとう!
私が知っていること:
プロセスの仮想メモリ (高メモリ領域) の 1 GB がカーネル操作用に予約されています。ユーザースペースは残りの 3 GB を使用できます。こちらは3/1分割です。
VM の仮想メモリ機能は、(連続した) 仮想メモリ ページを物理ページ (RAM) にマップします。
分からないこと:
カーネル仮想メモリを使用する操作は何ですか?カーネル空間の kmalloc(...) のようなものはカーネル仮想メモリを使用すると思います。
このスキームでは 4GB の RAM を使用できると思います。カーネルの 1 GB 仮想スペースが、物理スペースをアドレス指定する際の制限要因となる理由がわかりません。ここで私の理解が崩れてしまいます。お知らせ下さい。
これを読んでいました(http://kerneltrap.org/node/2450)、素晴らしいですね。しかし、それは私の質問に完全には応えていません。
解決
カーネルはすべての物理メモリへのアクセスを必要とし、それが物理メモリにアクセスする方法は、カーネル仮想アドレスを介して行われているため、カーネル仮想空間が使用可能な物理メモリ上の制限因子であることが理由です。カーネルは物理メモリ位置への直接アクセスを許可する特別な命令を使用していません - 。それはに話をしたい任意の物理的な範囲については、ページ・テーブル・エントリを設定する必要があります。
「古いスタイル」方式で、カーネルセット物事にはすべてのプロセスのページテーブルが0xC0000000
する0xFFFFFFFF
から物理アドレスへの直接0x00000000
する0x3FFFFFFF
から仮想アドレスをマッピングされたように、彼らはリングでのみアクセス可能だったように、(これらのページがマークされていました0 - カーネルモード)。これらは、「カーネル仮想アドレス」です。この方式では、カーネルが直接マッピングを変更するにはMMUをいじることなく、任意の物理的なメモリ位置を読み、書くことができます。
はHIGHMEMスキームの下では、カーネル仮想アドレスから物理アドレスへのマッピングは固定されていない - 物理メモリの部分はで、カーネルはそのメモリにアクセスする必要があるとして、カーネル仮想アドレス空間の外にマッピングされています。これは非常に高価な操作である、より多くの物理メモリを使用することができますが、常に仮想から物理へのマッピングを変更することのコストでます。
他のヒント
のマッピング1 GBのプロセスは、コンテキストスイッチを行うことなく、カーネルモードに切り替えることができます。このようread()
、mmap()
および他のようなシステムコールへの応答、その後、適切に呼び出し元プロセスのアドレス空間内で処理することができます。
、ユーザ空間のコードを実行する間に「カーネルモード」への切り替えがより高価であり、ハードウェアのMMU(メモリ管理ユニット)を介して仮想アドレスマッピングを使用することができないためシステムの保守を依頼されて呼び出します。
の物理メモリが1GB以上で32ビットカーネルを実行しているシステムは、(約1GBのマーク上方)ZONE_HIGHMEM
物理メモリ位置を割り当てることが可能であり、それらと相互作用する特定の操作のためのフープを介してジャンプするようにカーネルを必要とすることができます。 PAE(物理アドレス拡張)の添加は、ZONE_HIGHMEM
に割り当てられた領域に、1ギガバイトの物理アドレスメモリ内のメモリの割合を減少させる、物理メモリの64ギガバイト点で最大可能にすることによって、この問題を拡張します。
- たとえば、システムコールはカーネル空間を使用します。
- 64 GB の物理 RAM を搭載できますが、32 ビット プラットフォームでは、32 ビット仮想アドレス指定のため、プロセッサは 4 GB にしかアクセスできません。実際には、1 GB の RAM と 3 GB のスワップを搭載でき、仮想アドレス指定により 4 GB があるように見えます。64 ビット プラットフォームでは、仮想アドレス指定は事実上無制限です。