在網上搜了很久,才慢慢了解在開機保留內存的方法,現在總結一下這階段的學習過程!(我是在arm板子上進行的實驗,內核版本是2.6.38)
在開機保留內存的方式一共有三種方法:
1. reserve_bootmem(addr,size,flag)
這種方法,我做實驗一直沒有成功…
如果有成功的,希望大神留言,求指導!
2. alloc_bootmem(size)
其實還是比較簡單的,在int/main.c中:
//設置全局變量
char* reserve_memory;
EXPORT_SYMBOL_GPL(reserve_memory);
void __init start_kernel()
{
…
trap_init();
//在此添加代碼,在zone保留40M的內存
reserve_memory=alloc_bootmem(0x2800000);
mem_init();
…
}
但是在內核中得到reserve_memory之後,如何映射到內核空間中使用,沒有理出頭緒…
網上搜到有人說,
有了allco_bootmem返回的地址,
在內核態,找到要使用這段內存的task_struct;
進而強行建立頁表;
如果有大神理解這句話,或者更好的映射方法,請留言,謝謝!
3. 開機時設置Linux 內核參數
mem=180M /* 開機時只給系統180M的內存空間,其余都保留 */
這種方法最為簡單,但是設置和使用的時候,需要和硬件內存物理大小相適應。
在內核驅動中,可以以ioremap()的方式映射到內核空間中,或者再mmap()到用戶空間中讀寫。