1. 初识uboot内存布局
刚接触嵌入式开发时,我最困惑的就是:通过tftp下载的bin文件到底该放在内存的哪个位置?这个问题看似简单,却涉及到uboot内存管理的核心机制。以OrangePi PC(H3芯片)为例,当我们执行bdinfo命令时,会看到类似这样的输出:
DRAM bank = 0x00000000 -> start = 0x40000000 -> size = 0x40000000
这段信息告诉我们,开发板的物理内存起始地址是0x40000000,总大小为1GB(0x40000000字节)。但uboot并不会使用全部内存空间,它像一位精打细算的管家,会把内存划分成不同的功能区。
关键发现:通过对比/proc/iomem的内核输出可以验证,0x40000000-0x7FFFFFFF确实是系统可用的物理内存范围。这个地址范围不是随意设定的,而是由SoC芯片手册的Memory Mapping章节明确规定。比如全志H3芯片的DRAM物理地址范围就是0x40000000-0xBFFFFFFF,最大支持2GB内存。
2. uboot自身的藏身之处
你一定好奇:uboot自己会被加载到内存的哪个位置?是紧挨着起始地址0x40000000吗?通过分析uboot源码的链接脚本,真相逐渐浮出水面。
在uboot的编译配置中,有个关键宏CONFIG_SYS_TEXT_BASE,它定义了代码段的入口地址。例如在OrangePi的配置中:
CONFIG_SYS_TEXT_BASE=0x4a000000
用arm-linux-readelf -h u-boot查看编译生成的uboot镜像,会看到Entry point address确实指向0x4a000000。这意味着uboot像一位先遣队员,选择在内存的中

410

被折叠的 条评论
为什么被折叠?



