8

私のシステムメモリは十分です(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
4

1 に答える 1

8

私の記憶が正しければ、バディ・アロケーション__get_free_pagesを使用します。これは、物理メモリー全体にアロケーションを分散させるだけでなく後続の大きな連続ブロックのアロケーションの試行に対して可能な限り最悪のパターンで分散します。私の計算が正しければ、24GBの物理RAMを搭載したシステムでは、バディ割り当て以外のスペースがまったく占有されていなくても、4MBチャンクの割り当てを不可能にするのに8192オーダー0(4KB)未満の割り当てが必要になります。 。__get_free_pages

連続メモリアロケータと呼ばれるものがあります。これは、デバイスドライバによる大規模な物理的に連続した割り当ての真の必要性に対処することになっています。2011年6月の時点では、公式のカーネルには含まれていませんでしたが、それは1年以上前のことです。あなたはそれを調べる必要があります。

于 2012-07-05T08:45:25.600 に答える