我們也可以修改RISC-V Linux的內(nèi)核源碼,解除2M對齊的限制。我們只需要在setup_vm()函數(shù)中,將原來的 二級頁表改為三級頁表 ,這樣kernel入口地址只需要4K對齊,因此就能將kernel往前挪,從而利用前面的內(nèi)存。
修改代碼
路徑:arch/riscv/mm/init.c
注釋原來的2M對齊檢查:

對kernel的前2M頁表映射由二級頁表改為三級頁表:
//新增一個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);
}

對整個kernel的頁表映射由二級頁表改為三級頁表:
假設(shè)kernel大小為4M+
//定義三個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);
}


通過以上的代碼修改,就能將Kernel入口地址往前挪1.5M,只給opensbi預(yù)留512KB,這樣RISC-V Linux啟動之后,可用物理內(nèi)存就會增加。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
內(nèi)核
+關(guān)注
關(guān)注
4文章
1468瀏覽量
42893 -
Linux
+關(guān)注
關(guān)注
88文章
11764瀏覽量
219099 -
內(nèi)存
+關(guān)注
關(guān)注
9文章
3212瀏覽量
76387
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解
Linux的內(nèi)存管理 Linux的內(nèi)存管理是一個非常復(fù)雜的過程,主要分成兩個大的部分:內(nèi)核的內(nèi)存
linux內(nèi)存相關(guān)知識科普
linux 內(nèi)存組織結(jié)構(gòu)和頁面布局,內(nèi)存碎片產(chǎn)生原因和優(yōu)化算法。
發(fā)表于 08-08 10:57
?680次閱讀
走進Linux內(nèi)存系統(tǒng)探尋內(nèi)存管理的機制和奧秘
Linux 內(nèi)存是后臺開發(fā)人員,需要深入了解的計算機資源。合理的使用內(nèi)存,有助于提升機器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)
Linux內(nèi)存相關(guān)知識科普
Linux 內(nèi)存是后臺開發(fā)人員,需要深入了解的計算機資源。合理的使用內(nèi)存,有助于提升機器的性能和穩(wěn)定性。本文主要介紹**Linu****x 內(nèi)存組織結(jié)構(gòu)和頁面布局,
發(fā)表于 07-25 14:43
?1191次閱讀
單片機定義變量字符的那部分內(nèi)存已經(jīng)滿了,怎么才能繼續(xù)定義新的字符?
我用的比較老的4580芯片,需要定義的字符很多,用于OLED顯示屏幕顯示,但是定義字符的那部分內(nèi)存已經(jīng)滿了,無法再加入新的字符,請問有什么好的解決辦法嗎?請不要告訴我換芯片,因為電路板是根據(jù)這個芯片制作的,有沒有什么好的容易的解決辦法?跪求
發(fā)表于 03-06 17:15
怎樣在Linux內(nèi)核中預(yù)留一部分內(nèi)存空間作特殊用途呢
有時我們需要在 Linux 內(nèi)核中預(yù)留一部分內(nèi)存空間用作特殊用途(給安全模塊使用,給其它處理器使用,或是給特定的驅(qū)動程序使用等),在 Device Tree 中有提供兩種方法對預(yù)留內(nèi)存進行配置
發(fā)表于 12-29 07:16
一文解析Linux系統(tǒng)保留內(nèi)存的初始化流程
1、Linux系統(tǒng)保留內(nèi)存的初始化流程在啟動過程中會打印出如下信息,這些信息為linux呈現(xiàn)出系統(tǒng)下的保留內(nèi)存空間。本文只介紹基本的保留內(nèi)存
發(fā)表于 06-30 16:27
Linux內(nèi)存初始化
之前有幾篇博客詳細(xì)介紹了Xen的內(nèi)存初始化,確實感覺這部分內(nèi)容蠻復(fù)雜的。這兩天在看Linux內(nèi)核啟動中內(nèi)存的初始化,也是看的云里霧里的,想嘗試下邊看邊寫,在寫博客的過程中慢慢思考,最后
發(fā)表于 10-12 11:16
?0次下載
關(guān)于內(nèi)存優(yōu)化知識你知道多少呢?
為了優(yōu)化應(yīng)用內(nèi)存,你應(yīng)該知道是什么消耗了你應(yīng)用的大部分內(nèi)存,答案就是Texture(紋理)!它幾乎占據(jù)了90%的應(yīng)用內(nèi)存。那么我們應(yīng)該盡力去減小我們應(yīng)用的紋理
發(fā)表于 08-31 10:36
?3362次閱讀
你知道linux的cache memory?
當(dāng)你讀寫文件的時候,Linux內(nèi)核為了提高讀寫性能與速度,會將文件在內(nèi)存中進行緩存,這部分內(nèi)存就是Cache Memory(緩存內(nèi)存)。即使你的程序運行結(jié)束后,Cache Memory
發(fā)表于 04-26 15:49
?1566次閱讀
怎么區(qū)分內(nèi)存條的單面和雙面
什么是單面和雙面內(nèi)存?它們有些什么樣的特性與區(qū)別呢?你們知道怎么區(qū)分內(nèi)存條單面和雙面嗎?下面小編帶來怎么區(qū)分內(nèi)存條單面和雙面的內(nèi)容,歡迎閱讀!
發(fā)表于 05-28 09:51
?1w次閱讀
一文解析Linux內(nèi)存系統(tǒng)
Linux 內(nèi)存是后臺開發(fā)人員,需要深入了解的計算機資源。合理的使用內(nèi)存,有助于提升機器的性能和穩(wěn)定性。本文主要介紹Linux 內(nèi)存組織結(jié)構(gòu)
嵌入式linux+io+優(yōu)化,嵌入式Linux系統(tǒng)內(nèi)存優(yōu)化使用方法研究
優(yōu)化進而確保響應(yīng)運行。并且經(jīng)過實踐證明,嵌入式系統(tǒng)內(nèi)存優(yōu)化使用,能夠提升系統(tǒng)空間5%內(nèi)存,確保系統(tǒng)順利運行?!娟P(guān)鍵詞】 嵌入式 Linux系
發(fā)表于 11-01 16:31
?10次下載
Linux驅(qū)動模塊.ko內(nèi)存精簡優(yōu)化過程
Linux 驅(qū)動模塊可以獨立的編譯成 .ko 文件,雖然大小一般只有幾 MB,但對總內(nèi)存只有幾十 MB 的小型 Linux 系統(tǒng)來說,常常也是一個非常值得優(yōu)化的點。本文以一個實際例子,
發(fā)表于 09-25 09:23
?2709次閱讀
linux內(nèi)存性能優(yōu)化介紹
【1】內(nèi)存映射 Linux 內(nèi)核給每個進程都提供了一個獨立且連續(xù)的虛擬地址空間,以便進程可以方便地訪問虛擬內(nèi)存;虛擬地址空間的內(nèi)部又被分為內(nèi)核空間和用戶空間兩部分,不同字長的處理器,地
Linux如何優(yōu)化部分內(nèi)存
評論