內(nèi)存占用分析
每顆芯片在出廠時,其bootrom就已經(jīng)固化在芯片內(nèi)部,假設(shè)bootrom的地址是0x0,即上電后,會從0x0地址處開始運行程序。
在啟動RISC-VLinux之前,需要先運行opensbi,因此應該把opensbi放到地址0x0處,這樣芯片上電后,就會從0x0地址處執(zhí)行opensbi。在opensbi運行完后,會跳轉(zhuǎn)到opensbi運行地址偏移2M的位置去執(zhí)行下一級boot(這里下一級boot是kernel),即跳轉(zhuǎn)到0x200000地址處運行kernel,因此應該把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)存。
但opensbi實際不需要使用2M這么大的范圍,默認是512KB,opensbi的pmp會保護這512KB內(nèi)存,不讓其他程序訪問。
因此在Kernel和opensbi之間會存在1.5M的內(nèi)存空隙,并且這部分內(nèi)存空隙沒有程序使用,這就會造成內(nèi)存浪費,那如何讓kernel將前面的一部分內(nèi)存也利用起來呢?
優(yōu)化方案方案一:將opensbi放到內(nèi)存的最后面,kernel入口地址仍然保持2M對齊。
方案一
我們將opensbi放到內(nèi)存的最后面,kernel入口地址仍然保持2M對齊。
即kernel放到內(nèi)存的最前面,opensbi放到后面:
例如kernel放到內(nèi)存的0x0地址處,opensbi放到內(nèi)存的0x10000000地址處。這樣kernel前面就不會有預留內(nèi)存,只不過這樣需要修改bootrom的地址,將地址從0x0修改為0x0x10000000。這種方案只適合芯片還沒出廠前,因為用戶無法修改bootrom的地址,芯片出廠后,bootrom地址是固定的,假設(shè)bootrom地址為0x0,那么芯片上電后,就會從0x0開始運行程序,所以opensbi必須放到0x0地址處,這樣必然kernel只能往后偏移2M。
-
芯片
+關(guān)注
關(guān)注
452文章
50206瀏覽量
420940 -
Linux
+關(guān)注
關(guān)注
87文章
11207瀏覽量
208721 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
2966瀏覽量
73815 -
RISC
+關(guān)注
關(guān)注
6文章
461瀏覽量
83637
發(fā)布評論請先 登錄
相關(guān)推薦
評論