今天刚学习完bootloader的核心初始化,趁早记下,免得忘记
关于ARM11的bootloader核心初始化,通过对u-boot的分析,主要有以下6步
1设置异常向量表
2设置CPU到svc模式
3关闭看门狗
4关闭所有中断
5关闭mmu和cache
6外设基地址初始化(这里先不讨论)
明确目标之后就可以开始了,先构造脚本文件
OUTPUT_ARCH(arm)
ENTRY(_start) //标记文件入口处
SECTIONS{
. = 0x50008000;
. = ALIGN(4); //对齐
.text : //执行代码
{
start.o(.text)
*(.text)
}
. = ALIGN(4);
.data : //数据
{
*(.data)
}
. = ALIGN(4);
bss_start = .;
.bss :
{
*(.bss)
}
bss_end = .;
}
然后转到.text文件写执行代码,创造start.S汇编文件,
.text
.global _start
_start: #以上都是规定,表示从_start处开始进入程序,下面是为了方便起见,进行了一下类似宏定义的操作
_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
设置中断向量表,说白了就是在程序发生异常时,你要去这几个地址执行对应的异常处理