私のシステムメモリは十分です(24GBのサーバー)。私のシステムでは、カーネルスペースはクラッシュカーネル用に320MBと120MBに割り当てられています。残りのメモリは他の目的に使用されます。ただし、__get_free_pages()
11の順序で連続したページを割り当てるために使用すると、カーネルは2^10ページを割り当てることができません。なんで?
makelinuxによると
注文の最大許容値は、アーキテクチャに応じて10または11(1024または2048ページに対応)です。ただし、大量のメモリを備えた新しく起動したシステム以外で10次割り当てが成功する可能性はわずかです。
どうしてこんなことに?私のシステムの各ページは4KB(4096バイト)、2 ^10ページ=1024ページ、合計サイズは1024 * 4096 = 4 194 304(バイト)〜4MBです。隣接するスペースはわずか4MBで、カーネルは非常に小さいです。vmlinuzはわずか2.1MB、initrdは15MBです。カーネル全体の合計メモリ消費量は約300MBです。カーネルが4MBの連続したページを割り当てるには十分すぎる必要があります。1GB / 3GBカーネル/ユーザーの通常のマシンでも、カーネルが1GB全体を使い果たしないようにしてください。しかし、4MBの連続したページだけでの割り当てが失敗する可能性があるのはなぜですか?そして、カーネル空間では、メモリは(仮想メモリマッピングのために)物理メモリに分散されていませんが、線形で連続していると思います。
最初に2^10ページの割り当てでカーネルモジュールをロードしようとしましたが、失敗してスタックトレースをダンプします。
[ 6.037056] [<ffffffff810041ec>] dump_trace+0x86/0x2de
[ 6.037063] [<ffffffff8122fe83>] dump_stack+0x69/0x6f
[ 6.037070] [<ffffffff8108704e>] warn_alloc_failed+0x13f/0x151
[ 6.037076] [<ffffffff8108786a>] __alloc_pages_nodemask+0x80a/0x871
[ 6.037081] [<ffffffff81087959>] __get_free_pages+0x12/0x50