uboot补充学习记录--start.S分析

之前把start.S注释了一遍,一时忘了记录到博客里面来,现在补上,哈哈大笑

/***************************

start.S启动文件的任务:
阶段一:
(1)设置 CPU 模式
(2)关闭看门狗
(3)关闭中断
(4)设置堆栈 sp 指针
(5)清除 bss 段
(6)异常中断处理
阶段二:
执行串口命令、启动内核
****************************/

#include <tq2440.h>
//tq2440.h文件在目录u-boot-1.1.6\include\configs下面,里面主要是一些硬件配置信息的定义
#include <version.h>

/******************
Arm9体系结构中字长为32位,半字为16位,而一般的8位16位处理器的字长一般为16位。
.word的意思是在当前地址处放一个数据值,并且这个数据位数是32位的。
.balignl  16 ,  0xdeadbeef是什么意思?在当前地址(这个地址要求是16的整数倍)的前面插入一个长字,占用4Bytes。
前16行共用了4*15=60字节的存储单元(ARM指令集是32位的,一次是4字节跳转),开始执第16句时pc指向地址56(0x00000038)处,开始执行第18行时pc指向60,这时编辑代码的人刚好想在这个地址开始的存储空间处存放一个特殊标记值0xdeadbeef(占用4字节),存放完之后pc指针要指向64才对是吧,很好,64刚好是16的整数倍,就用16。当然还可以用8和32 , 4就不行,因为每一个地址跳转都是4的倍数,这样永远腾不出空间来插入数据。
下面这一段是处理器异常处理向量表
*******************/
.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
.balignl 16,0xdeadbeef

;=========================================================================================
;下面这一段是定义一段空间保存text段、bss段、RAM空闲段、普通中断和快中断的堆栈段的定义范围数据
_TEXT_BASE:
.word TEXT_BASE  ;在board\tq2440目录下的config.mk文件里面定义TEXT_BASE=0x33D80000,叫代码的基地址

.globl _armboot_start  ;.globl是全局的,外部可访问的,相当于extern,比如在board.c和cpu.c里都有用到_armboot_start
_armboot_start:
.word   _start  ;代码段的起始地址,也是TEXT_BASE,这要看看relocate那段代码

.globl _bss_start
_bss_start:
.word __bss_start  ;由链接程序ld根据连接脚本确定

.globl _bss_end
_bss_end:
.word _end   ;由链接程序ld根据连接脚本确定

.globl FREE_RAM_END
FREE_RAM_END:
.word 0x0badc0de

.globl FREE_RAM_SIZE
FREE_RAM_SIZE:
.word 0x0badc0de
;FREE_RAM_END 和 FREE_RAM_SIZE 在后面ldr  pc, _start_armboot调用board.c里的函数,start_armboot()又调用了cpu_init(),cpu_init里面调用这两个变量

/* IRQ stack memory (calculated at run-time) */
#ifdef CONFIG_USE_IRQ
.globl IRQ_STACK_START
IRQ_STACK_START:
.word 0x0badc0de

/* FIQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
.word 0x0badc0de
#endif
;在EmbedSky.h文件里面有定义CONFIG_USE_IRQ。同样这两个变量也是在cpu_init函数里面使用

;==============================================================================================
;u-boot真正开始从这里开始执行
reset:
;==================
;(1)set the cpu to SVC32 mode管理模式
;==================
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
    ;bic:清零指令,上面是将r0的0-4位清零,orr:位或


       ;==================
       ;(2)turn off the watchdog
       ;==================
#if defined(CONFIG_S3C2410)      /*tq2440.h文件里面有定义*/
# define pWTCON 0x53000000
# define INTMOD     0X4A000004
# define INTMSK 0x4A000008/* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014/* clock divisor register */
ldr     r0, =pWTCON
mov     r1, #0x0
str     r1, [r0]

;===================
;(3)mask all IRQs by setting
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值