uboot启动Linux内核过程分为4大步骤:
问题2: uboot阶段DDR的分区的问题
上述步骤2和步骤4中,有将uboot/kernel拷贝纸DDR的步骤,具体要拷贝到DDR的什么位置呢?
分清楚这两个概念:
链接地址:链接时指定的地址(指定方式为:Makefile中用-Ttext,或者链接脚本)
运行地址:程序实际运行时地址(指定方式:由实际运行时被加载到内存的哪个位置说了算)
此问题中的提及的位置是链接地址,在由Makefile中用-Ttext,或者链接脚本指定的。
-
Uboot放在DDR中的什么位置?
是用Makefile中的-Ttext指定的。查看code:
TEXT_BASE是将来我们整个uboot链接时指定的链接地址。因为uboot中启用了虚拟地址映射,这个虚拟地址0xC3E0 0000地址对应的物理地址就等于0x33E0 0000,所以我们会将uboot加载到DDR中的起始位置是0x33E0 0000,加载调用的code 如下:
0表示通道0;MOVI_BL2_POS是uboot的第二部分在SD卡中的开始扇区,这个扇区数字必须和烧录uboot时烧录的位置相同;MOVI_BL2_BLKCNT是uboot的长度占用的扇区数;CFG_PHY_UBOOT_BASE是重定位时将uboot的第二部分复制到DDR中的起始地址(0x33E00000). -
Kernel 镜像要放在DDR的什么地址?
内核一定要放在链接地址处,链接地址去内核源代码的链接脚本或者Makefile中去查找。X210中是0x30008000。
遗留问题: 内核的链接脚本后续要截屏放在这里
在uboot中通过执行如下命令将kernel加载到DDR中:
movi read kernel 30008000
(其中kernel指的是uboot中的kernel分区) -
总结
Uboot/kernel要拷贝到DDR中的物理地址;
链接脚本或-Ttext 指定的是程序运行的虚拟地址;