start.S
点击(此处)折叠或打开
- #include <common.h> //include 下 包含其他头文件的头文件
- #include <config.h> //包含 include/linux 的头文件
点击(此处)折叠或打开
- .globl _start //.global 声明一个全局变量(4个字节), 供外部函数调用
- _start: b start_code //处理器上电后执行的第一天指令,该条指令占四个字节
- ldr pc, _undefined_instruction // 未定义指令异常处理向量地址, 跳转向量表, 和芯片的体系结构有关.
- ldr pc, _software_interrupt //软中断. ldr 把第二个操作数指向的地址数据传给 PC
- ldr pc, _prefetch_abort //指令预取终止
- ldr pc, _data_abort //数据访问终止
- ldr pc, _not_used //保留未用
- ldr pc, _irq //中断处理
- ldr pc, _fiq //快速中断
- //下面七条指令是分配一个字(四个字节)的空间,存放异常处理函数的入口地址
- _undefined_instruction: .word undefined_instruction //.word 为定义一个 4 字节的空间. 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
- //上面的一共15条指令,每条指令占四个字节,一共15*4=60字节
- .balignl 16,0xdeadbeef //用四个字节(死牛肉)填充,刚好64字节,以16字节对齐
点击(此处)折叠或打开
- .globl _TEXT_BASE
- _TEXT_BASE:
- #if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_TEXT_BASE)
- .word CONFIG_SPL_TEXT_BASE
- #else
- .word CONFIG_SYS_TEXT_BASE // include/configs/$BOARD.h 例如 CONFIG_SYS_TEXT_BASE = 0x33F80000, 定义为在代码的存放地址.
- #endif
- /*
- * __bss_start,__bss_end__,_end都是定义在链接脚本文件\arch\arm\cpu\arm920t\uboot.lds
- */
- .globl _bss_start_ofs
- _bss_start_ofs: //存放bss段开始地址的偏移量
- .word __bss_start - _start
- .globl _bss_end_ofs
- _bss_end_ofs: //存放bss段结束地址的偏移量
- .word __bss_end - _start
- .globl _end_ofs
- _end_ofs: //_end标号结束地址偏移量
- .word _end - _start
- //到此刚好分配了16字节
- #ifdef CONFIG_USE_IRQ //分配irq栈空间
- /* IRQ stack memory (calculated at run-time) */
- .globl IRQ_STACK_START
- IRQ_STACK_START: //存放irq栈空间的起始地址, calculated at run-time 运行时分配
- .word 0x0badc0de
- /* IRQ stack memory (calculated at run-time) */
- .globl FIQ_STACK_START
- FIQ_STACK_START: //存放fiq栈空间的起始地址, calculated at run-time 运行时分配
- .word 0x0badc0de
- #endif
- /* IRQ stack memory (calculated at run-time) + 8 bytes */
- .globl IRQ_STACK_START_IN
- IRQ_STACK_START_IN: //存放irq栈空间的起始地址
- .word 0x0badc0de
点击(此处)折叠或打开
- start_code:
- /*
- * set the cpu to SVC32 mode
- */
- mrs r0, cpsr
- bic r0, r0, #0x1f //设置cpu为管理模式
- orr r0, r0, #0xd3 //关闭irq,fiq中断
- msr cpsr, r0
- # define pWTCON 0x53000000
- # define INTMSK 0x4A000008 /* Interrupt-Controller base addresses */
- # define INTSUBMSK 0x4A00001C
- # define CLKDIVN 0x4C000014 /* clock divisor register */
- //关闭看门狗
- ldr r0, =pWTCON
- mov r1, #0x0
- str r1, [r0]
- /*
- * 设置所有的中断掩码,屏蔽所有一级中断
- */
- mov r1, #0xffffffff
- ldr r0, =INTMSK
- str r1, [r0]
-
- //屏蔽二级中断
- ldr r1, =0x3ff
- ldr r0, =INTSUBMSK
- str r1, [r0]
- /* FCLK:HCLK:PCLK = 1:4:8 */
- ldrr0, =CLKDIVN
- movr1, #5
- strr1, [r0]
- #ifndef CONFIG_SKIP_LOWLEVEL_INIT //该宏用于直接下载到内存中调试用的
- blcpu_init_crit //该函数用于I/D caech,tlb的刷新,以及mmu的设置,sdram的设置
- #endif
- bl_main //_main 定义在 arch/arm/lib/crt0.S 中, 即原来Start.S中部分的汇编代码进行了整合, 一般crt0.S的代码不需要改动.
点击(此处)折叠或打开
- /*------------------------------------------------------------------------------*/
- .globl c_runtime_cpu_setup
- c_runtime_cpu_setup:
- mov pc, lr
- /*
- *************************************************************************
- *
- * CPU_init_critical registers
- *
- * setup important registers
- * setup memory timing
- *
- *************************************************************************
- */
- #ifndef CONFIG_SKIP_LOWLEVEL_INIT
- cpu_init_crit:
- /*
- * flush v4 I/D caches; 刷新指令和数据缓存,TLB缓存表
- */
- mov r0, #0
- mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
- mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
- /*
- * disable MMU stuff and caches 关闭 mmu
- */
- 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
- /*
- * before relocating, we have to setup RAM timing
- * because memory timing is board-dependend, you will
- * find a lowlevel_init.S in your board directory.
- */
- mov ip, lr
- bl lowlevel_init /* ./board/samsung/smdk2410/lowlevel_init.S 对内存进行初始化, 串口等初级输出, LED 状态灯点亮等等 */
- mov lr, ip
- mov pc, lr
- #endif /* CONFIG_SKIP_LOWLEVEL_INIT */