将重定位地址gd->relocaddr加载到R0中,作为参数传给relocate_code; 执行重定位,从relocate_code回来后,就直接运行在重定位后的u-boot中了,here标号已经是重定位后那个here标号了; 上面代码主要是用来将u-boot从CONFIG_SYS_TEXT_BASE重定位到gd->relocaddr位置。 具体如图所示:这里为了方便绘制,将内存地址拆分成了...
//示例代码 arch/arm/config.mk文件代码段needed for relocation//设置 uboot 链接选项,加入了“-pie”选项,编译链接 uboot 的时候就会使用到“-pie”LDFLAGS_u-boot += -pie uboot 对于重定位后链接地址和运行地址不一致的解决方法就是采用位置无关码 使用“-pie”选项以后会生成一个.rel.dyn 段, uboot ...
*/ //得到r2地址的内容,也就是重定位前某个LABEL的地址addr0, r0, r9 /* r0 <- location to fix upinRAM */ //加上一个重定位偏移量,得到重定位之后的某个LABEL地址,也是实际使用的LABEL地址 ldr r1, [r2, #4]andr7, r1, #0xff //获取这个LABEL的重定位类型,如果是23(0x17),就是上文讲的那...
地址无关代码(position-independent-code,PIC),又称为地址无关可执行文件(position-independent-executable,PIE) 加载时重定位解决了动态模块中有绝对地址引用的问题,但是又带来了指令部分无法在多个进程间共享的问题。 具体想法就是把程序模块中共享的指令部分在加载时不需要因为加载地址的改变而改变。把指令中那些需要被...
比较的目的就是看当前程序的运行是在内存里还是在FLASH里,如果是 debug 模式,那么 u-boot是在内存里运行,其开始地址就是TEXT_BASE ,即0x70800000 。上面的4 句代码,就是比较一下,看看当前程序代码在什么位置,如果已经在内存指定的0x07080000 这个位置了,就不必再进行重定位了,而直接进行堆栈设置。
重定位为值 = *(r_offset + 实际偏移值) = 实际偏移值 + r_addend。 根据此公式则可以重定向每一个需要重定向的地址值。 因此在此处同样是如此,x0保存r_offset值,x1保存r_info值,x4保存r_addend,并通过x1与R_AARCH64_RELATIVE比较看是否属于aarch64相对地址类型,如果不是则不是需要重定向的一组表则跳...
U-boot重定位前的GD及内存规划 U-boot总体流程 atf基本启动流程为:BL1 – BL2 – BL31 – BL32 – BL33(uboot),即在bl32启动完成后再启动uboot,uboot作为启动链中作为最后一级镜像,用于启动最终的os。Atf是arm为了增强系统安全性引入,只支持armv7和armv8架构的可信固件。而uboot是通用的嵌入式系统引导程序...
第3期 第6.6讲 Uboot启动流程详解-中断向量表重定位与board_init_r函数执行过程 25:46 第3期 第6.7讲 Uboot启动流程详解-main_loop到cmd_process处理过程 38:51 第3期 第6.8讲 Uboot启动流程详解-bootz启动Linux过程详解1 26:40 第3期 第6.9讲 Uboot启动流程详解-bootz启动Linux过程详解2 31:02 ...
复制Bootloader的第二阶段代码到SDRAM空间中(重定位) 首先判断是NOR启动还是NAND启动,如果是NAND启动就直接拷贝数据。拷贝代码之前,要传递给拷贝函数三个参数,源,目的,长度。读取NAND的话要参考芯片手册的NAND读取数据的时序,选中NAND,发出读命令,发出地址,发出读命令,判断状态,读取数据,取消选中等。
//将重定位地址和偏移保存到寄存器 ldr x9, [x18, #GD_RELOC_OFF] add lr, lr, x9 /* new return address after relocation */ ldr x0, [x18, #GD_RELOCADDR] //relocate_code b relocate_code relocation_return: //设置c的运行环境 bl c_runtime_cpu_setup /* still call old routine */ ...