在內核中, kmalloc可以分配的最大連續內存爲2的(MAX_ORDER-1)次方個page(參見alloc_pages函數, "if (unlikely(order >= MAX_ORDER)) return NULL;"), page的大小通常是4K bytes, MAX_ORDER缺省定義爲11, 因此若是不修改內核, kmalloc可以分配的最大連續內存通常是4M bytes.
內核中獲取4M以上大內存的方法有三種:
1.修改MAX_ORDER, 從新編譯內核
2.內核啓動選型傳遞"mem="參數, 如"mem=80M", 預留部份內存; 而後經過request_mem_region和ioremap_nocache將預留的內存映射到模塊中. 須要修改內核啓動參數, 無需從新編譯內核. 但這種方法不支持x86架構, 只支持ARM, PowerPC等非x86架構.
3.在start_kernel中mem_init函數以前調用alloc_boot_mem函數預分配大塊內存, 須要從新編譯內核.
在申請以後使用EXPORT_SYMBOL(指針名)將地址指針符號導出,在調用該指針的模塊中使用extern對之聲明。
在不從新編譯內核的前提下, x86架構下內核中只能獲取到最大4M的連續內存, 或者使用vmalloc獲取4M以上的非連續內存. 並且, 不管是kmalloc仍是vmalloc, 分配的內存越大, 失敗的可能性越大; 系統啓動後分配內存的時間越早(此時空閒內存越多, 分部也越規律), 成功的可能性越大.
架構