一,Linux 异常处理体系结构框架:
1,按键按下时。
强制的跳到异常向量处执行(中断是异常的一种)。
2,CPU 发生中断。
3,“入口函数”是一条跳转指令。跳到某个函数:(作用)
将2440 作为单片机使用时:裸机程序时
②,执行中断处理函数。
③,恢复被中断的现场。
①,保存被中断处的现场(各种寄存器的值)。
LINUX 中处理中断的过程:
1,写程序时先设置异常入口:
发生“中断”时,就跳到0x18
地址处,跳转到“HandleIRQ”是执行下面的指令:
中断处理完后,要返回去继续执行之前被中断的那个程序。
保存寄存器就是保存中断前那个程序的所用到的寄存器。
然后是处理中断,最后是恢复。
菖蒲花
linux 中:民间习俗
异常向量在哪里:
LINUX 异常处理结构、中断处理结构:
2012年2月23日
如画江山
网鸟11:03
①,LINUX的异常向量在哪里:
ARM架构的CPU的异常向量基址可以是 0x0000 0000,也可以是 0xffff0000,LINUX内核
使用后者,只需要在某个寄存器里设置下,就可以将异常基址定位到这里来。这个地址并不代表实际的内存,是虚拟地址。当建立了虚拟地址与物理地址间的映射后,得将那些异常向量,即相当于把那些跳转指令(如:HandleSWI 等)复制拷贝到这个 0xffff0000这个地址处去。(“那些跳转指令”是指head.S中那些跳转)。
这个过程是在trap_init这个函数里做。蝶恋花歌曲原唱
trap_init函数将异常向量复制到0xffff0000处,部分代码如下:
如上:
将 __vectors_start, __vectors_end -__vectors_start 这段代码拷贝到 vectors来。
将 __vectors_start, __vectors_end -__vectors_start 这段代码拷贝到 vectors来。
vectors是“CONFIG_VECTORS_BASE” 是个配置项(内核的配置选项)。
在linux源码顶层目录下:vim .config, 搜索“CONFIG_VECTORS_BASE”。
我的内核配置文件这个地址是“0xffff0002”和书上的不同。
__vectors_start 在 entry-armv.S 中定义,也是些跳转指令。
可见和单片中的一样(都是跳转指令)。
A:假设发生了 vector_und (undefined)异常未定义指令后,会跳转到 vector_und 加一个偏移地址
stubs_offt(b vector_und + stubs_offt)。这个 vector_und 地址标号源代码里没有,它是一个宏:
将这个宏展开:
将这个宏展开:
===========================================vector_stub und, UND_MODE这个宏展开替换下面的语句:
.macro vector_stub, name, mode, correction=0(.macro 开始定义宏)
把宏展开,上面的name就是"und"。则下来替换后,“vector_\name”就成了“vector_und”vector_\name:(变成vector_und: )定义了一个vector_und标号。做的事情如下。
.if \correction因为上面“correction=0”,即这里是:.if 0.所以if...endif 间的代码忽略。
sub lr, lr, #\correction
.endif(这三句因为"correction=0,忽略不要")
@
@ Save r0, lr_<exception> (parent PC) and spsr_<exception>先保存。
@ (parent CPSR)
@
stmia sp, {r0, lr} @ save r0, lr
mrs lr, spsr
str lr, [sp, #8] @ save spsr
@
@ Prepare for SVC32 mode. IRQs remain disabled.转换到管理模式。
@
mrs r0, cpsr
eor r0, r0, #(\mode ^ SVC_MODE)
msr spsr_cxsf, r0
@
@ the branch table must immediately follow this code这里是下一级跳转
@
and lr, lr, #0x0f
桐的意思
mov r0, sp
初遇见ldr lr, [pc, lr, lsl #2]
movs pc, lr @ branch to handler in SVC mode
.endm(.endm 结束宏定义)
抄一篇300字的作文.endm (.endm 结束宏定义)
这里是下一级的跳转,跳转表如下:①,name
是und
.if \correction
sub lr, lr, #\correction
.endif
②,correction=0默认是0,则:
则这三句不用管。
后面 __und_usr等标号中,去保存那些寄存器,作处理。处理完后,再恢复那些寄存器,即恢复那些被中断的程序。
③,下一级跳转表:
B:下面是一个实例:在 entry -armv.S 源码中的第1069行: