完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在开始学习uboot的移植,一直为记不住修改uboot那些文件而烦恼,对uboot的启动流程的认识也是只停留在纸面上。于是,这几天决心静下心来,花点时间来仔细仔细阅读以下uboot的源码。
以前总是对这些源码存在着恐惧心理,简单的认为这是一件很枯燥的事情。不过,当真正开始阅读以后,发现以前的想法真是太错误了。通过分析源码,可以让你有种豁然开朗的感觉,以前停在表面的东西,在源码中可以找到最具体的实现过程。另外,由于编写代码的人都是编程的高手,有些技巧是在其他地方很难看到的,所以阅读时往往会有意料之外的收获。 于是,记录下阅读笔记,希望大家能一起讨论,错误的地方也希望指出。 版本:u-boot-1.1.6平台: ARM920t s3c2440 一、启动流程(根据源码启动来读的,有些地方省略) 从/arm/arm920t/start.S文件开始,为第一阶段 1.设置向量表 由硬件结构决定,几乎所以的启动代码都是以在异常入口设置跳转代码开始 2.从reset标号开始,开机或复位运行,进入管理模式 由异常向量表可知,开机或复位跳转到reset地址开始运行 3.开始一系列最初的初始化: 1) A. 关看门狗 B. 设置时钟分频 C. 关中断 这三部在自己编写裸机程序时常用,所以对自己编写也有参考价值。 4)cpu_init_crit: 这一部分执行的一下操作 A. flush v4 I/D caches 刷新caches,操作cp15协处理起的有点看不懂 mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ B. disable MMU stuff and caches 关MMU和caches这部分也看不懂 mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) orr r0, r0, #0x00000002 @ set bit 2 (A) Align orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache mcr p15, 0, r0, c1, c0, 0 C. 跳转到board/ bl lowlevel_init lowlevel_init函数起主要是初始化SDRAM,为后面的重定向做准备吧 5)重定向代码(relocale): 这里有两种情况: 当代码在内存中时,不重定向; 当不在时执行重定向 所以这里有个技巧:即当前运行地址是否等于连接时所指定的地址 relocate: /* relocate U-Boot to RAM */ adr r0, _start /* r0 <- current position of code */ ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */ beq stack_setup ldr r2, _armboot_start ldr r3, _bss_start sub r2, r3, r2 /* r2 <- size of armboot */ add r2, r0, r2 /* r2 <- source end address */ copy_loop: ldmia r0!, {r3-r10} /* copy from source address [r0] */ stmia r1!, {r3-r10} /* copy to target address [r1] */ cmp r0, r2 /* until source end addreee [r2] */ ble copy_loop 由此可知,这里_start为当前运行地址, _TEXT_BASE为指定为SDRAM中的连接地址 ,_bss_start是代码段数据段的结尾地址 唯一理解不清的是_armboot_start,根据上面的代码应该是指目标开始地址,但是在start.S中可找到如下定义,那不是_armboot_start里记录的是_start的地址了? .globl _armboot_start _armboot_start: .word _start 参考完全手册发现_bss_start的定义在连接脚本board/ 6)设置栈(set up stack) CFG_MALLOC_LEN: malloc area留出一段内存,实现mallco函数 CFG_GBL_DATA_SIZE: bdinfo留出一段内存,存一些全局变量 这两项都在/include/configs/ ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */ 7)清bss段 4、跳转到第一个C函数: start_armboot() 一阶段完成,下面记录的是这一部分uboot中比较难理解的语句 二、指令解析: .balignl 16,0xdeadbeef (/arm/arm920t/start.S) 设置完向量表后,便出现这一指令, 咋一看完全不知什么意思,在网上找了很多参考,才勉强理解一点 参考http://www.linuxidc.com/Linux/2011-10/46013.htm 简单来说就是,当前地址若不是16字节的倍数而填充0xdeadbeef后可以凑成16字节的倍数,则填充0xdeabeef,不知这样理解对不对 三、start.S头文件分析 在start.S中包含的头文件是 #include #include 而在这两个文件中根本没有什么东西,它那是怎么为自己提供头文件信息的呢? 其实config.h在编译时生成的/include/config.h文件 而在/include/config.h 则包含头文件 configs/ |
|
相关推荐
4个回答
|
|
good
|
|
|
|
学习了
|
|
|
|
重定向代码部分还是 不太理解,希望能多做解释,举例说明
|
|
|
|
好贴! 请教楼主,阅读源码的时候有什么方向没有,是按照韦老师视频中所讲解的源码为中线吗?求交流,谢谢啦
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2195 浏览 6 评论
1994 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4549 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 14:35 , Processed in 3.323073 second(s), Total 84, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号