Linux内核获取可用DRAM大小位置及限制内核可用内存方法咨询
限制内核识别DRAM大小的实现方法
设备树修改方案(你当前的思路完全可行)
该方案无需修改bootloader代码,适配门槛低,修改后的内存节点只会给内核上报前4GB的可用内存,示例修改如下:
/* 修改前(总内存8GB) */ memory_0: memory@80000000 { device_type = "memory"; reg = <0x0 0x80000000 0x80000000>; }; memory@880000000 { device_type = "memory"; reg = <0x00000008 0x80000000 0x80000000>; }; memory@900000000 { device_type = "memory"; reg = <0x00000009 0x00000000 0x80000000>; }; memory@980000000 { device_type = "memory"; reg = <0x00000009 0x80000000 0x80000000>; }; /* 修改后(总内存4GB) */ memory_0: memory@80000000 { device_type = "memory"; reg = <0x0 0x80000000 0x80000000>; }; memory@880000000 { device_type = "memory"; reg = <0x00000008 0x80000000 0x80000000>; };
注意:如果LK会动态覆盖设备树的memory节点,你需要同时修改LK的相关逻辑,否则设备树的修改会被LK冲掉。
LK相关代码位置
- LK识别DRAM大小的代码:位于平台相关初始化路径,通用路径为
platform/[对应芯片平台]/memory.c中的dram_get_size()、board_get_memory_size()类函数,部分厂商定制平台会放在target/[对应设备型号]/init.c中实现DRAM探测逻辑,探测到的总内存会存入全局变量供后续调用。 - LK向内核传递内存信息的代码:通用逻辑在
app/aboot/aboot.c的update_device_tree()函数中,该函数会将LK探测到的内存信息动态写入设备树的memory节点,你也可以直接在这个函数中截断超过4GB的内存区域,无需修改静态设备树。
更简单的替代方案
不需要修改任何代码,直接在内核启动参数cmdline中添加mem=4G参数,内核启动时会自动忽略超过4GB的内存区域,适配性更高。
内容的提问来源于stack exchange,提问作者CH J
相关产品推荐
相关产品推荐

