內存占用分析
每顆芯片在出廠時,其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內存。
在QEMU上RISC-V Linux的啟動信息:
但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。
-
芯片
+關注
關注
459文章
52192瀏覽量
436252 -
Linux
+關注
關注
87文章
11462瀏覽量
212803 -
內存
+關注
關注
8文章
3109瀏覽量
74992 -
RISC
+關注
關注
6文章
479瀏覽量
84700
發布評論請先 登錄
Linux下查詢進程占用的內存方法總結

Linux的CPU和內存占用率查看
linux如何查看端口占用情況?

Android高效內存:讓圖片占用盡可能少的內存
詳細介紹Linux 內存使用方法
分析Linux操作系統的內存
更低內存占用的通用Json庫-RyanJson

評論