回答
上限(即可以在一個單一的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/
與kmalloc()沒有什麼不同。這是你應該問(或搜索)的問題,因爲kzalloc只是一個設置GFP_ZERO的薄包裝器。
最多約PAGE_SIZE(至少4k)是沒有問題的:p。除此之外......你說很多人問過的人是正確的,這絕對是你必須考慮的事情。顯然這取決於內核版本 - 以前有一個128k的硬限制,但現在已經增加了(或者完全放棄)。儘管這只是硬性限制,但實際上你可以獲得什麼取決於給定的系統。 (而且非常明確的內核版本)。
也許讀What is the difference between vmalloc and kmalloc?
通過檢查kzalloc的返回值(您可以隨時「驗證」的分配),但那時你可能已經記錄的分配失敗回溯。除此之外,不,我不認爲有一個好的方法可以提前檢查。
有在Linux –
()之類kzalloc_try任何電話,我會說不。它似乎有一個GFP_NOWARN標誌,如果你想避免回溯。但是,如果你想讓你的代碼進入主線內核......希望被告知要離開並重寫它。這聽起來像你需要閱讀LDD3 - 第8章涵蓋了基本的內存分配。 http://lwn.net/Kernel/LDD3/已經夠老了,它甚至沒有提到kzalloc(),但我認爲它會真正幫助你理解。 (可能有更新的書籍可用於收費)。 – sourcejedi
然而,這取決於你的內核版本和配置。這些限制通常在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 */
- 1. 調整wxpython小部件的大小調整事件的函數在調整大小時多次調用
- 2. jQuery窗口調整大小功能只調用一次
- 3. 第一次調整大小時無法裁切圖像
- 4. UISearchController searchBar框架僅在第一次點擊時調整大小
- 5. 如何創建可調整大小並一次調整大小? (以編程方式開始調整大小)
- 6. Jquery可調整大小顯示大小,同時調整大小
- 7. 圖形大小調整並在每次函數調用時變得更小
- 8. UWP GridView在更改大小時調整一列的大小
- 9. 錯誤:「一天的服務調用次數太多:scriptdb大小。」
- 10. 在node.js第一次調用24小時後調用函數
- 11. 窗口大小調整時禁用調整大小特定格
- 12. 調整大小處理程序一次,但不是兩次
- 13. 當調整另一行的大小時調整JTextPane的行大小
- 14. 窗口調整大小功能只有一次特定的窗口大小
- 15. 調整大小時縮小/擴大子元素的大小
- 16. 在調整QWidget的大小時調整QTextEdit的大小QWidget
- 17. 在調整JFrame的大小時調整Jpanel的大小
- 18. 第一次打開內容時,ColorBox的大小太小
- 19. 模擬瀏覽器調整頁面第一次調整大小
- 20. 瀏覽器調整大小時調整jqGrid的大小?
- 21. 調整窗口大小時自動調整TableLayoutPanel行的大小
- 22. 在調整窗口大小時調整UI元素的大小
- 23. 父容器調整大小時調整視頻的大小
- 24. 當調整大小格式時均勻調整GroupBoxs的大小
- 25. 如何在調整列大小時調整dxDataGrid的大小
- 26. 控制調整大小時調整圖像的大小c#
- 27. 尺寸縮小一次,尺寸縮小一次的火災調整大小事件
- 28. UITableViewCell cellForRowAtIndexPath第一次滾動時調用大量的行
- 29. 當頁面第一次打開時,如何動畫div的大小調整
- 30. 當用戶調整窗口大小時,垂直調整NSTextField的大小
一個告誡你沒有提到:隨着時間的推移,可用的物理內存可能會變得「碎片化」。即可能有4Mb或更多的空閒空間,但是如果沒有4Mb的_contiguous_空閒內存,kmalloc()不能滿足4Mb的分配。從歷史上看,這是一個大問題。我不知道目前的建議是什麼...最近我讀到的是一個系統管理員在現代服務器上爲64Kb故障排除kmalloc() - 或 - equiv故障。 HTTP://utcc.utoronto。CA /〜CKS /空間/博客/ LINUX/2012/06/16 / – sourcejedi