2

1 回の呼び出しで kzalloc() を使用して割り当てることができる最大サイズは?

これは非常によくある質問です。また、その値を確認できるかどうか教えてください。

4

3 に答える 3

5

上限 (1 回の kmalloc / kzalloc 要求で割り当てることができるバイト数) は、プロセッサ (実際にはページ サイズ) とバディ システム フリーリストの数 (MAX_ORDER) の関数です。

x86 と ARM の両方で、標準ページ サイズが 4 Kb で MAX_ORDER が 11 の場合、1 回の呼び出しでの kmalloc の上限は 4 MB です。

これをテストするための説明とコードを含む詳細は、こちら: http://kaiwantech.wordpress.com/2011/08/17/kmalloc-and-vmalloc-linux-kernel-memory-allocation-api-limits/

于 2012-08-24T01:29:19.370 に答える
3

kmalloc() と同じです。kzalloc は GFP_ZERO を設定するシン ラッパーに過ぎないため、これが質問 (または検索) すべき質問です。

約 PAGE_SIZE (少なくとも 4k) までは問題ありません:p. それを超えて...多くの人々が尋ねてきたと言ったのは正しいです、それは間違いなくあなたが考えなければならないことです. どうやらそれはカーネルのバージョンに依存するようです - 以前は 128k という厳しい制限がありましたが、現在は引き上げられています (または完全に削除されている可能性があります)。ただし、これは厳密な制限にすぎません。実際に取得できるものは、特定のシステムによって異なります。(そして、カーネルバージョンでは間違いなく)。

多分読んでください vmallocとkmallocの違いは何ですか?

kzalloc() からの戻り値をチェックすることで、いつでも割り当てを「検証」できますが、それまでに、おそらく割り当て失敗のバックトレースをログに記録しているでしょう。それ以外は、事前に確認する良い方法はないと思います。

于 2012-08-23T15:35:19.933 に答える
1

ただし、カーネルのバージョンと構成によって異なります。これらの制限は通常、linux/slab.h にあり、通常は以下のように記述されています (この例は Linux 2.6.32 の下にあります)。

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

そして、以下のコードでそれらをテストできます:

#include <linux/module.h>
#include <linux/slab.h>
int init_module()
{

    printk(KERN_INFO "KMALLOC_SHILFT_LOW:%d, KMALLOC_SHILFT_HIGH:%d, KMALLOC_MIN_SIZE:%d, KMALLOC_MAX_SIZE:%lu\n",
            KMALLOC_SHIFT_LOW,  KMALLOC_SHIFT_HIGH, KMALLOC_MIN_SIZE, KMALLOC_MAX_SIZE);
    return 0;
}

void cleanup_module()
{
    return;
}

最後に、Linux 2.6.32 32 ビットでの結果は 3、22、8、4194304 で、最小サイズが 8 バイト、最大サイズが 4MB であることを意味します。

PS。kmalloc によって割り当てられたメモリの実際のサイズを確認することもできます。ksize() を使用するだけです。

void *p = kmalloc(15, GFP_KERNEL);
printk(KERN_INFO "%u\n", ksize(p)); /* this will print "16" under my kernel */
于 2014-11-07T09:31:25.220 に答える