start.S文件分析1

(1)头文件分析

#config.h文件是配置的时候生成的,它里面的内容是configs/x210_sd.h里的内容
#include <config.h>
#version.h是配置过程生成的,他里面是uboot的版本好(在Makefile里面生成的)
#include <version.h>

#if defined(CONFIG_ENABLE_MMU)
#asm/proc/domain.h是配置的时候生成的符号链接,它实际指向的是asm-arm/proc-armv/domain.h文件
#include <asm/proc/domain.h>
#endif
#regs.h文件的内容实际上是x210_sd.h里面的内容
#include <regs.h>

#ifndef CONFIG_ENABLE_MMU
#ifndef CFG_PHY_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE
#endif
#endif

(2)启动代码的16个字节头

#这里只是留下16个字节的空间,没有进行填充,当我们是SD卡启动的时候,mkvimage.c会填充16字节的校验头
#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
#.word可以看成unsigned int的类型,0x2000可以看成一个值
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
#endif

(3)异常向量表构成

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

(4)异常向量表处理

_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 0x123456

(5)内存16字节对齐

#balignl是内存对齐,16代表16个字节,如果没对齐用0xdeadbeef填充
.balignl 16,0xdeadbeef

(7)链接地址

#TEXT_BASE是配置是生成的文件,里面存放了一个地址,_TEXT_BASE相当于一个指针,当要使用时用来指向地址
_TEXT_BASE:
.word TEXT_BASE

(8)复位

#cpsr是程序状态寄存器,_c代表是bit0-bit7,#0xd3 的含义是:禁止FIQ和 IRQ,状态是ARM状态,SVC模式

reset:
	msr	cpsr_c, #0xd3		@ I & F disable, Mode: 0x13 - SVC

(9)设置L1,L2cache和MMU

#禁止L2cache
bl	disable_l2cache
#初始化L2cache
bl	set_l2cache_auxctrl_cycle
#打开L2cache
bl	enable_l2cache

#打开L1的icache和dcache
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

(10)判断启动方式

	#这三句是用来得到启动的值r2
    ldr	r0, =PRO_ID_BASE
    ldr	r1, [r0,#OMR_OFFSET]
    bic	r2, r1, #0xffffffc1
    #判断r2是否等于0xc,等于是SD卡启动
   cmp     r2, #0xc
   #将#BOOT_MMCSD里的值赋给r3
   moveq   r3, #BOOT_MMCSD	

(11)设置栈并且调用lowlevel_init

#将栈设置到0xd0036000处
ldr sp, =0xd0036000 /* end of sram dedicated to u-boot /
sub sp, sp, #12 /
set stack */
mov fp, #0

(这里设置栈是因为程序会二次调用函数。LR只有一个,当我们调用函数是会将返回地址存放在LR中,如果二次调用函数会使第一次调用函数的返回地址丢失,所以要将第一次的返回地址放入栈中)
#跳转到lowlevel_init中
bl lowlevel_init

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值