记录2--u-boot 1.1.6 start.S
来源:互联网 发布:java绝对路径 编辑:程序博客网 时间:2024/04/30 10:42
_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
说明:
(1)_start是整个u-boot程序的入口点,即链接后,该处是整个程序的第一条指令。程序的入口点是由链接脚本所指定,比如对于smdk2410的板子(下面都以smdk241为例),脚本文件位于board/smdk2140/u-boot.lds。在该脚本文件中:ENTRY(_start)即指定程序的入口地址。
(2)globl _start 定义一个外部可以引用的变量,比如说,在其它源代码文档中。就可以直指引用_start这个变量。而在C语言中如intentry=_start; 那此处entry值将是多少呢?因为_start相当于一个变量,entry的值就是_start处存储的值。即breset机器码值。关于globl定义的变量得注意的地方。
(3)关于 balignal 16,0xdeadbeef的网上资料:
.align伪操作用于表示对齐方式:通过添加填充字节使当前位置满足一定的对齐方式。
.balign的作用同.align。
.align {alignment} {,fill} {,max}
其中:alignment用于指定对齐方式,可能的取值为2的次幂,缺省为4。fill是填充内容。
缺省用0填充。max是填充字节数最大值,如果填充字节数超过max,就不进行对齐.
例如: .align 4, 指定对齐方式为字对齐
deadbeef一般用来表示没用的或是已经被释放掉的内存
_TEXT_BASE:
.word TEXT_BASE
.globl _armboot_start
_armboot_start:
.word _start
.globl _bss_start
_bss_start:
.word __bss_start
.globl _bss_end
_bss_end:
.word _end
备注这几个由.word伪操作符定义变量的作用及其取值
_TEXT_BASE:
.word TEXT_BASE
_TEXT_BASE:此处定义一汇编语言标签,更好的理解就是:告诉编译器。
事实上,CPU上电后。
.globl _armboot_start
_armboot_start:
.word _start
定义外部可以引用的变量_armboot_start,此处为标签为_armboot_start的内存赋值,取的值为_srart内存中的值,即相当于C long_armboot_start=&_start;_armboot_start值是多少?是TEXT_BASE,即0x33F80000!等价的那条C语句,取的是_start变量地址。
在汇编语言中,理解上有点不一样。上面三行语句。
第一句,告诉编译器。
第二句,_armboot_start变量在此处,到底在哪。
第三句,_armboot_start变量空间放的数据为_start标签的值。这点与C语言的理解有点不一样了。此处引用的是_start标签对应处的地址。在汇编语言中,标签代表的就是那行所在的地址。
图1是从u-boot编译后生成的u-boot.map截图的。从此文件中知道,_armboot_start这个变量地址为0x33f80044,
.globl_bss_start
_bss_start:
.word __bss_start
此三句。
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
上面的__bss_start=.; 表示__bss_start值就是当前位置的值。当前位置是多少呢?从下面一句
.bss:{*(.ss)}知道。紧接该位置后面马上就是放bss段数据了。所以。
参考:http://blog.chinaunix.net/u1/58780/showart_462971.html
bss是这个链接脚本的最后一个段。start.S就是以这个段的起始地址来计算要搬运u-boot大小的代码的。即。
再次验证一下0x33f96f20就是__bss_start值。
.globl _bss_start
_bss_start:
.word __bss_start
reset:
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
#if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008
# define CLKDIVN 0x14800014
#elif defined(CONFIG_S3C2410)
# define pWTCON 0x53000000
# define INTMSK 0x4A000008
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014
#endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
mov r1, #0xffffffff
ldr r0, =INTMSK
str r1, [r0]
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
adr r0, _start
ldr r1, _TEXT_BASE
cmp r0, r1
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2
add r2, r0, r2
copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop
#endif
stack_setup:
ldr r0, _TEXT_BASE
sub r0, r0, #CFG_MALLOC_LEN
sub r0, r0, #CFG_GBL_DATA_SIZE
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12
clear_bss:
ldr r0, _bss_start
ldr r1, _bss_end
mov r2, #0x00000000
clbss_l:str r2, [r0]
add r0, r0, #4
cmp r0, r1
ble clbss_l
ldr pc, _start_armboot
_start_armboot: .word start_armboot
- 记录2--u-boot 1.1.6 start.S
- u-boot-1.1.6源代码---start.S
- U-BOOT start.s
- U-boot Start.s
- u-boot-1.1.6 start.S代码笔记
- 【Bootloader】u-boot 1.1.6 start.S 代码学习
- u-boot 1.1.6 start.S 代码学习
- u-boot 1.1.6 start.S 代码学习
- u-boot 学习记录 (三) 源码分析(start.S)
- U-BOOT start.S分析
- u-boot走读 -- start.S
- U-boot start.s 详解
- u-boot 中start.S
- u-boot start.S调试
- u-boot分析--start.s
- u-boot start.s 分析
- U-BOOT start.S分析
- start.S(u-boot.2012.10)
- Android静默安装、卸载,应用程序/预装程序
- Java 读写GZIP格式文件
- 判断一字符串是不是对称的
- Scala 中的 apply 和 update 方法
- 文件系统名词记忆
- 记录2--u-boot 1.1.6 start.S
- quartz集成spring下的集群配置
- 简述301重定向的优势
- 你在为谁打工呢?
- 输入多组字符串 方法getline()与vector
- Linux-清除root密码
- Hessian 原理分析
- 开博第一篇
- 移动端兼容性浅析