最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一文實戰(zhàn) | RISC-V Linux入口地址2M預(yù)留內(nèi)存優(yōu)化

2023-03-25 17:14 作者:補給站Linux內(nèi)核  | 我要投稿

上篇分析了RISC-V Linux啟動的頁表創(chuàng)建,提到RISC-V Linux入口地址必須2M對齊,今天講講如何解決2M對齊的問題,或者說如何優(yōu)化部分內(nèi)存。

注意:本文基于linux5.10.111內(nèi)核

內(nèi)存占用分析

每顆芯片在出廠時,其bootrom就已經(jīng)固化在芯片內(nèi)部,假設(shè)bootrom的地址是0x0,即上電后,會從0x0地址處開始運行程序。

在啟動RISC-V Linux之前,需要先運行opensbi,因此應(yīng)該把opensbi放到地址0x0處,這樣芯片上電后,就會從0x0地址處執(zhí)行opensbi。在opensbi運行完后,會跳轉(zhuǎn)到opensbi運行地址偏移2M的位置去執(zhí)行下一級boot(這里下一級boot是kernel),即跳轉(zhuǎn)到0x200000地址處運行kernel,因此應(yīng)該把kernel放到內(nèi)存的0x200000處。

內(nèi)存分布示意圖如下:

對于kernel來說,在啟動時會從自己的kernel加載地址處(即0x200000)開始建立頁表映射,只有對物理內(nèi)存建立了頁表映射,后面才能訪問這些內(nèi)存。而kernel加載地址前面的2M內(nèi)存(即0x0 - 0x200000)將被kernel忽略,不會對這2M內(nèi)存建立頁表,即kernel無法訪問這2M內(nèi)存。

在QEMU上RISC-V Linux的啟動信息:

但opensbi實際不需要使用2M這么大的范圍,默認是512KB,opensbi的pmp會保護這512KB內(nèi)存,不讓其他程序訪問。

因此在Kernel和opensbi之間會存在1.5M的內(nèi)存空隙,并且這部分內(nèi)存空隙沒有程序使用,這就會造成內(nèi)存浪費,那如何讓kernel將前面的一部分內(nèi)存也利用起來呢?

優(yōu)化方案

對這2M內(nèi)存的優(yōu)化,有兩種方案:

方案一:將opensbi放到內(nèi)存的最后面,kernel入口地址仍然保持2M對齊。

方案二:opensbi仍然放到內(nèi)存的起始位置,通過修改內(nèi)核源碼,解除2M對齊限制,即可將kernel地址往前挪。

方案一

我們將opensbi放到內(nèi)存的最后面,kernel入口地址仍然保持2M對齊。

即kernel放到內(nèi)存的最前面,opensbi放到后面:

例如kernel放到內(nèi)存的0x0地址處,opensbi放到內(nèi)存的0x10000000地址處。這樣kernel前面就不會有預(yù)留內(nèi)存,只不過這樣需要修改bootrom的地址,將地址從0x0修改為0x0x10000000。這種方案只適合芯片還沒出廠前,因為用戶無法修改bootrom的地址,芯片出廠后,bootrom地址是固定的,假設(shè)bootrom地址為0x0,那么芯片上電后,就會從0x0開始運行程序,所以opensbi必須放到0x0地址處,這樣必然kernel只能往后偏移2M。



【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ?



方案二

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

修改代碼

路徑:arch/riscv/mm/init.c

注釋原來的2M對齊檢查:

對kernel的前2M頁表映射由二級頁表改為三級頁表:

對整個kernel的頁表映射由二級頁表改為三級頁表:

假設(shè)kernel大小為4M+

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

總結(jié)

RISC-V Linux入口地址2M對齊的操作目前還沒看到有人解釋,不過應(yīng)該就是為了給opensbi預(yù)留2M,于是kernel只建立了二級頁表,使得入口地址必須2M對齊。對這部分內(nèi)存的優(yōu)化解決方案,目前也還沒人給出,希望本文的優(yōu)化方案能夠幫助到有些人,也希望能夠給大家一些啟發(fā)。


原文作者:嵌入式Linux充電站




一文實戰(zhàn) | RISC-V Linux入口地址2M預(yù)留內(nèi)存優(yōu)化的評論 (共 條)

分享到微博請遵守國家法律
莱西市| 宝丰县| 南城县| 竹北市| 鹤山市| 吉水县| 通城县| 永仁县| 库尔勒市| 三河市| 射洪县| 察雅县| 剑阁县| 奉节县| 竹山县| 谢通门县| 富源县| 武汉市| 和林格尔县| 乐昌市| 枣庄市| 敖汉旗| 鄱阳县| 彰武县| 大兴区| 梅河口市| 呼图壁县| 手游| 武义县| 柘荣县| 五大连池市| 工布江达县| 乌恰县| 长治县| 霍城县| 介休市| 上高县| 遵义市| 五河县| 新龙县| 光泽县|