OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7912|回复: 18

求教一个问题,I.MX6ul u-boot启动代码重定位

[复制链接]

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
发表于 2019-11-25 09:46:18 | 显示全部楼层 |阅读模式
1金钱
我之前使用过2440,知道代码重定位是为了解决存储地址和运行地址不一致的问题。
mx6ul我看原子的文档,说SD卡启动,芯片会将代码从SD卡搬移到链接地址。。。这不是不需要重定位了么。。。

最佳答案

查看完整内容[请看2#楼]

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系统,防止 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1622

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6539
金钱
6539
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-11-25 09:46:19 | 显示全部楼层
sn3707 发表于 2019-11-27 17:25
您好,再请教一个问题,就是如果依靠GD代码搬移到ram后面,那么有何意义。。。因为这个再也回不到U-BOOT ...

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重定向到靠后区域腾出地方给镜像和设备树。

以上是个人理解,希望帮到你。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-25 10:46:07 | 显示全部楼层
dingdingdingdingding
回复

使用道具 举报

33

主题

1622

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6539
金钱
6539
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-11-25 11:05:13 | 显示全部楼层
本帖最后由 szczyb1314 于 2019-11-25 11:07 编辑

uboot将自己搬到到ram的后面部分,给linux镜像腾开点地方用,防止linux系统覆盖了uboot,用gd形成一个完整的内存分配图(后面经过重定位的uboot使用这个内存分配图)
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-25 15:36:30 | 显示全部楼层
szczyb1314 发表于 2019-11-25 11:05
uboot将自己搬到到ram的后面部分,给linux镜像腾开点地方用,防止linux系统覆盖了uboot,用gd形成一个完整的 ...

您好 大哥,用GD,gd是啥意思。。
回复

使用道具 举报

33

主题

1622

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6539
金钱
6539
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-11-25 15:45:00 | 显示全部楼层
global data的意思,uboot将自己搬到到ram的后面部分时建立的一个结构体变量,用来形成一个完整的内存分配图(后面经过重定位的uboot使用这个内存分配图),重要的时生成的relocated、offset,重定位之后的代码运行时用到offset来实现相对寻址,目的是解决链接地址与运行地址不同

我对原子的uboot的启动分析这一章的理解
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-25 15:52:17 | 显示全部楼层
szczyb1314 发表于 2019-11-25 15:45
global data的意思,uboot将自己搬到到ram的后面部分时建立的一个结构体变量,用来形成一个完整的内存分配 ...

我再仔细看看去,大哥,谢谢,您是高手。。
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-27 17:25:21 | 显示全部楼层
szczyb1314 发表于 2019-11-25 11:05
uboot将自己搬到到ram的后面部分,给linux镜像腾开点地方用,防止linux系统覆盖了uboot,用gd形成一个完整的 ...

您好,再请教一个问题,就是如果依靠GD代码搬移到ram后面,那么有何意义。。。因为这个再也回不到U-BOOT了,不是都在上面运行么。。
回复

使用道具 举报

9

主题

890

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2391
金钱
2391
注册时间
2019-9-25
在线时间
397 小时
发表于 2019-11-27 20:17:45 | 显示全部楼层
szczyb1314 发表于 2019-11-27 19:16
uboot可看做是一个综合裸机例程,链接地址0x87800000,即运行地址0x87800000。要运行uboot就得保证uboot ...

感谢楼主分享
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-27 21:27:51 | 显示全部楼层
szczyb1314 发表于 2019-11-27 19:16
uboot可看做是一个综合裸机例程,链接地址0x87800000,即运行地址0x87800000。要运行uboot就得保证uboot ...

谢谢!比较清楚了,唯有一点不敢苟同啊,IVT+DCD个人认为不会copy到DDR。。。
从SD卡启动的时候,IROM的程序会搜索指定地址的IVT+DCD,然后拷贝映像去链接地址处,只有映像会去,,,
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-27 22:00:14 | 显示全部楼层
顶顶顶顶
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-28 09:34:49 | 显示全部楼层
szczyb1314 发表于 2019-11-25 09:46
uboot可看做是一个综合裸机例程,链接地址0x87800000,即运行地址0x87800000。要运行uboot就得保证uboot ...

您好 谢谢您的解答,我个人一点疑问就是 我觉得IROM的程序不会把SD卡里面的IVT+DCD也弄到0x87800000吧.
另外 从使用的角度,这种重定向是不是也不需要去理解,知道下就可以了?
我自己做工作主要是用UBOOT启动芯片,并能够更改一定的驱动,比如I2C
回复

使用道具 举报

33

主题

1622

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6539
金钱
6539
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-11-28 11:03:38 | 显示全部楼层
sn3707 发表于 2019-11-28 09:34
您好 谢谢您的解答,我个人一点疑问就是 我觉得IROM的程序不会把SD卡里面的IVT+DCD也弄到0x87800000吧.
...

我的说法是把load.imx整个拷贝到0x87800000-3072处,这样子uboot.bin才能在0x87800000处才能正常运行uboot,而IVT\BOOTDATA\DCD在0x87800000的前面3kbyte地址处。另外IVT和DCD不一起拷贝到DDR那怎么靠DCD中的数据初始化DDR?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

95

主题

549

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3293
金钱
3293
注册时间
2016-1-7
在线时间
541 小时
发表于 2019-11-28 12:04:57 | 显示全部楼层
关注,收藏了。
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-28 12:31:00 | 显示全部楼层
szczyb1314 发表于 2019-11-28 11:03
我的说法是把load.imx整个拷贝到0x87800000-3072处,这样子uboot.bin才能在0x87800000处才能正常运行uboo ...

一开始IROM程序会直接执行IVT,DCD。
您说 一开始拷贝到DDR,没初始化怎么拷贝
回复

使用道具 举报

33

主题

1622

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6539
金钱
6539
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-11-28 14:26:34 | 显示全部楼层
本帖最后由 szczyb1314 于 2019-11-28 19:32 编辑
sn3707 发表于 2019-11-28 12:31
一开始IROM程序会直接执行IVT,DCD。
您说 一开始拷贝到DDR,没初始化怎么拷贝

你说的对,IROM会拿DCD数据区的内容去初始化DDR,但是我理解是整个imx文件会被拷贝到DDR中,拷贝过程会靠IVT\BOOTDATA数据保证bin数据在87800000处,IVT\BOOTDATA\DCD会被拷贝进入DDR中,夜里回去在板子上试试看看
19:28更新:
进入uboot命令行模式,使用命令md.l 877ff400 100 #显示0x87800000-3kbyte 地址处的256个int型即1024byte,方便与原子哥的imxdownload.h对照
结果如截图,结果说明IVT BOOTDATA DCD是拷贝到DDR中的
uboot-imx.jpg
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1622

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6539
金钱
6539
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-11-28 19:37:37 | 显示全部楼层
进入uboot命令行模式,使用命令md.l 877ff400 100 #显示0x87800000-3kbyte 地址处的256个int型即1024byte,方便与原子哥的imxdownload.h对照

结果截图如上,结果说明IVT BOOTDATA DCD是拷贝到DDR中的,即整个load.imx是拷贝到DDR中的并不是只拷贝uboot的bin数据
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

41

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2019-8-20
在线时间
83 小时
 楼主| 发表于 2019-11-28 20:51:11 | 显示全部楼层
szczyb1314 发表于 2019-11-28 19:37
进入uboot命令行模式,使用命令md.l 877ff400 100 #显示0x87800000-3kbyte 地址处的256个int型即1024byte, ...

谢谢,大哥,您是学生么?还有我想问下,研究启动能找到工作不?
回复

使用道具 举报

33

主题

1622

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6539
金钱
6539
注册时间
2015-8-25
在线时间
1024 小时
发表于 2019-11-29 16:51:45 | 显示全部楼层
本帖最后由 szczyb1314 于 2019-11-29 16:53 编辑
sn3707 发表于 2019-11-28 20:51
谢谢,大哥,您是学生么?还有我想问下,研究启动能找到工作不?

我在苏州做车载无线充电器的,毕业快3年了。linux也是跟着原子第一次接触学习,以前没接触过linux,以前都是用STM32\S32K1XX\MWCT1XXX。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-23 05:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表