论坛元老
 
- 积分
- 6539
- 金钱
- 6539
- 注册时间
- 2015-8-25
- 在线时间
- 1024 小时
|
发表于 2019-11-25 09:46:19
|
显示全部楼层
uboot可看做是一个综合裸机例程,链接地址0x87800000,即运行地址0x87800000。要运行uboot就得保证uboot的bin数据在87000000处,即使加上IVT\bootdata\DCD的头构成imx也是要保证uboot.bin在87800000处才可以正常运行。
SD卡启动:uboot.imx存储在SD卡上要运行得拷贝到DDR中的0x87800000-3072处(保证uboot.bin在0x87800000处),然后uboot开始运行,代码将uboot自己重定位到DRAM的最后面区域将0x87800000空出来给linux系统,防止linux系统覆盖了uboot,用gd形成一个完整的内存分配图(后面经过重定位的uboot使用这个内存分配图)。原子的板子启动时镜像在0x80800000处,设备树在0x83000000处,后面还有rootfs根文件系统。
old uboot.bin在 87800000
重定向后 uboot.bin在xxxx处,由程序确定,比较重要(链接时使用 -pie选项生成与位置无关的代码段.rel.dyn来解决重定位问题)
offset xxxx-87800000由程序确定,非常重要(重定位之后的代码运行时用到offset来实现相对寻址目的是解决链接地址与运行地址不同)
重定向后主要是为了防止linux系统覆盖了uboot,另外我们在uboot命令行模式下也可以用腾出来的ram区干自己的事(比如tftp 87800000 xxx.bin将裸机bin文件下载到87800000处进而用go命令执行裸机例程,而这时的tftp和go命令就是靠重定向的offset来运行在重定向区域的)
即使在uboot中不进入命令行而是直接起动linux内核,那也是将镜像和设备树文件拷贝到DDR中,然后启动。此时要考虑镜像和设备树是否会覆盖掉uboot,所以需要在内核正确启动前需要将uboot重定向到靠后区域腾出地方给镜像和设备树。
以上是个人理解,希望帮到你。 |
|