嵌入式开发——linux系统怎么知道接了多少物理内存?

1、前言

  • linux系统是不知道当前设备接了多少内存,需要bootloader在启动时告诉linux系统
  • 感知到当前设备接了多少物理内存有两种方式
    • 动态识别(X86架构大多是这种):可以插拔的内存条,bootloader能识别出内存条的容量
    • 代码里写死(ARM架构大多是这种):设备的内存是贴片上去的,不支持动态改变,内存的容量在代码里写死(系统工程师在适配程序时要根据实际物理内存容量去修改代码)

2、linux系统知道实际物理内存大小的方式

  • 设备树中可以通过"/memory"节点来指定内存的起始地址、大小等信息;
  • uboot启动内核时,可以通过ATAG_MEM类型的struct tag结构体向内核传递内存起始地址、大小等信息;
  • uboot启动内核时,可以通过ATAG_CMDLINE类型的struct tag结构体向内核传递内存起始地址、大小等信息;
  • 内存信息生效的优先级:ATAG_CMDLINE类型的tag > ATAG_MEM类型的tag > 设备树"/memory"节点

3、插拔的内存条

  • X86架构芯片在硬件上常采用插拔内存条的方式,可以实现动态识别内存条的容量
  • BIOS可以识别出内存条的容量,并且在启动内核时,将内存容量大小告诉内核
  • BIOS是怎么识别出内存条大小的,原理不太清楚,猜测和内存插槽的硬件结构有关系,有知道原理的博友欢迎在评论区交流

4、贴片的内存

  • 采用贴片的内存的方式在嵌入式设备中是最常见的,内存容量是固定死的
  • 因为内存是固定死的,所以可以直接在代码里指定内存的容量。比如:在uboot中指定,或者在设备树中指定

5、参考资料

  • 《linux内存管理——内存大小、起始地址的解析与修改》
  • 《设置海思芯片MMZ内存、OS内存详解》

你可能感兴趣的:(嵌入式开发中的总结,linux)