三星推荐方式:
bootloader必须大于16KB小于96KB。假定bootloader为74KB,启动过程:开机,BL0运行,BLO加载外部启动设备中的bootloader前16KB(BL1)到SRAM中运行,BL1运行时会加载BL2(bootloader中74-16=58KB)到SRAM中(从SRAM的16KB处开始用)去运行;BL2运行时会初始化DRAM并且将OS搬运到DRAM中去执行OS,启动完成
uboot方式:
uboot大小随意,假定为200KB,启动过程:开机,BL0运行,BL0加载外部启动设备中的bootloader(uboot)的前16KB(BL1)到SRAM中运行,BL1运行时会初始化DRAM,然后将整个bootloader(uboot,200KB)搬运到DRAM中,然后用一句长跳转指令从iSRAM中直接跳转到DRAM中继续执行bootloader(uboot)直到bootloader(uboot)完全启动。bootloader(uboot)启动后在bootloader(uboot)命令行中去启动OS。
✌题外话:三星为什么推荐BL1+BL2的方式而不使用uboot方式?
因为实际项目中,bootloader的大小并不会像uboot那么大,因为uboot中做了很多没有用的工作,实际的项目启动代码只需要满足定制化需求即可,其大小是在96KB范围之内的,因此使用BL1+BL2方式也省的使用代码重定位了。
3.4.3为什么要有重定位?
原因:链接地址和运行时地址有时候必须不同,而且还不能全部用位置无关码,这时候只能重定位。(运行地址空间(96KB)不够uboot(200KB)的使用,因此链接地址和运行时地址必须不同,解决方案就是使用长跳转指令将程序运行从iSRAM中解脱出来,放在更大的空间DRAM中去运行。这就是所谓的代码重定位。)
扩展:分散加载:把uboot分成2部分(BL1和整个uboot),两部分分别指定不同的链接地址。启动时将两部分加载到不同的地址(BL1加载到SRAM,整个uboot加载到DDR),这时候不用重定位也能启动。
评价:分散加载其实相当于手工重定位。重定位是用代码来进行重定位,分散加载是手工操作重定位的。
3.4.4运行时地址由什么决定?
运行时地址是由运行时决定的(编译链接时是无法绝对确定运行时地址的)
3.4.5链接地址由什么决定?
链接地址是由程序员在(编译)链接的过程中,通过Makefile中-Ttext xxx或者在链接脚本中指定的。程序员事先会预知自己的程序的执行要求,并有一个期望的运行地址,并会用这个地址来作为链接地址。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里扫码进群领资料,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!