设置异常向量表
2015-08-25 19:03
274 查看
异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。
ARM处理器支持的异常类型为:
由图可知,ARM处理器支持7种异常类型,分别是重新启动,未定义指令,软中断,预取异常,数据异常,中断,快速中断。
异常向量:当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量。根据上表,可以知道,当发生reset异常时,处理器会跳转到0x00000000这个地址,执行该地址的指令。从图中可以看出,每个异常类型对应有两个地址,普通地址和高位地址。一般情况下,发生异常时处理器会跳转到普通地址执行指令,但也可以通过配置协处理器CP15来使处理器跳转到高位地址。
异常向量表:
下面列出设置异常向量表的代码start.S,以及链接脚本gboot.lds,以及makefile(针对芯片2440)
start.S:
链接脚本gboot.lds:
makefile:
对于2440和6410,有这几个文件已经足够了,但对于210芯片,还需要给BL1添加头信息。
210芯片的BL1前都要添加一个16byte的头信息,这是由一开始就固化在iROM的BL0决定的。iROM的BL0会将BL1拷贝到iRAM,在拷贝完成后BL0会进行一个校验,它会对BL1进行计算,算出一个校验码,并且与BL1中头信息中的校验码进行比对,如果比对成功则表示拷贝成功,BL1才能运行。
ARM处理器支持的异常类型为:
由图可知,ARM处理器支持7种异常类型,分别是重新启动,未定义指令,软中断,预取异常,数据异常,中断,快速中断。
异常向量:当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量。根据上表,可以知道,当发生reset异常时,处理器会跳转到0x00000000这个地址,执行该地址的指令。从图中可以看出,每个异常类型对应有两个地址,普通地址和高位地址。一般情况下,发生异常时处理器会跳转到普通地址执行指令,但也可以通过配置协处理器CP15来使处理器跳转到高位地址。
异常向量表:
下面列出设置异常向量表的代码start.S,以及链接脚本gboot.lds,以及makefile(针对芯片2440)
start.S:
.text .global _start _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 undefined_instruction: nop software_interrupt: nop prefetch_abort: nop data_abort: nop not_used: nop irq: nop fiq: nop reset: nop
链接脚本gboot.lds:
OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x30008000; . = ALIGN(4); .text : { start.o (.text) *(.text) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); bss_start = .; .bss : { *(.bss) } bss_end = .; }
makefile:
all: start.o arm-linux-ld -Tgboot.lds -o gboot.elf $^ arm-linux-objcopy -O binary gboot.elf gboot.bin %.o : %.S arm-linux-gcc -g -c $^ %.o : %.c arm-linux-gcc -g -c $^ .PHONY: clean clean: rm *.o *.elf *.bin
对于2440和6410,有这几个文件已经足够了,但对于210芯片,还需要给BL1添加头信息。
210芯片的BL1前都要添加一个16byte的头信息,这是由一开始就固化在iROM的BL0决定的。iROM的BL0会将BL1拷贝到iRAM,在拷贝完成后BL0会进行一个校验,它会对BL1进行计算,算出一个校验码,并且与BL1中头信息中的校验码进行比对,如果比对成功则表示拷贝成功,BL1才能运行。
相关文章推荐
- Java输入输出流的使用详细介绍
- 26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL
- 链接MapReduce作业http://user.qzone.qq.com/1178772762/blog/1440417746
- HDOJ1150(最小点集覆盖)
- hdoj 1143 Tri Tiling 【递推】
- 一次被黑追凶(未完待续)
- POJ2503词典 Babelfish在外文中查找对应的英文
- change Java on Ubuntu Kylin 15.04
- 子父类中构造函数的特点
- 堆排序2.0
- jquery声明
- C语言常用的小代码
- 写个脚本列出neutron的ovs的topology。
- 黑马程序员—— Java 基础 面向对象之继承 (复习)
- git missing change
- 菜鸟进阶Android Touch事件传递(四)
- ArcEngine下一个TIN生成的轮廓
- 从0到100——知乎架构变迁史
- Oracle的常见问题
- mapreduce读取hbase中表的数据,直接打印或者回传数据到hbase数据库表