版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SilverFOX111/article/details/86586754
start.S代码分析笔记
path = …/uboot/cpu/s5pc11x/
1. Uboot程序入口
通过查看Uboot链接脚本,第一句为ENTRY(_start)
,查看整个工程,可以发现程序的入口在start.S文件中。
2. 28-39行代码(头文件包含)
#include <config.h>
#include <version.h>
#if defined(CONFIG_ENABLE_MMU)
#include <asm/proc/domain.h>
#endif
#include <regs.h>
#ifndef CONFIG_ENABLE_MMU
#ifndef CFG_PHY_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE
#endif
#endif
- config.h 文件由mkconfig 文件创建,具体可参考此链接,其中内容是包含了configs/x210_sd.h头文件,该文件定义了210开发板的配置信息,路径是…/uboot/include/configs/。
- version.h 文件包含了version_autogenerated.h 文件,这个文件由主Makefile文件365行创建,里面定义了Uboot版本号的宏。
- CONFIG_ENABLE_MMU 在config.h中定义,所以要包含头文件asm/proc/domain.h ,该文件的路径是…/uboot/include/asm-arm/proc-armv,asm与proc都是由mkconfig 文件创建的软连接,分别指向asm-arm与proc-armv,具体过程可点击此链接查看,该文件中主要一是一些域的定义。
- regs.h 文件是由mkconfig 文件创建的软连接,指向…/uboot/include/s5pc110.h,内容为s5pc110寄存器即I/O引脚定义。
- 由于已经定义过CONFIG_ENABLE_MMU,下半段代码不执行。
3. 49-54行代码(校验头)
#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
#endif
CONFIG_EVT1 已定义过,CONFIG_FUSED 未定义,本段构造了16字节校验头,因为SD卡启动需要进行16字节校验头,其中的内容之后会修改,只是为了占位,具体的校验和计算是由…/uboot/sd_fusing/C110-EVT1-mkbl1.c 程序计算写入的。
4. 56-83行代码(异常向量表)
.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
_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 */
.global _end_vect
_end_vect:
- 该段根据ARM异常处理机制构造了异常向量表,不同的异常分别给出了不同的中断处理函数跳转指令。
- _pad 处是为了凑64字节。
s5pv210异常向量表
地址 | 内容 |
---|---|
… | … |
0x0000001C | ldr pc, _fiq |
0x00000018 | ldr pc, _irq |
0x00000014 | ldr pc, _not_used |
0x00000010 | ldr pc, _data_abort |
0x0000000C | ldr pc, _prefetch_abort |
0x00000008 | ldr pc, _software_interrupt |
0x00000004 | ldr pc, _undefined_instruction |
0x00000000 | b reset |
5. deadbeef(坏牛肉)
85行代码.balignl 16,0xdeadbeef
只是为了16字节对齐,后面的deadbeef是十六进制数,用于填充16字节缺省部分,至于填充值,纯粹恶搞。
6. 99-100行代码(链接地址)
_TEXT_BASE:
.word TEXT_BASE
- 定义了程序的链接地址,并给出了标号 _TEXT_BASE 指向了链接地址的内容,相当于C语言的指针。
- TEXT_BASE 是一个配置值,在MK文件中创建的变量,路径是…/uboot/board/samsung/x210/config.mk ,且该文件是在配置是自动生成的,具体过程可点击此链接,配置值给出是在主makefile文件的2590行,
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
,此处值为0xc3e00000,也即程序的链接地址。另外值得注意的是,源代码中可以使用Makefile配置文件中的值。
7. 107-108行代码(物理地址)
_TEXT_PHY_BASE:
.word CFG_PHY_UBOOT_BASE
该段给出了Uboot实际运行地址0x33e00000,区别于上述的TEXT_BASE ,CFG_PHY_UBOOT_BASE这是物理地址,而TEXT_BASE是虚拟地址,二者相互对应。
8. 141-149行代码(复位函数入口,cpsr_c寄存器设置)
reset:
/*
* set the cpu to SVC32 mode and IRQ & FIQ disable
*/
@;mrs r0,cpsr
@;bic r0,r0,#0x1f
@;orr r0,r0,#0xd3
@;msr cpsr,r0
msr cpsr_c, #0xd3 @ I & F disable, Mode: 0x13 - SVC
- reset: 是复位异常的处理函数入口,也是实际整个Uboot代码的入口
- 最后一句设置cpsr_c的值为11010011(B),即禁止IRQ与FIQ,设置CPU为SVC管理模式,设置ARM状态。
cpsr寄存器
9. 200-221行代码(刷新iCache,MMU)
bl disable_l2cache
bl set_l2cache_auxctrl_cycle
bl enable_l2cache
/*
* Invalidate L1 I/D
*/
mov r0, #0 @ set up for MCR
mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB
mcr p15, 0, r0, c1, c0, 0
10. 225-227行代码(读取启动方式)
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET]
bic r2, r1, #0xffffffc1
- 0xE000_0004地址中存放了启动选择引脚的值(OMpin),PRO_ID_BASE 值为0xE0000000,OMR_OFFSET 值为0x04。最后r2中存放了启动方式。查下表可得SD卡启动对应的值为00110x或10110x。
11. 259-260,277-278行代码(SD卡启动)
cmp r2, #0xc
moveq r3, #BOOT_MMCSD
--------------------------------
ldr r0, =INF_REG_BASE
str r3, [r0, #INF_REG3_OFFSET]
- 由10可知,r2值为0x1100,即0xc,所以选择SD/MMC启动,并在r3保存了一个值BOOT_MMCSD (0x3)。
- 在最后277-278行结束启动检查,并将r3(0x3)赋值给地址为0xE010_F00C)的INFORM3(Information register3。
12. 284-286行代码(初始化栈)
ldr sp, =0xd0036000 /* end of sram dedicated to u-boot */
sub sp, sp, #12 /* set stack */
mov fp, #0
附上S5PV210的Memory Map以及SRAM空间图