Uboot中start.S源码的指令级的详尽解析

版本:v1.9

Crifan Li

摘要

本文对Uboot中的Start.S的源码的几乎每一行,都进行了详细的解析

[提示] 本文提供多种格式供:
在线阅读 HTML HTMLs PDF CHM TXT RTF WEBHELP
下载(7zip压缩包) HTML HTMLs PDF CHM TXT RTF WEBHELP

HTML版本的在线地址为:

http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analysis.html

有任何意见,建议,提交bug等,都欢迎去讨论组发帖讨论:

http://www.crifan.com/bbs/categories/uboot_starts_analysis/

2013-09-04

修订历史
修订 1.9 2013-09-04 crl
  1. 通过Docbook发布
  2. 修正了一些琐碎的笔误,同时增添了些琐碎内容
  3. 修正了0xdeadbeef的解释
  4. 更新了所有的xml:id
修订 1.6 2011-05-01 crl
  1. 添加汇编学习记录
  2. 添加了如何查看C或汇编的源代码所对应的真正的汇编代码
  3. 添加Start.S的总结
    1. Start.S的各个部分的总结
    2. Uboot中的内存的layout
  4. 更加详细地解释了为何ARM9中PC=PC+8
  5. 添加了一些其他的细节的内容
  6. 修正一些拼写错误
修订 1.0 2011-04-17 crl
  1. 详细解释了uboot的start.s中的每行代码
  2. 添加了相关知识点的详细解释

目录

正文之前
1. 本文内容
2. 本文目标
3. 代码来源
4. 阅读此文所要具有的前提知识
5. 声明
1. start.S详解
1.1. 设置CPU模式
1.1.1. globl
1.1.2. _start
1.1.3. ldr
1.1.4. .word
1.1.5. .balignl
1.1.6. _TEXT_BASE _armboot_start
1.1.7. _bss_start _bss_end
1.1.8. FREE_RAM_END FREE_RAM_SIZE
1.1.9. IRQ_STACK_START FIQ_STACK_START
1.1.10. cpsr
1.1.11. bic
1.1.12. orr
1.1.13. msr
1.2. 关闭看门狗
1.2.1. pWTCON INTMOD INTMSK INTSUBMSK CLKDIVN
1.2.2. ldr pWTCON
1.2.3. mov
1.2.4. str
1.3. 关闭中断
1.3.1. set INTMSK
1.3.2. set INTSUBMSK
1.3.3. set CLKDIVN
1.3.4. bl
1.4. 设置堆栈sp指针
1.4.1. stack_setup
1.4.2. calc stack
1.4.3. bl clock_init
1.4.4. adr
1.4.5. clear_bss
1.4.6. cal armboot size from _armboot_start
1.4.7. cal armboot size from CopyCode2Ram
1.5. 清除bss段
1.5.1. clear_bss
1.5.2. clear css loop
1.5.3. ldr pc
1.5.4. cpu_init_crit
1.5.5. disable MMU
1.5.6. clear bits
1.5.7. bl lowlevel_init
1.6. 异常中断处理
1.6.1. macros stmia
1.6.2. cal reg value and store
1.6.3. irq_save_user_regs irq_restore_user_regs
1.6.4. exception handlers
1.6.5. Launch
1.6.6. int_return
2. start.S的总结
2.1. start.S各个部分的总结
2.2. Uboot中的内存的Layout
3. 相关知识点详解
3.1. 如何查看C或汇编的源代码所对应的真正的汇编代码
3.2. uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
3.3. 什么是watchdog + 为何在要系统初始化的时候关闭watchdog
3.3.1. 什么是watchdog
3.3.2. 为何在要系统初始化的时候关闭watchdog
3.4. 为何ARM7中PC=PC+8
3.4.1. 为何ARM9和ARM7一样,也是PC=PC+8
3.5. AMR寄存器的别名 + APCS
3.5.1. ARM中的寄存器的别名
3.5.2. 什么是APCS
3.6. 为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
3.6.1. 保存现场/上下文
3.6.1.1. 什么叫做上下文context
3.6.2. 传递参数
3.6.3. 举例分析C语言函数调用是如何使用堆栈的
3.7. 关于为何不直接用mov指令,而非要用adr伪指令
3.8. mov指令的操作数的取值范围到底是多少
3.9. 汇编学习总结记录
3.9.1. 汇编中的标号=C中的标号
3.9.2. 汇编中的跳转指令=C中的goto
3.9.3. 汇编中的.globl=C语言中的extern
3.9.4. 汇编中用bl指令和mov pc,lr来实现子函数调用和返回
3.9.5. 汇编中的对应位置有存储值的标号 = C语言中的指针变量
3.9.6. 汇编中的ldr+标号,来实现C中的函数调用
3.9.7. 汇编中设置某个寄存器的值或给某个地址赋值
参考书目

插图清单

1.1. LDR指令的语法
1.2. CPSR/SPSR的位域结构
1.3. pWTCON
1.4. INTMOD
1.5. INTMSK
1.6. INTSUBMSK
1.7. CLKDIVN
1.8. WTCON寄存器的位域
1.9. INTMSK寄存器的位域
1.10. INTSUBMSK寄存器的位域
1.11. INTSUBMSK寄存器的位域
1.12. macro的语法
1.13. LDM/STM的语法
1.14. 条件码的含义
2.1. Uboot中的内存的Layout
3.1. AMR7三级流水线
3.2. ARM7三级流水线状态
3.3. ARM7三级流水线示例
3.4. ARM7三级流水线 vs ARM9五级流水线
3.5. ARM7三级流水线到ARM9五级流水线的映射
3.6. ARM9的五级流水线示例
3.7. ARM9的五级流水线中为何PC=PC+8
3.8. ARM Application Procedure Call Standard (AAPCS)
3.9. 数据处理指令的指令格式

表格清单

1.1. global的语法
1.2. .word的语法
1.3. balignl的语法
1.4. CPSR Bitfield
1.5. CPSR=0xD3的位域及含义
1.6. 控制寄存器1的位域含义
1.7. 时钟模式
1.8. 关于访问控制位在域访问控制寄存器中的含义
1.9. 关于访问允许(AP)位的含义
3.1. ARM中CPU的模式
3.2. ARM寄存器的别名
3.3. mov指令0xe3a00453的位域含义解析

范例清单

3.1. 汇编中的ldr加标号实现函数调用 示例
3.2.
3.3.