驱动-异常处理结构、中断处理结构

更新时间:2023-07-17 16:15:40 阅读: 评论:0

一,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行:

本文发布于:2023-07-17 16:15:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1101611.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   地址   处理   跳转   向量   指令
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图