2

ダニエルとマルコによる「Linux カーネルの理解」のコースの一部として、Linux の「メモリ管理」を理解しようとしています。以下は、カーネル空間に関する私の理解です

  1. 32 ビット マシンでは、各プロセスに 4GB の仮想アドレス空間があります。3GB - ユーザー スペースと 1GB - カーネル スペース。
  2. 1 GB はプロセス間で共有され、1 GB の RAM に直接マップされます。このスペースは、カーネル コード、ページ テーブルなどを格納するために使用されます。
  3. 1 GB はスワップアウトできません。ただし、解放することはできます。

私の質問は、プロセスが必要とするカーネル スペースの合計が 1 GB を超えた場合はどうなるかということです。

4

1 に答える 1

5

まず、修正 - カーネルが 1:1 でマッピングした (ほぼ) 1Gb は、カーネルだけが使用するわけではありません。カーネルがそのメモリに最も簡単にアクセスできるというだけです。カーネルコードと静的データを保持します。

カーネル仮想空間には、実際には仮想アドレス空間の上部 (カーネルが使用する 1Gb の上部) に 256 Mb (数値は動的) のようなものがあり、残りのカーネル線形アドレスのように 1:1 でマップされていませんが、代わりに、さまざまなページに動的にマップされます。vmalloc によって連続していない物理メモリから仮想連続領域を取得するか、ioremap によってメモリ マップされた IO をマップするか、kmap を介して 1Gb 以上のページにアクセスします。

要約すると、カーネルがより多くのメモリにアクセスする必要がある場合、(ほぼ) 1Gb は常に 1:1 設定でマップされており、ユーザー空間と同様に動的メモリを使用します。

于 2012-09-13T05:23:38.887 に答える