linux内核中分配4M以上大内存的方法
在內核中, 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, 分配的內存越大, 失敗的可能性越大; 系統啟動后分配內存的時間越早(此時空閑內存越多, 分部也越規律), 成功的可能性越大.
總結
以上是生活随笔為你收集整理的linux内核中分配4M以上大内存的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 巴黎街头网红“中国地砖”不见了引热议:到
- 下一篇: 都2022年了 苹果iPhone为什么还