linux核心中分配4M以上大記憶體的方法

2021-06-19 01:15:23 字數 711 閱讀 9556

在核心中, 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以上大記憶體的方法

在linux核心中,kmalloc能夠分配的最大連續記憶體為2的 max order 1 次方個page 參見alloc pages函式,if unlikely order max order return null page的大小一般是4k bytes,max order預設定義為11,所以如果不...

在核心中分配實體地址連續的大記憶體

kernel version 2.6.29 核心函式常常需要臨時分配一塊任意大小的實體地址連續的記憶體空間.所以先介紹核心中兩個分配實體地址連續的記憶體空間的api.kmalloc 由於採用了slub作為預設記憶體分配器,所以 kmalloc 工作於 slub 分配器之上。核心初始化時,建立一組共 ...

linux核心中常見的記憶體分配方法

linux核心中常見記憶體分配函式 linux核心中採用了一種同時適用於32位和64位系統的記憶體分頁模型,對於32位系統來說,兩級頁表足夠用了,而在x86 64系統中,用到了四級頁表,如圖2 1所示。四級頁表分別為 頁全域性目錄 page global directory 頁上級目錄 page u...