2012-08-23 29 views

回答

4

上限(即可以在一個單一的kmalloc/kzalloc請求被分配的字節數),是的函數: 處理器 - 真,頁大小 - 和 夥伴系統自由列表的個數(MAX_ORDER) 。

在x86和ARM上,標準頁面大小爲4 Kb,MAX_ORDER爲11,單個調用的kmalloc上限爲4 MB!

詳細信息,包括說明和代碼來測試這一點,在這裏: http://kaiwantech.wordpress.com/2011/08/17/kmalloc-and-vmalloc-linux-kernel-memory-allocation-api-limits/

+1

一個告誡你沒有提到:隨着時間的推移,可用的物理內存可能會變得「碎片化」。即可能有4Mb或更多的空閒空間,但是如果沒有4Mb的_contiguous_空閒內存,kmalloc()不能滿足4Mb的分配。從歷史上看,這是一個大問題。我不知道目前的建議是什麼...最近我讀到的是一個系統管理員在現代服務器上爲64Kb故障排除kmalloc() - 或 - equiv故障。 HTTP://utcc.utoronto。CA /〜CKS /空間/博客/ LINUX/2012/06/16 / – sourcejedi

2

與kmalloc()沒有什麼不同。這是你應該問(或搜索)的問題,因爲kzalloc只是一個設置GFP_ZERO的薄包裝器。

最多約PAGE_SIZE(至少4k)是沒有問題的:p。除此之外......你說很多人問過的人是正確的,這絕對是你必須考慮的事情。顯然這取決於內核版本 - 以前有一個128k的硬限制,但現在已經增加了(或者完全放棄)。儘管這只是硬性限制,但實際上你可以獲得什麼取決於給定的系統。 (而且非常明確的內核版本)。

也許讀What is the difference between vmalloc and kmalloc?

通過檢查kzalloc的返回值(您可以隨時「驗證」的分配),但那時你可能已經記錄的分配失敗回溯。除此之外,不,我不認爲有一個好的方法可以提前檢查。

+0

有在Linux –

+0

()之類kzalloc_try任何電話,我會說不。它似乎有一個GFP_NOWARN標誌,如果你想避免回溯。但是,如果你想讓你的代碼進入主線內核......希望被告知要離開並重寫它。這聽起來像你需要閱讀LDD3 - 第8章涵蓋了基本的內存分配。 http://lwn.net/Kernel/LDD3/已經夠老了,它甚至沒有提到kzalloc(),但我認爲它會真正幫助你理解。 (可能有更新的書籍可用於收費)。 – sourcejedi

1

然而,這取決於你的內核版本和配置。這些限制通常在linux/slab.h定位,通常descripted如下(該示例中是linux下2.6.32):

​​

你還可以用下面的代碼測試它們:

#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 32bits下的結果是: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 */ 
相關問題