buildroot构建项目(八)--- u-boot 2017.11 适配开发板修改 5 ---- 系统启动初始化之五
执行完 board_init_f 后,跳回到 crt0.S中继续执行汇编语言
ldr r0, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp,gd->start_addr_sp在fdt的初始位置 */
bic r0, r0, # /* 8-byte alignment for ABI compliance */
mov sp, r0 /* sp 指向 fdt 初始位置 */
ldr r9, [r9, #GD_BD] /* r9 = gd->bd */
sub r9, r9, #GD_SIZE /* new GD is below bd,r9 为 gd-t 的基地址 */ adr lr, here /* 跳转到 here 处执行,gd->relocaddr = 0x3400 0000 */
最后一句,跳转到here处去执行
here:
/*
* now relocate vectors
*/
bl relocate_vectors /* 重定向向量表 */
一、relocate_vectors 重定向向量表
relocate.S (arch\arm\lib)
这一段主要是对前面所说的向量表进行重定向
/*
* Copy the relocated exception vectors to the
* correct address
* CP15 c1 V bit gives us the location of the vectors:
* 0x00000000 or 0xFFFF0000.
*/
ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr。0x3400 0000 */
/* 将 c1 的值读到 r2 寄存器中 */
/* 主要是控制 bit[13]: V */
/* 对于支持高端异常向量表的系统,本控制位控制向量表的位置 */
/* 0 :选择低端异常中断向量 0x0~0x1c */
/* 1 :选择高端异常中断向量0xffff0000~ 0xffff001c */
/* 对于不支持高端异常向量表的系统,读取时该位返回0,写入时忽略 */
mrc p15, , r2, c1, c0, /* V bit (bit[13]) in CP15 c1 */
/* ands 后面的 s 会影响CPSR状态的寄存器的标志位 */
/* 若 相与的 结果为0,则CPSR的状态标志位 Z = 1;反之,Z = 0 */
ands r2, r2, #( << ) /* r2 寄存器和 0010 0000 0000 0000 按位与后存入r2中 */
ldreq r1, =0x00000000 /* If V=0,则Z=1,可执行 ldr指令 */
ldrne r1, =0xFFFF0000 /* If V=1,则Z=0,可执行 ldr */
/* 将 r2 -- r8 以及 r10 传入相应的地址,每次传输之后递增R0指向的存储地址,因为是32位,每次递增的地址应该是4bytes */
ldmia r0!, {r2-r8,r10} /* ldmia 多寄存器寻址指令, */
stmia r1!, {r2-r8,r10} /* 将R2-R8 和 r10的数据存储到R1指向的地址上,R1值更新。 */
ldmia r0!, {r2-r8,r10}
stmia r1!, {r2-r8,r10}
#endif
二、relocate_code
here执行完后,跳回,执行下面的代码
ldr r0, [r9, #GD_RELOC_OFF] /* r0 = gd->reloc_off,gd->reloc_off = gd->relocaddr */
add lr, lr, r0 /* lr += r0,异常向量表的地址确定 */
/* 重定向地址确定 */
ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr 为 0x3400 0000 - u-boot 大小,即在u-boot的起始地址处 */
b relocate_code /* 重定向代码 */
进入 relocate_code, relocate.S (arch\arm\lib)
ENTRY(relocate_code)
/* __image_copy_start 在u-boot.lds 文件中定义,为起始地址 0 */
ldr r1, =__image_copy_start /* r1 <- SRC &__image_copy_start */
/* subs 影响借位C标志, */
subs r4, r0, r1 /* r4 <- relocation offset ,r4 为重定向偏移量 */
beq relocate_done /* skip relocation,C变为位为1则执行代码 */
/* r2为需要重定位代码的结束地址,r2 - r1就是需要重定位代码长度了 */
ldr r2, =__image_copy_end /* r2 <- SRC &__image_copy_end */ /* 到现在为止,比较重要的几个寄存器的值为
* r0 = gd->reloc_off,r0为重定位偏移量,本处也就是目标地址
* r1 = __image_copy_start,r1为需要重定位代码当前的起始地址,也就是代码段的开始0
* r4 = r0 - r1,r4为重定位的偏移值,偏移值减去0还是0
* r2 =__image_copy_end,r2为需要重定位代码的结束地址,r2 - r1就是需要重定位代码长度了
*/
copy_loop:
/* 从源地址 [r1] 开始拷贝,pop到r10与r11里面,一次8个字节 */
ldmia r1!, {r10-r11} /* copy from source address [r1] */
/* 拷贝到目标地址 [r0] */
stmia r0!, {r10-r11} /* copy to target address [r0] */
/* 一直到 [r1] 等于 [r2], 说明代码拷贝结束 */
cmp r1, r2 /* until source end address [r2] */
blo copy_loop /*
* fix .rel.dyn relocations
* 重定位修正
*/
ldr r2, =__rel_dyn_start /* r2 <- SRC &__rel_dyn_start */
ldr r3, =__rel_dyn_end /* r3 <- SRC &__rel_dyn_end */
fixloop:
ldmia r2!, {r0-r1} /* (r0,r1) <- (SRC location,fixup) */
and r1, r1, #0xff
cmp r1, #R_ARM_RELATIVE
bne fixnext /* relative fix: increase location by offset */
add r0, r0, r4
ldr r1, [r0]
add r1, r1, r4
str r1, [r0]
fixnext:
cmp r2, r3
blo fixloop relocate_done: #ifdef __XSCALE__
/*
* On xscale, icache must be invalidated and write buffers drained,
* even with cache disabled - 4.2.7 of xscale core developer's manual
*/
mcr p15, , r0, c7, c7, /* invalidate icache */
mcr p15, , r0, c7, c10, /* drain write buffer */
#endif /* ARMv4- don't know bx lr but the assembler fails to see that */ #ifdef __ARM_ARCH_4__
mov pc, lr
#else
bx lr
#endif ENDPROC(relocate_code)
执行完后,跳回 crt0.S中继续执行
/*
* now relocate vectors
*/
bl relocate_vectors /* 重定向向量表 */ /* Set up final (full) environment */
bl c_runtime_cpu_setup /* we still call old routine here */ #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_FRAMEWORK) ldr r0, =__bss_start /* this is auto-relocated! */
ldr r1, =__bss_end /* this is auto-relocated! */
mov r2, #0x00000000 /* prepare zero to clear BSS */ clbss_l:cmp r0, r1 /* while not at end of BSS */
strlo r2, [r0] /* clear 32-bit BSS word */
addlo r0, r0, # /* move to next */
blo clbss_l #if ! defined(CONFIG_SPL_BUILD)
/* 这两个函数可以自己实现,或者删除掉 */
bl coloured_LED_init
bl red_led_on
#endif
/* call board_init_r(gd_t *id, ulong dest_addr) */
mov r0, r9 /* gd_t */
ldr r1, [r9, #GD_RELOCADDR] /* dest_addr */
/* call board_init_r */
ldr pc, =board_init_r /* this is auto-relocated! */
/* we should not return here. */
#endif
执行进入 board_init_r 中
三、board_init_r
void board_init_r(gd_t *new_gd, ulong dest_addr)
{
if (initcall_run_list(init_sequence_r))
hang();
/* NOTREACHED - run_main_loop() does not return */
hang();
}
功能函数得实现都在 init_sequeuece_r 中
static init_fnc_t init_sequence_r[] = {
initr_trace, /* 宏未定义,直接返回 0 */
initr_reloc, /* gd->flags = 1 */
/* TODO: could x86/PPC have this also perhaps? */
#ifdef CONFIG_ARM
initr_caches, /* 打印 :Caches not enabled ,暂时未实现*/
#endif
initr_reloc_global_data, /* 宏未定义,直接返回 0 */
initr_barrier, /* 宏未定义,直接返回 0 */
initr_malloc, /* malloc 区分配 */
initr_bootstage, /* Needs malloc() but has its own timer */
initr_console_record, /* 终端记录 */
bootstage_relocate, /* 重定向启动阶段 */
#if defined(CONFIG_ARM) || defined(CONFIG_NDS32)
board_init, /* Setup chipselects */
#endif
stdio_init_tables, /* 设备表格初始化 */
initr_serial, /* 初始化串口,执行得是 Serial.c (drivers\serial) 得serial_initialize()*/
initr_announce, /* 打印 u-boot 运行信息 */
INIT_FUNC_WATCHDOG_RESET
power_init_board, /* 执行得 board.c(common) 中得 */
#ifdef CONFIG_MTD_NOR_FLASH
initr_flash, /* norflash 初始化 */
#endif
INIT_FUNC_WATCHDOG_RESET
#ifdef CONFIG_CMD_NAND
initr_nand, /* nand flash 初始化 */
#endif
initr_env, /* 环境变量初始化 */
INIT_FUNC_WATCHDOG_RESET
initr_secondary_cpu, /* CPU第二阶段初始化,里面为空 */
INIT_FUNC_WATCHDOG_RESET
stdio_add_devices, /* 宏未定义,里面执行为空 */
initr_jumptable, /* jumptable 初始化 */
console_init_r, /* fully init console as a device */
INIT_FUNC_WATCHDOG_RESET
interrupt_init, /* 中断初始化 */
#ifdef CONFIG_ARM
initr_enable_interrupts, /* 中断使能初始化 */
#endif
/* PPC has a udelay(20) here dating from 2002. Why? */
#ifdef CONFIG_CMD_NET
initr_ethaddr, /* 网络地址初始化 */
#endif
#ifdef CONFIG_CMD_NET
INIT_FUNC_WATCHDOG_RESET
initr_net, /* 网络初始化 */
#endif
run_main_loop, /* 启动 内核 */
};
重新编译一下,编译OK了,制作补丁
buildroot构建项目(八)--- u-boot 2017.11 适配开发板修改 5 ---- 系统启动初始化之五的更多相关文章
- buildroot构建项目(六)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之三
一.内存控制器 在关闭了MMU和caches 之后 就进入lowlevel_init 函数,对内存控制器进行初始化.lowlevel_init.S (board\samsung\mini2440) 1 ...
- buildroot构建项目(五)--- u-boot 2017.11 适配开发板修改 3 ---- 系统启动初始化之二
一.cpu_init_crit 当执行完时钟初始化后,程序执行: bl cpu_init_crit 跳转到CPU初始化处进行,在其中主要是执行 caches 的关闭 和 MMU的关闭,之后跳转到 ...
- buildroot构建项目(七)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之四
设置完寄存器控制器后,则跳出cpu_init_crit,进入_main 函数.即进入crt0.S (arch\arm\lib) 跟着代码流程慢慢走 一.crt0.S 1.1 第一步执行代码 /* 预 ...
- buildroot构建项目(四)--- u-boot 2017.11 适配开发板修改 2 ---- 系统启动初始化之一
一.代码分析 上一节已经分析了链接文件,知道了首先代码是从 _start 开始,之后设置了中断向量表,然后从 start.s 开始运行. _start:vectors.S (arch\arm\lib) ...
- buildroot构建项目(三)--- u-boot 2017.11 适配开发板修改 1
当前虽然编译成功了,但是对于我们自己的目标板并不太适用.还得做一系列得修改. 一.lds 文件分析 u-boot 中最重要得链接文件即是,u-boot.lds.我们可以查看我们编译出来得 u-boot ...
- buildroot构建项目(二)--- u-boot 2017.11 建立 2440 开发板
一.准备工作 在建立之前,先需要将下载的u-boot 拷贝一份出来解压,在此工程下进行更改和创建.同时根据前面搜索到的 mini2440开发板所在的版本,下载一份u-boot 拷贝出 mini2440 ...
- buildroot构建项目(一)---buildroot介绍
1.1 什么是buildroot Buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfig配置文件构成的.你可以和编译Li ...
- iTOP-IMX6UL 实战项目:ssh 服务器移植到 arm 开发板
实验环境:迅为提供的Ubuntu12.04.2 以及虚拟机 编译器:arm-2009q3 编译器 开发板系统:QT系统 开发板使用手册中给Windows 系统安装了 ssh 客户端,给 Ubunt ...
- 迅为iTOP-4412物联网开发板入门学习高手进阶项目开发超树莓派
免费视频教程: 为初学者精心录制的整套视频教程全部免费,随IT技术发展而不断增添的视频教程仍然免费!一支有经验的工程师团队会始终成为您的后盾. 项目实战---全开源: 手机远程控制开发板 门禁系统 W ...
随机推荐
- parent()、parents()和parentsUntil()的区别
1.parent() 返回被选元素的直接父元素,该方法只会向上一级对 DOM 树进行遍历: 2.parents() 返回被选元素的所有祖先元素,它一路向上直到文档的根元素 (<html>) ...
- delphi 右键删除dbgrid行
Delphi DBGrid右键删除行并提交至数据库.在form上添加,控件TPopupMenu,并指定右键名称:删行 2.编写删除语句: If ADOQuery1.State in [dsEdit, ...
- 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)
博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...
- 【 Gym - 101138K 】 The World of Trains (DP)
BUPT2017 wintertraining(15) #4E Gym - 101138K 题意 N节车厢的火车,每节车厢容量是1~K,那么有\(K^N\)种火车. 求选择D个连续的且容量相同的车厢的 ...
- 【题解】 bzoj3450 JoyOI1952 Easy (期望dp)
题面戳我 Solution 期望的题目真心不太会 定义状态\(f[i]\)表示到第\(i\)期望长度,\(dp[i]\)表示期望分数 如果上一步的持续\(o\)长度为\(L\),那么贡献是\(L^2\ ...
- 自学Python5.1-面向对象与面向过程
自学Python之路 自学Python5.1-面向对象与面向过程 面向过程:根据业务逻辑从上到下写代码. 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开 ...
- 【BZOJ1856】[SCOI2010]字符串(组合数学)
[BZOJ1856][SCOI2010]字符串(组合数学) 题面 BZOJ 洛谷 题解 把放一个\(1\)看做在平面直角坐标系上沿着\(x\)正半轴走一步,放一个\(0\)看做往\(y\)轴正半轴走一 ...
- React Native——组件FlatList
属性 添加头部组件 ListHeaderComponent属性用来给FlatList添加头部组件 简单使用: //ES6之前写法 _header = function () { return ( &l ...
- luogu2831 [NOIp2016]愤怒的小鸟 (状压dp)
由范围可以想到状压dp 两个点(再加上原点)是可以确定一个抛物线的,除非它们解出来a>=0,在本题中是不合法的 这样的话,我们可以预处理出由任意两个点确定的抛物线所经过的所有的点(要特别规定一下 ...
- P3747 相逢是问候 欧拉定理+线段树
巨难!!! 去年六省联考唯一的一道黑牌题,我今天一天从早到晚,把它从暴力15分怼到了90分,极端接近正解了. bzoj上A了,但是洛谷和loj上面就不行.伪正解会T,奇奇怪怪的类正解会WA.. 那么, ...