blog

Linuxのシステム・メモリはどこに行くのか?

Linuxでは、システムのメモリ使用量を見るのにfreeコマンドがよく使われます。注意深く見ると、合計3419MBしか表示されていないことがわかります。なぜLinuxシステムはそのすべてを特定しなかっ...

Apr 9, 2015 · 4 min. read
シェア

Linuxでは、システムのメモリ使用量を見るのにfreeコマンドがよく使われます。

[root@AC1 ~]# free -m 
             total       used       free     shared    buffers     cached 
Mem:          3419       3101        318          0         62       1930 
-/+ buffers/cache:       1109       2310 
Swap:            0          0          0 

なぜ合計3419MBしか表示されないのか、注意深い学生ならわかるでしょう。通常、メモリサイズが上下しないということはないようです。では、なぜLinuxシステムはすべてを認識しなかったのでしょうか?ハードウェアの認識プロセスがおかしいのでしょうか?さて、BIOSでマシンを再起動してみると、メモリは4GB分、つまりBIOSは全てのメモリを認識できているのですが、Linuxのスタートアップでは全てのメモリを認識できませんでした。その後、カーネルブートログとメモリ関連のプリントを見てください:

[root@AC1 ~]# more /var/log/dmesg 
  
[    0.000000] 2695MB HIGHMEM available. 
[    0.000000] 887MB LOWMEM available. 
  
[    0.000000] Initializing HighMem for node 0 (000377fe:000dffc0) 
[    0.000000] Memory: 3494612k/3669760k available (3678k kernel code, 174680k reserved, 2107k data, 396k init, 2760456k highmem) 
  

小学校の先生が数学をちゃんと教えてくれなかったので、電卓で数えてみると、2695MB+887MB=3582MB、つまり起動時にカーネルが認識したメモリはこれで全部。もう一度見てみると、3582MB*1024=3667968KBは22行目の3669760Kに近く、この行の3494612Kはfreeコマンドで表示される合計memに近い。つまり、カーネルは正直で、やるべきことをやっていて、ずるずるとメモリーを食べているわけではありません。あとはdmsgを見るだけです。

やがてdmesgのスタート地点に着くと、この先にはもう東風はありませんでした。

[0.000000] BIOS-provided physical RAM map: 
[0.000000]  BIOS-e820: 0000000000000000 - 000000000009bc00 (usable) 
[0.000000]  BIOS-e820: 000000000009bc00 - 00000000000a0000 (reserved) 
[0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved) 
[0.000000]  BIOS-e820: 0000000000100000 - 00000000dffc0000 (usable) 
[0.000000]  BIOS-e820: 00000000dffc0000 - 00000000dffce000 (ACPI data) 
[0.000000]  BIOS-e820: 00000000dffce000 - 00000000dffe0000 (ACPI NVS) 
[0.000000]  BIOS-e820: 00000000dffe0000 - 00000000e0000000 (reserved) 
[0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved) 
[0.000000]  BIOS-e820: 00000000ffb00000 - 0000000100000000 (reserved) 
[0.000000]  BIOS-e820: 0000000100000000 - 0000000120000000 (usable) 
[0.000000] Notice: NX (Execute Disable) protection cannot be enabled: non-PAE kernel! 

上の12行目を見てください:0000000100000000 - 0000000120000000このアドレスは、32ビットシステムでアクセスできる範囲を超えています。計算では、0x20000000 = 512Mは、3419Mは......4Gまたはもう少し差があるようです参照してくださいフリー-mに追加されます。実際には、我々は3582Mに512Mを追加する必要があります正しいには、この3582Mはどのように来るのですか?わからない方は前回の内容を復習してください。これを足した結果が4094Mで、4096Mも基本的には同じです。BIOSがシステムメモリの一部をOSがアクセスできない場所にマッピングしている可能性があります。

解決策は2つ:

1.カーネルPAEコンパイルオプションを開き、PAEオプションで64GBを選択します;

2.64ビットシステムの使用

Read next

娘の高校のプログラミングの授業の先生への手紙

[]\n先生へ\nあなたのプログラミング言語の選択に文句を言いたいわけでも、娘が授業で優秀であることについて話したいわけでもありません。事実です。教師として。娘にとってあなたは 非の打ち所がありませんでも他の分野ではあなたには多くの問題があります\nまず

Apr 9, 2015 · 3 min read