bootloader核心初始化

来源:互联网 发布:淘宝没收货却写已签收 编辑:程序博客网 时间:2024/05/17 00:49

一、异常向量表

1.所谓异常,即:处理器在执行某项特定任务,突然发生另一事件导致处理器必须停下手里工作去处理该事件。ARM上电也属于一种异常,reset。

2.S3C2440异常类型及其地址:

虽然有两套入口地址,但是默认情况下,选择Normal address 作为异常向量,只有当设置了协处理器CP15的相关寄存器以后,才会启用High vector address,此时则忽略Normal address。

Start.s中部分代码

.global _start@定义_start标号为全局属性
@异常向量表
_start: @入口地址
breset @上电就运行的程序
ldr pc, _Undefind_instruction@有可能在nor或者stepping stone,所以不能用绝对跳转
ldr pc, _Software_interrupt@不用ldr pc, Command_abort是因为这里的ldr就是一个装载指令,而不是伪指令,
ldr pc, _Command_abort@此时要装载的是一个实际存在的地址值,故应该现将地址存放在一个存储单元,
@进而我们需要开辟一个新的存储单元_Command_abort
ldr pc, _Data_abort
ldr pc, _Nothing_used@由ARM数据手册可知在数据异常和IRQ异常之间多空出0x00000014

ldr pc, _IRQ
ldr pc, _F
IQ

@实际异常入口地址
_Undefind_instruction:
.word Undefind_instruction
_Software_interrupt:
.word Software_interrupt
_Command_abort:
.word Command_abort
_Data_abort:
.word Data_abort
_Nothing_used:
.word Nothing_used
_IRQ:
.word IRQ
_FIQ:
.word FIQ
@实际异常处理函数
Undefind_instruction:
nop
Software_interrupt:
nop
Command_abort:
nop
Data_abort:
nop
Nothing_used:
nop
IRQ:
nop
FIQ:
nop

链接器脚本

OUTPUT_ARCH(arm) @指定程序运行平台
ENTRY(_start) @指定程序开始语句
SECTIONS {
. = 0x30000000;@指定文件存放位置
. = ALIGN(4);@4字节对齐
.text :
{
start.o(.text)@指定程序开始文件
*(.text)
}

. = ALIGN(4);
.data :
{
*(.data)
}

. = ALIGN(4);
bss_start = .;
.bss :
{
*(.bss)
}
bss_end = .;
}


二、uboot和内核工作模式设置

uboot和内核都是工作在SVC模式,由芯片数据手册可知设置cpsr寄存器后5位为10011相关代码如下:

reset:
blset_svc
set_svc:
mrsr0,cpsr
bicr0,#0x1f @清除r0中后5位
orrr0,#0x13 @r0后5位置10011,常见为d3是为了屏蔽FIQ和IRQ
msrcpsr,r0
movpc,lr

三、关闭看门狗

看门狗原理图:

(1)PCLK经过预分频器以及选择器以后会产生看门狗时钟,然后通过计数逻辑模块,开始计数。
(2)WTDAT是预先存放的计数初值,WTCNT是减量计数模块,当WTCNT从WTDAT的值减到0的时候,如果还没有更新WTDAT,则认为没有喂狗,系统死机,
(3)发出reset  信号,强制系统重启
(4)在初始化阶段,我们认为代码少,系统也不会进入死机状态,为了节约开销,避免无休止的喂狗,所以关闭看门狗。

相关代码:

@设置pWTCONT第0位为0
#define pWTCONT #0x53000000
disable_watchdog:
ldrr0,=pWTCONT
mov r1,#0x0000
str r1,[r0]

四、中断屏蔽

利用屏蔽控制寄存器的读写从而屏蔽中断,全部写1

2440代码如下:

#define pINTMASK #0x4a000008
disable_interrupt:
mvn r1,#0x0
ldr r0,=pINTMASK
str r1,[r0]
mov pc,lr

另外还需要屏蔽cpsr中I、F位,具体方法见“uboot和内核工作模式设置”。

五、关闭MMU

1、ARM存储体系



越往上,越快越贵容量越小
越往下容量越大越慢

2、cache有无对比

没有cache的时候,cpu直接和主存储器进行数据传输,很慢。
有了cache以后,现在cache查找有无cpu需要的数据,有的话直接使用,没有再到主存储器去寻找,找到以后,把数据存到cache里面,以便下次再用到该数据会快很多,cache是比主存储器快很多但是容量小,分为指令cache和数据cache的。

3、虚拟地址:程序中使用的地址


物理地址:实实在在的物理存储设备在系统中的地址。
最终我们应用程序是要访问物理地址,但是鉴于物理地址小,且有可能多个应用程序会同时访问同一个物理地址引起冲突,所以引入虚拟地址,通过映射以后对存储机制进行扩充范围和避免冲突。而重点是如何实现映射机制。

4、MMU作用:把虚拟地址转换成物理地址

(1)上面的图是ARM11之前的结构,要访问cache直接就可以。
(2)下面的图则是ARM11之后包括arm11,要访问cache就要先将地址进行映射,才能到物理地址访问cache。
(3)MMU和cache都是由协处理器cp15控制的

5代码:

(1)使得I/D cache已有的数据失效





(2)直接关闭cache和MMU

(3)具体实现
主要是MMU和Dcache,至于Icache很宽松。主要是怕在下载和启动内核的过程中,使用到的数据存在Dcache而不放到内存。

相关代码:

disable_mmu:
mcr p15,0,r0,c7,c7,0
mcr p15,0,r0,c1,c0,0
bic r0,#0x07
mcr p15,0,r0,c1,c0,0
mov pc,lr

到此,bootloader核心初始化完成。

0 0
原创粉丝点击