Linux中如何修改ddr的分配容量 电子说
在 U-Boot 中修改 DDR 容量通常涉及以下几个步骤,尤其是在嵌入式系统中,当更换或升级DDR内存芯片后:
硬件配置更新:
如果你实际更换了物理DDR模块以增大容量,首先要确保新的DDR模块与SoC兼容,并且主板的电路设计能够支持新内存的规格。
2. 设备树(Device Tree)调整:
对于基于Device Tree的Linux内核系统,需要在设备树(DTS或DTB文件)中正确描述DDR内存的大小和参数。这意味着要更新内存节点中的大小信息和其他相关属性,以便内核能识别并使用全部的新内存。
3. U-Boot 配置及编译:
在U-Boot源代码中,如果存在DDR初始化相关的代码或者宏定义,需要检查并根据实际情况修改这些配置,如DDR控制器的设置、时序参数等。
重新编译U-Boot,确保它包含对更大容量DDR的支持。
4. 启动参数调整:
在某些情况下,可能需要通过U-Boot环境变量来传递给内核正确的内存大小参数,例如修改bootargs环境变量中的mem=部分来指定系统的总内存大小。
5. 保存环境变量:
修改完启动参数后,务必用saveenv命令将新的环境变量保存到非易失性存储器中,比如SPI Flash上的环境变量分区。
以下介绍rk是如何修改DDR容量的:
开机时DDR初始化代码会把DDR容量传递给U-Boot,U-Boot会去除一些安全内存后再传递给内核。用户可以在U-Boot阶段修改传递给内核的DDR容量。 传递范例:
......// 传递给内核的可用内存块(已去除安全内存块)。Adding bank: 0x00200000 - 0x08400000 (size: 0x08200000)Adding bank: 0x0a200000 - 0x40000000 (size: 0x35e00000)Total: 895.411 msStarting kernel ...[ 0.000000] Booting Linux on physical CPU 0x0
代码位置:
arch/arm/mach-rockchip/param.c
修改位置:
struct memblock *param_parse_ddr_mem(int *out_count){......// 这里就是ddr传递给U-Boot的容量信息。// 因为可能出现不连续的地址,所以会分块传递,分别指明各个内存块的起始地址和大小。// PS: 一般情况下都是连续内存,不会需要分块。for (i = 0, n = 0; i < count; i++, n++) {// 比如2GB容量(连续地址),则:count=1, base = 0,size = 0x80000000。// 用户调试时可以在这里按需修改。base = t->u.ddr_mem.bank[i];size = t->u.ddr_mem.bank[i + count];/* 0~4GB */if (base < SZ_4GB) {mem[n].base = base;mem[n].size = ddr_mem_get_usable_size(base, size);if (base + size > SZ_4GB) {n++;mem[n].base_u64 = SZ_4GB;mem[n].size_u64 = base + size - SZ_4GB;}} else {/* 4GB+ */mem[n].base_u64 = base;mem[n].size_u64 = size;}assert(n < count + MEM_RESV_COUNT);}......}
全部0条评论
快来发表一下你的评论吧 !