內存占用分析
每顆芯片在出廠時,其bootrom就已經固化在芯片內部,假設bootrom的地址是0x0,即上電后,會從0x0地址處開始運行程序。
在啟動RISC-VLinux之前,需要先運行opensbi,因此應該把opensbi放到地址0x0處,這樣芯片上電后,就會從0x0地址處執(zhí)行opensbi。在opensbi運行完后,會跳轉到opensbi運行地址偏移2M的位置去執(zhí)行下一級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將前面的一部分內存也利用起來呢?
優(yōu)化方案方案一:將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。
-
芯片
+關注
關注
463文章
54463瀏覽量
469696 -
Linux
+關注
關注
88文章
11822瀏覽量
219602 -
內存
+關注
關注
9文章
3238瀏覽量
76529 -
RISC
+關注
關注
6文章
485瀏覽量
86871
發(fā)布評論請先 登錄
Linux kernel內存管理模塊結構分析
Linux下查詢進程占用的內存方法總結
Linux的CPU和內存占用率查看
linux如何查看端口占用情況?
Android高效內存:讓圖片占用盡可能少的內存
詳細介紹Linux 內存使用方法
分析Linux操作系統(tǒng)的內存
更低內存占用的通用Json庫-RyanJson
分享排查Linux系統(tǒng)CPU占用的一個Shell腳本
Windows不明內存占用案例分析:Driver Locked
Linux內存占用分析
評論