uboot启动第一阶段--start.S代码分析笔记(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SilverFOX111/article/details/86586754


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_BASECFG_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寄存器
    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。
    OMpin
    OMpin

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空间图
在这里插入图片描述
在这里插入图片描述


uboot启动第一阶段–start.S代码分析笔记(2)

猜你喜欢

转载自blog.csdn.net/SilverFOX111/article/details/86586754