內存占用分析
每顆芯片在出廠時,其bootrom就已經固化在芯片內部,假設bootrom的地址是0x0,即上電后,會從0x0地址處開始運行程序。
在啟動RISC-VLinux之前,需要先運行opensbi,因此應該把opensbi放到地址0x0處,這樣芯片上電后,就會從0x0地址處執行opensbi。在opensbi運行完后,會跳轉到opensbi運行地址偏移2M的位置去執行下一級boot(這里下一級boot是kernel),即跳轉到0x200000地址處運行kernel,因此應該把kernel放到內存的0x200000處。
內存分布示意圖如下:
對于kernel來說,在啟動時會從自己的kernel加載地址處(即0x200000)開始建立頁表映射,只有對物理內存建立了頁表映射,后面才能訪問這些內存。而kernel加載地址前面的2M內存(即0x0- 0x200000)將被kernel忽略,不會對這2M內存建立頁表,即kernel無法訪問這2M內存。
但opensbi實際不需要使用2M這么大的范圍,默認是512KB,opensbi的pmp會保護這512KB內存,不讓其他程序訪問。
因此在Kernel和opensbi之間會存在1.5M的內存空隙,并且這部分內存空隙沒有程序使用,這就會造成內存浪費,那如何讓kernel將前面的一部分內存也利用起來呢?
優化方案方案一:將opensbi放到內存的最后面,kernel入口地址仍然保持2M對齊。
方案一
我們將opensbi放到內存的最后面,kernel入口地址仍然保持2M對齊。
即kernel放到內存的最前面,opensbi放到后面:
例如kernel放到內存的0x0地址處,opensbi放到內存的0x10000000地址處。這樣kernel前面就不會有預留內存,只不過這樣需要修改bootrom的地址,將地址從0x0修改為0x0x10000000。這種方案只適合芯片還沒出廠前,因為用戶無法修改bootrom的地址,芯片出廠后,bootrom地址是固定的,假設bootrom地址為0x0,那么芯片上電后,就會從0x0開始運行程序,所以opensbi必須放到0x0地址處,這樣必然kernel只能往后偏移2M。
-
芯片
+關注
關注
455文章
50720瀏覽量
423164 -
Linux
+關注
關注
87文章
11294瀏覽量
209341 -
內存
+關注
關注
8文章
3019瀏覽量
74007 -
RISC
+關注
關注
6文章
462瀏覽量
83711
發布評論請先 登錄
相關推薦
評論