10

KMALLOCはページサイズのメモリにのみ割り当てますか、それともより少ない割り当てが可能ですか?kmallocが割り当てることができるサイズはどれくらいですか?どこを見ても、実際にどれだけのメモリが割り当てられているかはわかりませんが、その説明はどこにありますか?私が知りたいのは、KMALLOCが割り当てる実際のサイズです。2のパワーのサイズを割り当てますか?準備ができているキャッシュから空きオブジェクトを見つけるだけですか?

4

3 に答える 3

11

私の理解は次のとおりです。カーネルはシステムの物理メモリを処理しています。これはページサイズのチャンクでのみ使用できます。したがって、呼び出すkmalloc()と、特定の事前定義された固定サイズのバイト配列のみが取得されます。

返される実際のメモリはシステムのアーキテクチャによって異なりますが、kmallocが処理できる最小の割り当ては32バイトまたは64バイトです。kmalloc() 少なくともあなたが要求したのと同じ量(通常はそれ以上)のメモリへの呼び出しから戻ります。通常、128 KBを超えることはありません(ここでも、アーキテクチャに依存します)

システムのページサイズ(バイト単位)を取得するには、次のコマンドを実行します。

getconf PAGESIZE

また

getconf PAGE_SIZE

最大ページサイズに関するこの情報は、/ usr / src / linux / include / linux/slab.hにあります。

はい、ページサイズは通常2の累乗ですが、繰り返しになりますが、要求したとおりに正確に取得することはできませんが、もう少し大きくなります。

次のようなコードを使用できます。

void * stuff;
stuff = kmalloc(1,GFP_KERNEL);
printk("I got: %zu bytes of memory\n", ksize(stuff));
kfree(stuff);

割り当てられたメモリの実際の量を表示するには:

[90144.702588] I got: 32 bytes of memory
于 2012-09-24T16:47:17.837 に答える
9

それはすべて、カーネルで使用されているアロケータによって異なります。スラブ、スラブまたはスロブ。次のカーネル構成変数を参照してください。

CONFIG_SLAB
CONFIG_SLUB
CONFIG_SLOB

上記のすべてのアロケータは、MAX_ORDERPAGE_SHIFTを使用して、kmalloc()の最大制限を決定します。

SLABアロケーターがサポートする最大のkmallocサイズは、32メガバイト(2 ^ 25)、または32MB未満の場合は割り当て可能な最大ページオーダーです。

#define KMALLOC_SHIFT_HIGH      ((MAX_ORDER + PAGE_SHIFT - 1) <= 25 ? \
  (MAX_ORDER + PAGE_SHIFT - 1) : 25)
#define KMALLOC_SHIFT_MAX       KMALLOC_SHIFT_HIGH

SLUBは、オーダー1ページ()に適合するリクエストを直接割り当てますPAGE_SIZE*2。より大きなリクエストはページアロケータに渡されます。

#define KMALLOC_SHIFT_HIGH      (PAGE_SHIFT + 1)
#define KMALLOC_SHIFT_MAX       (MAX_ORDER + PAGE_SHIFT)

SLOBは、1ページを超えるすべての要求をページアロケータに渡します。同じページから異なるサイズのオブジェクトを割り当てることができるため、kmalloc配列は必要ありません。

#define KMALLOC_SHIFT_HIGH      PAGE_SHIFT
#define KMALLOC_SHIFT_MAX       30

kmalloc()による割り当て可能な最大サイズは

#define KMALLOC_MAX_SIZE        (1UL << KMALLOC_SHIFT_MAX)

kmalloc()から割り当て可能な最小サイズは

#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW)

スラブのデフォルトKMALLOC_SHIFT_LOWは5で、スラブとスラブのデフォルトは3です。

于 2016-02-02T11:44:42.357 に答える
3

kmalloc()あなたはあなたのシステムで使用されるいくつかの一般的なサイズを見ることができます:

cat /proc/slabinfo  | grep kmalloc

kmallocが1ページ未満を割り当てることができるかどうかの検討よりも重要なのは、1ページより多くを割り当てることができるかどうかの問題です。kmalloc()アトミックコンテキスト(GFP_ATOMICフラグを使用)で呼び出している場合、それは非常に試行できません。メモリ内で連続するページを見つけるのは難しいため、メモリが非常に断片化されていて、割り当ての順序が高い(allocation size → pagesize*2^(allocation order))場合、割り当てが失敗する可能性があります。したがって、アトミックコンテキストでは、大きな割り当ては失敗する可能性があります。

AF_UNIXデータグラムの最大サイズに関するこの他のSOの質問で、注文7(512 Kb)の割り当てに失敗した例があります。

于 2012-09-24T18:08:33.443 に答える