我們也可以修改RISC-V Linux的內(nèi)核源碼,解除2M對(duì)齊的限制。我們只需要在setup_vm()
函數(shù)中,將原來(lái)的 二級(jí)頁(yè)表改為三級(jí)頁(yè)表 ,這樣kernel入口地址只需要4K對(duì)齊,因此就能將kernel往前挪,從而利用前面的內(nèi)存。
修改代碼
路徑:arch/riscv/mm/init.c
注釋原來(lái)的2M對(duì)齊檢查:
對(duì)kernel的前2M頁(yè)表映射由二級(jí)頁(yè)表改為三級(jí)頁(yè)表:
//新增一個(gè)PTE
pte_t trampoline_pte[PTRS_PER_PTE] __page_aligned_bss;
create_pgd_mapping(trampoline_pg_dir,PAGE_OFFSET,
(uintptr_t)trampoline_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(trampoline_pmd,PAGE_OFFSET,
(uintptr_t)trampoline_pte,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(trampoline_pte,PAGE_OFFSET,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
對(duì)整個(gè)kernel的頁(yè)表映射由二級(jí)頁(yè)表改為三級(jí)頁(yè)表:
假設(shè)kernel大小為4M+
//定義三個(gè)PTE
pte_t load_sz_pte[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte1[PTRS_PER_PTE] __page_aligned_bss;
pte_t load_sz_pte2[PTRS_PER_PTE] __page_aligned_bss;
//=======0-2M======
create_pgd_mapping(early_pg_dir,PAGE_OFFSET,
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + PMD_SIZE;
for (va = PAGE_OFFSET; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte,PAGE_OFFSET,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
//=======2-4M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + PMD_SIZE,
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte1,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + (PMD_SIZE * 2);
for (va = PAGE_OFFSET + PMD_SIZE; va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte1,va,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
//=======4-6M==========
create_pgd_mapping(early_pg_dir,PAGE_OFFSET + (PMD_SIZE*2),
(uintptr_t)early_pmd,PGDIR_SIZE,PAGE_TABLE);
create_pmd_mapping(early_pmd,PAGE_OFFSET,
(uintptr_t)load_sz_pte2,PMD_SIZE,PAGE_TABLE);
end_va = PAGE_OFFSET + (PMD_SIZE * 3);
for (va = PAGE_OFFSET + (PMD_SIZE*2); va < end_va; va += PAGE_SIZE)
{
create_pte_mapping(load_sz_pte2,va,
load_pa + (va - PAGE_OFFSET),
PAGE_SIZE,PAGE_KERNEL_EXEC);
}
通過(guò)以上的代碼修改,就能將Kernel入口地址往前挪1.5M,只給opensbi預(yù)留512KB,這樣RISC-V Linux啟動(dòng)之后,可用物理內(nèi)存就會(huì)增加。
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1382瀏覽量
40430 -
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210409 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3055瀏覽量
74337
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解
![<b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)存</b>管理是什么,<b class='flag-5'>Linux</b>的<b class='flag-5'>內(nèi)存</b>管理詳解](https://file.elecfans.com//web2/M00/43/01/pYYBAGJ7h8qAfJe-AAA3U8e_SDc509.jpg)
linux內(nèi)存相關(guān)知識(shí)科普
走進(jìn)Linux內(nèi)存系統(tǒng)探尋內(nèi)存管理的機(jī)制和奧秘
Linux內(nèi)存相關(guān)知識(shí)科普
![<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>相關(guān)知識(shí)科普](https://file1.elecfans.com/web2/M00/8D/BB/wKgaomS_bzuAIY8XAAD0agexI4g205.jpg)
單片機(jī)定義變量字符的那部分內(nèi)存已經(jīng)滿(mǎn)了,怎么才能繼續(xù)定義新的字符?
怎樣在Linux內(nèi)核中預(yù)留一部分內(nèi)存空間作特殊用途呢
一文解析Linux系統(tǒng)保留內(nèi)存的初始化流程
Linux內(nèi)存初始化
關(guān)于內(nèi)存優(yōu)化知識(shí)你知道多少呢?
你知道linux的cache memory?
怎么區(qū)分內(nèi)存條的單面和雙面
一文解析Linux內(nèi)存系統(tǒng)
![一文解析<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)存</b>系統(tǒng)](https://file.elecfans.com/web1/M00/C5/58/o4YBAF9NtPaAPl16AAAUaU8hg9k121.jpg)
嵌入式linux+io+優(yōu)化,嵌入式Linux系統(tǒng)內(nèi)存優(yōu)化使用方法研究
![嵌入式<b class='flag-5'>linux</b>+io+<b class='flag-5'>優(yōu)化</b>,嵌入式<b class='flag-5'>Linux</b>系統(tǒng)<b class='flag-5'>內(nèi)存</b><b class='flag-5'>優(yōu)化</b>使用方法研究](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux驅(qū)動(dòng)模塊.ko內(nèi)存精簡(jiǎn)優(yōu)化過(guò)程
linux內(nèi)存性能優(yōu)化介紹
![<b class='flag-5'>linux</b><b class='flag-5'>內(nèi)存</b>性能<b class='flag-5'>優(yōu)化</b>介紹](https://file1.elecfans.com/web2/M00/AD/7D/wKgaomVN2iWAIfoqAAFapeQjYt8038.jpg)
評(píng)論