High Memory(ユーザースペース)と HighMem(カーネルスペース)

High Memory(ユーザースペース)と HighMem(カーネルスペース)

各プロセスには、ユーザースペース(高メモリー)とカーネルスペース(低メモリー)の2つのメモリー領域があります。カーネル空間では、最初の896 MBはカーネルコードをマッピングするために使用されます(正確に1 GBではありません)。これは、ユーザー空間アプリケーションがシステムコールまたはカーネルに関連するすべてを実行すると、カーネルがシステムコールを実行するためにカーネルスペースを参照することを意味します。

カーネル空間(高度なメモリ(ユーザ空間)アクセスに使用される)に予約されている128 MBはすべてユーザ空間メモリ領域を参照しますか?それでは、カーネルプロセスがこの領域を参照してすべてのユーザースペースにアクセスできることは本当ですか?

それで、カーネル空間ではこの領域をhighmemと呼びますか?

答え1

「高メモリ」および「低メモリ」は、プロセスの仮想アドレス空間ではなく物理メモリに適用される。

プロセスの仮想アドレス空間では、ユーザー空間はこの線形アドレス空間の最初の3GBを占め、カーネル空間はこの線形アドレス空間の4GBを占めます。

最初の896 MBのカーネルスペース(カーネルコードだけでなくそのデータも含む)は、最初の896 MBの物理メモリに「直接」マッピングされます。仮想カーネル空間の896MB部分の線形アドレスと物理メモリの対応するアドレスとの間に常に0xc0000000のオフセットがあるという点で、「直接」ですが、MMUが有効になり、ページテーブルエントリが実際に使用されることに注意してください。このため)。

仮想カーネル空間の最後の128 MB部分は、マッピングされた物理的な「上位メモリ」の一部(> 896 MB)です。したがって、一度に128 MB以下の「上位メモリ」のみをマッピングできます。

参照:「Linuxカーネルについて」、第3版 - 「8.1.3.メモリ領域」および「8.1.6.大容量メモリページフレームのカーネルマッピング」セクション。

答え2

気づく:-メモリパーティションは、以前のLinuxシステムでのみ発生します(32ビット)詳細については、下記のコメントをご覧ください。

高メモリと低メモリ:

  • メモリ不足:論理アドレスはカーネル空間のメモリに存在します。遭遇するほとんどすべてのシステムでは、すべてのメモリは不足メモリです。
  • 高メモリ:論理アドレスはカーネル仮想アドレス用に予約されているアドレスの範囲外であるため、そのアドレスのメモリはありません。これは、カーネルがアクセスしようとする物理メモリセグメントの一時マッピングを使用して開始する必要があることを意味します。

カーネルは仮想アドレスを2つの部分に分割します。ユーザーアドレス空間とコアアドレス空間。カーネルのコードとデータ構造はそのスペースに収まるべきですが、カーネルアドレス空間の最大の消費者は物理メモリの仮想マッピングです。したがって、カーネルには直接アクセス可能なメモリを格納するために独自の仮想アドレスが必要です。したがって、カーネルが処理できる物理メモリの最大量は、仮想アドレス空間のカーネル部分にマッピングできる量からカーネルコードで使用されるスペースを引いたものです。

ここに画像の説明を入力してください。

関連情報