x210v3开发板u-boot-2012.10移栽之补充篇-uboot启动流程详解
x210v3开发板u-boot-2012.10移植之补充篇---uboot启动流程详解
欢迎加入朱老师物联网大课堂qq群 一起学习进步
这里是一些需要包含的头文件,先不管用到了再说。接着往下看
.globl _start 定义了一个全局标号,为什么要全局化呢?因为链接器脚本(u-boot.lds)要用到,不全局化链接器脚本是找不到的。u-boot.lds位于arch/arm/cpu目录下,看到u-boot.lds里有这么一句ENTRY(_start)。然后,b reset调到reset标号。(后面7行代码是异常向量表,这里不深入讲,有兴趣的可以去看,arm处理器部分,到时我会讲。讲讲CONFIG_SPL_BUILD这个宏,默认是没有定义的。那么是用来干嘛的呢?其实是用来控制生成BL1的,具体如何配置才能生成SPL或者说BL1请看README文件,但是这里我们不用它,我们可以截取BL2(也就是u-boot.bin)的前16k-16字节作为BL1。 .balignl与. align类似,完整的laign语句格式为:.align {alignment} {,fill} {,max},alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节数最大值,如果填充字节数超过max, 不进行对齐。但是这里的.balignl 16,0xdeadbeef 是指16字节对齐,而不是2的16次方对齐,从当前地址开始用deadbeef填充。为什么要字节对齐呢?因为我们是32位的ARM处理器,要求指令的地址是4字节对齐,否则编译不通过,不信可以试试。然后为嘛是16字节对齐呢?难道u-boot作者故意搞笑,有兴趣的自己去试试改为4字节对齐。我们接着往下分析)
又是一个跳转,不要慌其实这个跳转啥也没干。因为往下可以看到
欢迎加入朱老师物联网大课堂qq群 一起学习进步
群号:397164505
自己建立source insight工程,从uboot入口点(_start)开始一路往下分析,_start位于arch/arm/cpu/armv7/start.S文件,打开看看
#include <asm-offsets.h> #include <config.h> #include <version.h> #include <asm/system.h> #include <linux/linkage.h>
这里是一些需要包含的头文件,先不管用到了再说。接着往下看
.globl _start _start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq #ifdef CONFIG_SPL_BUILD _undefined_instruction: .word _undefined_instruction _software_interrupt: .word _software_interrupt _prefetch_abort: .word _prefetch_abort _data_abort: .word _data_abort _not_used: .word _not_used _irq: .word _irq _fiq: .word _fiq _pad: .word 0x12345678 /* now 16*4=64 */ #else _undefined_instruction: .word undefined_instruction _software_interrupt: .word software_interrupt _prefetch_abort: .word prefetch_abort _data_abort: .word data_abort _not_used: .word not_used _irq: .word irq _fiq: .word fiq _pad: .word 0x12345678 /* now 16*4=64 */ #endif /* CONFIG_SPL_BUILD */ .global _end_vect _end_vect: .balignl 16,0xdeadbeef
.globl _start 定义了一个全局标号,为什么要全局化呢?因为链接器脚本(u-boot.lds)要用到,不全局化链接器脚本是找不到的。u-boot.lds位于arch/arm/cpu目录下,看到u-boot.lds里有这么一句ENTRY(_start)。然后,b reset调到reset标号。(后面7行代码是异常向量表,这里不深入讲,有兴趣的可以去看,arm处理器部分,到时我会讲。讲讲CONFIG_SPL_BUILD这个宏,默认是没有定义的。那么是用来干嘛的呢?其实是用来控制生成BL1的,具体如何配置才能生成SPL或者说BL1请看README文件,但是这里我们不用它,我们可以截取BL2(也就是u-boot.bin)的前16k-16字节作为BL1。 .balignl与. align类似,完整的laign语句格式为:.align {alignment} {,fill} {,max},alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节数最大值,如果填充字节数超过max, 不进行对齐。但是这里的.balignl 16,0xdeadbeef 是指16字节对齐,而不是2的16次方对齐,从当前地址开始用deadbeef填充。为什么要字节对齐呢?因为我们是32位的ARM处理器,要求指令的地址是4字节对齐,否则编译不通过,不信可以试试。然后为嘛是16字节对齐呢?难道u-boot作者故意搞笑,有兴趣的自己去试试改为4字节对齐。我们接着往下分析)
/* * the actual reset code */ reset: bl save_boot_params /* * set the cpu to SVC32 mode */ mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr,r0
又是一个跳转,不要慌其实这个跳转啥也没干。因为往下可以看到
ENTRY(save_boot_params)
bx lr@ back to my caller
ENDPROC(save_boot_params)
.weak save_boot_params
将ENTRY这个宏展开,ENTRY包含在头文件linkage.h中,为什么是在这个文件呢?这里说下u-boot默认的头文件包含路径,有两个:顶层目录下的include目录和
没写完,我会持续更新修改。。。。