KMALLOCはページサイズのメモリにのみ割り当てますか、それともより少ない割り当てが可能ですか?kmallocが割り当てることができるサイズはどれくらいですか?どこを見ても、実際にどれだけのメモリが割り当てられているかはわかりませんが、その説明はどこにありますか?私が知りたいのは、KMALLOCが割り当てる実際のサイズです。2のパワーのサイズを割り当てますか?準備ができているキャッシュから空きオブジェクトを見つけるだけですか?
3 に答える
私の理解は次のとおりです。カーネルはシステムの物理メモリを処理しています。これはページサイズのチャンクでのみ使用できます。したがって、呼び出す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
それはすべて、カーネルで使用されているアロケータによって異なります。スラブ、スラブまたはスロブ。次のカーネル構成変数を参照してください。
CONFIG_SLAB
CONFIG_SLUB
CONFIG_SLOB
上記のすべてのアロケータは、MAX_ORDERとPAGE_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です。
kmalloc()
あなたはあなたのシステムで使用されるいくつかの一般的なサイズを見ることができます:
cat /proc/slabinfo | grep kmalloc
kmallocが1ページ未満を割り当てることができるかどうかの検討よりも重要なのは、1ページより多くを割り当てることができるかどうかの問題です。kmalloc()
アトミックコンテキスト(GFP_ATOMIC
フラグを使用)で呼び出している場合、それは非常に試行できません。メモリ内で連続するページを見つけるのは難しいため、メモリが非常に断片化されていて、割り当ての順序が高い(allocation size → pagesize*2^(allocation order))
場合、割り当てが失敗する可能性があります。したがって、アトミックコンテキストでは、大きな割り当ては失敗する可能性があります。
AF_UNIXデータグラムの最大サイズに関するこの他のSOの質問で、注文7(512 Kb)の割り当てに失敗した例があります。