歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux內核

Linux內核中分配4M以上大內存的方法

在Linux內核中, 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函數預分配大塊內存, 需要重新編譯內核.

在不重新編譯內核的前提下, x86架構下內核中只能獲取到最大4M的連續內存, 或者使用vmalloc獲取4M以上的非連續內存. 而且, 無論是kmalloc還是vmalloc, 分配的內存越大, 失敗的可能性越大; 系統啟動後分配內存的時間越早(此時空閒內存越多, 分部也越規律), 成功的可能性越大。

Copyright © Linux教程網 All Rights Reserved