11

highmemが1GBを超えるRAMに対応する必要性を理解することになると、何かが足りません。誰かが私がどこで間違っているのか指摘できますか?ありがとう!

私が知っていること:

  • 1 GBのプロセスの仮想メモリ(高メモリ領域)は、カーネル操作用に予約されています。ユーザースペースは残りの3GBを使用できます。これは3/1分割です。

  • VMの仮想メモリ機能は、(連続した)仮想メモリページを物理ページ(RAM)にマップします。

私が知らないこと:

  • カーネル仮想メモリを使用する操作は何ですか?カーネル空間のkmalloc(...)のようなものはカーネル仮想メモリを使用すると思います。

  • このスキームでは4GBのRAMを使用できると思います。物理スペースをアドレス指定するときに、カーネルの1GB仮想スペースが制限要因である理由がわかりません。これは私の理解が崩壊するところです。お知らせ下さい。

私はこれ(http://kerneltrap.org/node/2450)を読んでいます。これは素晴らしいことです。しかし、それは私の好みに合った私の質問に完全には対応していません。

4

3 に答える 3

12

カーネル仮想空間が使用可能な物理メモリの制限要因である理由は、カーネルがすべての物理メモリにアクセスする必要があり、物理メモリにアクセスする方法がカーネル仮想アドレスを介するためです。カーネルは、物理メモリの場所に直接アクセスできる特別な命令を使用しません。カーネルは、通信する物理範囲のページテーブルエントリを設定する必要があります。

「古いスタイル」のスキームでは、カーネルは、すべてのプロセスのページテーブルが仮想アドレスを0xC0000000から0xFFFFFFFF直接物理アドレスにマップするように設定0x00000000します0x3FFFFFFF(これらのページは、リング0-カーネルモードでのみアクセスできるようにマークされています)。これらは「カーネル仮想アドレス」です。このスキームでは、カーネルは、マッピングを変更するためにMMUをいじる必要なしに、物理メモリの場所を直接読み書きできます。

HIGHMEMスキームでは、カーネル仮想アドレスから物理アドレスへのマッピングは固定されていません。カーネルがそのメモリにアクセスする必要があるため、物理メモリの一部がカーネル仮想アドレス空間にマッピングされます。これにより、より多くの物理メモリを使用できますが、仮想から物理へのマッピングを絶えず変更する必要があり、非常にコストのかかる操作になります。

于 2009-11-02T06:16:13.027 に答える
6

各プロセスで1GBをカーネルにマッピングすると、プロセスはコンテキストスイッチを実行せずにカーネルモードに切り替えることができます。read()、などのシステムコールへの応答mmap()は、呼び出し元のプロセスのアドレス空間で適切に処理できます。

各プロセスでカーネル用のスペースが予約されていない場合、ユーザースペースコードの実行の間に「カーネルモード」に切り替えると、コストが高くなり、システムコールにハードウェアMMU(メモリ管理ユニット)を介した仮想アドレスマッピングを使用できなくなります。サービスを受けています。

1GBを超える物理メモリを備えた32ビットカーネルを実行しているシステムは、物理メモリの場所をZONE_HIGHMEM(1GBマークよりほぼ上に)割り当てることができます。これにより、特定の操作が相互作用するためにカーネルがフープをジャンプする必要があります。PAE(物理アドレス拡張)を追加すると、最大64GBの物理メモリが許可され、で割り当てられた領域に対する1GBの物理アドレスメモリ内のメモリの比率が減少するため、この問題が拡張されZONE_HIGHMEMます。

于 2009-11-01T23:38:33.377 に答える
-2
  1. たとえば、システムコールはカーネルスペースを使用します。
  2. 64GBの物理RAMを使用できますが、32ビットプラットフォームでは、32ビット仮想アドレス指定のためにプロセッサがアクセスできるのは4GBのみです。実際には、1GBのRAMと3GBのスワップを使用でき、仮想アドレス指定により、4GBのように見えます。64ビットプラットフォームでは、仮想アドレス指定は実質的に無制限です。
于 2009-11-01T23:28:06.610 に答える