DSP-Sitara课程学习分享6--uboot入门start.S
[复制链接]
编译U-boot的方法在本论坛搜一下就可以了,我就不说了。编译后得到am335x目录,里面就有u-boot.bin和u-boot.lds
1.如何确定哪个文件最先运行呢?
首先进入u-boot-2011.09-psp04.06.00.08目录查看Makefile文件:
看到
#########################################################################
# U-Boot objects....order is important (i.e. start must be first)
OBJS = $(CPUDIR)/start.o
再看看刚才编译uboot最后输出的信息:
-Ttext 0x402F0400 arch/arm/cpu/armv7/start.o 这句与上面就对应起来了。
所以,可以确定start.o最先运行。
链接脚本u-boot.lds中:
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
//0x402F0400
. = ALIGN(4);
.text :
{
arch/arm/cpu/armv7/start.o (.text)
//从0x402F0400地址开始放置
arch/arm/cpu/armv7/start.o 的代码段
*(.text)
//其他文件所有代码段
}
2.分析start.S文件
对于 uboot的start.S,主要做的事情就是系统各个方面初始化。可以分成这几个部分:
(1)设置 CPU模式
(2)关闭看门狗
(3)关闭中断
(4)设置堆栈 sp 指针
(5)清除 bss 段
(6)异常中断处理
.globl _start
_start: b reset
/*系统reset 后进入的入口*/
ldr pc, _undefined_instruction
/*未定义指令,系统出错处理的入口*/
ldr pc, _software_interrupt
/*软中断,monitor 程序的入口*/
ldr pc, _prefetch_abort
/*,预取失败错误*/
ldr pc, _data_abort /*取数据失败错误*/
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
/*快速中断请求*/
ldr pc, _fiq
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
reset:
bl save_boot_params
//用来指定u-boot传递给内核的默认参
/*
* set the cpu to SVC32 mode
//进入CPU管理模式
*/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
通过设置ARM 的CPSR 寄存器,让CPU 运行在操作系统保护模式,禁止IRQ 和FIQ 中断
,这是为了防止代码正在执行时, 产生外部中断, 导致程序跳转到异常向量表而无法
正常按顺序执行。
/* Set up the stack*/ 设置好栈才能调用C函数
stack_setup:
mov sp, r4
adr r0, _start
cmp r0, r6
moveq r9, #0 /* no relocation. relocation offset(r9) = 0 */
beq clear_bss /* skip relocation */
m
ov r1, r6 /* r1 <- scratch for copy_loop */
ldr r3, _image_copy_end_ofs
add r2, r0, r3 /* r2 <- source end address */
小弟能力有限,只能分析到这里