各プロセスには、ユーザー空間 (高メモリ) とカーネル空間 (低メモリ) の 2 つのメモリ領域があります。カーネル空間では、最初の 896 MB がカーネル コードのマッピングに使用されます (1 GB 全体ではありません)。つまり、ユーザー空間アプリケーションがシステム コールまたはカーネルに関連する何かを実行する場合、カーネルはシステム コールを実行するためにカーネル空間を参照するということですか?
カーネル空間に予約されている 128MB (高メモリ (ユーザー空間) アクセス用) は、すべてユーザー空間メモリ領域の参照ですか? つまり、カーネル プロセスはこの領域を参照することで任意のユーザー空間にアクセスできるということですが、これは本当ですか?
だからこの領域はカーネル空間では highmem と呼ばれているんですね。
答え1
「高メモリ」と「低メモリ」はプロセスの仮想アドレス空間には適用されず、物理メモリに関係します。
プロセスの仮想アドレス空間では、ユーザー空間がこの線形アドレス空間の最初の 3 GB を占め、カーネル空間がこの線形アドレス空間の 4 番目の GB を占めます。
カーネル空間の最初の 896 MB (カーネル コードだけでなくそのデータも) は、物理メモリの最初の 896 MB に「直接」マップされます。「直接」というのは、仮想カーネル空間のこの 896 MB 部分の任意の線形アドレスと物理メモリ内の対応するアドレスの間には常に 0xc0000000 のオフセットがあるという意味です (ただし、MMU が有効になっており、ページ テーブル エントリが実際にこのために使用されることに注意してください)。
仮想カーネル空間の最後の 128 MB の部分は、物理的な「ハイ メモリ」 (> 896 MB) の一部がマップされる場所です。したがって、一度にマップできる「ハイ メモリ」は 128 MB までです。
参考資料: 「Linux カーネルの理解」、第 3 版 - セクション「8.1.3. メモリ ゾーン」および「8.1.6. 高メモリ ページ フレームのカーネル マッピング」。
答え2
注意:-メモリ分割は古いLinuxシステムでのみ発生します(32ビット) 詳細については、下記のコメントをご覧ください。
メモリの高低:
- 低メモリ :カーネル空間に論理アドレスが存在するメモリ。ほとんどすべてのシステムでは、すべてのメモリが低メモリです。
- 大容量メモリ:カーネル仮想アドレス用に確保されたアドレス範囲を超えているため、論理アドレスが存在しないメモリ。つまり、カーネルはアクセスする物理メモリの部分の一時的なマッピングを使い始める必要があります。
カーネルは仮想アドレスを2つの部分に分割しますユーザーアドレス空間とカーネルアドレス空間。カーネルのコードとデータ構造はその空間に収まる必要がありますが、カーネル アドレス空間を最も多く消費するのは物理メモリの仮想マッピングです。したがって、カーネルは直接アクセスする必要があるメモリに対して独自の仮想アドレスを必要とします。したがって、カーネルが処理できる物理メモリの最大量は、仮想アドレス空間のカーネル部分にマップできる量からカーネル コードが使用する空間を差し引いた量になります。