web-dev-qa-db-ja.com

32ビットLinuxカーネルの最大メモリ割り当て

私は、RAMの合計量が4GBを超えている場合でも、32ビットウィンドウでのカーネル使用専用のRAMの最大量が2GBであるという記事を読んでいました。

http://www.brianmadden.com/blogs/brianmadden/archive/2004/02/19/the-4gb-windows-memory-limit-what-does-it-really-mean.aspx \

  1. これは、32ビットubuntu 10.04のような32ビットLinux環境でも同じですか? IEメインメモリの合計が4GBを超えている場合でも、最大カーネル割り当ては2GB RAMですか?

  2. PAEオプションを有効にしてカーネルを再コンパイルすることにより、メモリの合計量を64GBのRAMに増やす場合、カーネルの使用に割り当てることができるRAMの最大量はどれくらいですか?それはまだ2GBですか?それとも増やすことができますか?

4
user784637

どちらのカーネルも、仮想アドレス空間をユーザー部分とカーネル部分に分割します。カーネル部分はシステム内のすべてのプロセス間で共有されるため、カーネルは直接アドレス指定可能なメモリに制限されます。システム内の各ユーザープロセスには、アドレス空間の独自のユーザー部分があります。古典的に、この分割は中央で行われ、各半分に2GBが与えられました。 Windowsは、/ 3gb boot.iniスイッチを使用して、分割をユーザーの場合は3GB、カーネルの場合は1GBに移動するように指示できます。 Linuxカーネルはビルド時にかなり構成可能であり、最後に確認したところ、Ubuntuカーネルは3:1分割でビルドされます。

PAEでは、64 GBの物理RAMをアドレス指定できますが、特定のページテーブルは4GBに制限されています。システム上のすべてのプロセス間で共有されるアドレス空間のカーネル部分は1つしかないため、直接アドレス指定可能なRAMは1GBまたは2GBに制限されます。追加の物理メモリを使用できますが、いつでも仮想アドレス空間に部分的にマッピングする必要があり、マッピングは必要に応じて変更されます。各プロセスには個別のユーザーアドレス空間があるため、たとえば、インストールした16GBの物理RAMのさまざまな部分にマップする2GBの独自のメモリを持つ5つの異なるプロセスと、別の2GBを使用するカーネルを持つことができます。

ファイルシステムキャッシュはページを常にマップする必要がないため、その物理RAMをさらに多く使用でき、カーネルは必要に応じてそのビットを自動的にマップし、マップを解除して他のページをマップできるようにします。このトリックにより、カーネルに1 GBの仮想アドレス空間しかない場合でも、カーネルはキャッシュに数GBのメモリを使用し、その他の用途には数百MBを使用できます。

また、最近のバージョンのWindowsでは、Microsoftがさまざまな人工的な製品ライセンスの制限を設けていることも注目に値します。職場のPCで立ち往生しているWindows7 Proは、PAEを有効にしても、4 GBを超える物理RAMアドレスの使用を拒否します。その結果、インストールされている4.0 GBのRAMのうち3.4のみを使用できるようになります。これは、ラムは4GBのマークの上に再配置され、ビデオRAMなどを4GBの下に配置するためのスペースを残します。

6
psusi

通常、ウィンドウがすべてのメモリを割り当てることができない理由は、そのメモリスペースの一部がビデオRAMに使用されているためです。

PAEについての質問については、よくわかりません。 64GBのRAMとPAEがあれば、おそらく合計で4ギガ以上を使用できますが、個々のプログラムは4ギガのRAMに制限されると思います。

この問題は、32ビット整数によって提供されるアドレス空間に起因します。 2 ^ 32は4294967295の値を提供するため、4ギガのRAM制限があります。

1

このテキスト によると、Linuxは3Gで分割されるため、Windowsの場合と同様にRAM)の3Gに一度にアクセスできるはずです boot.iniに適用される3GBスイッチ

少なくとも、理論的には。私にはわからない何らかの理由により、テストにより、このメモリの一部しか使用できないことが証明されました。

08048000-0804b000 data?
0804b000-081ce000 heap
65e00000-b7395000 mmap-ed heap
b7395000-b73ac000 mmap-ed code
bf93f000-bf960000 stack

081ce000-65e00000からの範囲をmalloc()できなかった理由はわかりません。

0
glglgl