Linux内存占用分析

内存占用分析
每颗芯片在出厂时,其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。

KJJ12井下网络交换机性能和技术参数
400瓦70伏放大器原理图和PCB布局设计
智慧农业就只有在牛身上吗
LED高景气将贯穿全年 龙头股涨幅显著
坚果Pro2S炫光蓝高清图赏
Linux内存占用分析
dfrobotJPEG 摄像模块介绍
新唐与华邦电达成合作 推出全新物联网安全微控制器
曝三星将在CES2020上发布真无边框电视
线圈脉冲测试方法
大多数高端智能手机都有一个AI加速器
Openwrt开发指南 第7章 添加Web界面
浅谈电池维修技术之锂动力电池的安全性问题
介绍一种微功耗高精度1.2V基准电压源ADR3412
高压功率放大器的工作原理和作用是什么
2019慕尼黑上海电子展上莱尔德高性能材料提出新一代解决方案
2021年中国智能设备市场的十大预测
监控系统的建设思路分析
物联网装置将如何改变我们未来的生活方式
工业控制中伺服和变频器的定义以及工作原理