[fW]中断处理函数数组interrupt[]初始化
分类: LINUX
- 410 for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) {
- 411 int vector = FIRST_EXTERNAL_VECTOR + i;
- 412 if (i >= NR_IRQS)
- 413 break;
- 414 if (vector != SYSCALL_VECTOR)
- 415 set_intr_gate(vector, interrupt[i]);
- 416 }
- 540 .data
- 541 ENTRY(interrupt)
- 542 .text
- 543
- 544 vector=0
- 545 ENTRY(irq_entries_start)
- 546 RING0_INT_FRAME
- 547 .rept NR_IRQS
- 548 ALIGN
- 549 .if vector
- 550 CFI_ADJUST_CFA_OFFSET -4
- 551 .endif
- 552 1: pushl $~(vector)
- 553 CFI_ADJUST_CFA_OFFSET 4
- 554 jmp common_interrupt
- 555 .data
- 556 .long 1b
- 557 .text
- 558 vector=vector+1
- 559 .endr
上面的代码开起来很乱,我们整理一下,使其更加易读,但是又不失其本质。
- .data
- ENTRY(interrupt)
- .long 1b //注意 如果把数据段放在这里那么1b要改为1f了,而且失去循环执行NR_IRQS次的功能。
//我们只能人为的把他们想象成被循环执行了NR_IRQS次 :)
- .text
- vector=0
- ENTRY(irq_entries_start)
- .rept NR_IRQS
- 1: pushl $~(vector)
- jmp common_interrupt
- vector=vector+1
我们把数据段放在一起,代码段放在一起。注意这里的代码段是用来初始化数据段的。
我们看到:interrupt作为一个内存标签,其内容为代码段标号1所表示的地址。同时我们也注意到这个interrupt数组的所有项的内容都是一样的:全部为“标号1”的符号地址。
每次外部中断来临时,硬件自动根据PIC或者APIC送出来的中断类型码(中断向量号)去查找中断描述符表的相应项,然后得到interrupt[n]的内容,继而转去执行标号1地址的代码,而标号1的代码仅将中断号取反后压入栈中,后立马跳到common_interupt标号处去执行。至于为什么要把中断向量号取反后压栈,则是由于内核用正的相应号去表示系统调用号,用负号来表示中断号。
细心的你有可能发现了一个问题:上述代码片段只是向interrupt表示的内存地址处存入大量重复的4字节数据,却没有象C语言定义数组那样定义interrupt[NR_IRQS-1],那么set_intr_gate这样的函数是如何确切的指导interrupt是一个数组呢,而且数组的内容是函数指针?
例如:set_intr_gate(vector,interrupt[i]);是如何取interrupt[i]内容呢?
啰嗦了这么半天...
如下一个声明就搞定了。
extern void (*interrupt[NR_IRQS])(void);//函数指针数组
- 566 common_interrupt:
- 567 SAVE_ALL
- 568 TRACE_IRQS_OFF
- 569 movl %esp,%eax
- 570 call do_IRQ
- 571 jmp ret_from_intr
- 572 CFI_ENDPROC
common_interrupt首先执行宏SAVE_ALL保存中断处理程序可能用到的寄存器(注意:cs eip ss esp由硬件自动保存)然后把栈顶指针传给eax寄存器后(eax寄存器内容将作为do_IRQ函数的参数)调用do_IRQ进行中断处理,返回后
执行ret_from_intr从中断返回。
[fW]中断处理函数数组interrupt[]初始化的更多相关文章
- C函数数组元素初始化
初始化时,可随意指定初始化的元素或者元素的范围. 附gnu c 手册. http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html 代码: t ...
- [fw]LINUX中断描述符初始化
LINUX中断描述符初始化 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univer ...
- 关于数组的初始化memset函数
关于数组的初始化memset函数 其实memset复制时按bit8个8个的赋值,有兴趣的可以自己百度.
- 裸板中中断异常处理,linux中断异常处理 ,linux系统中断处理的API,中断处理函数的要求,内核中登记底半部的方式
1.linux系统中的中断处理 1.0裸板中中断异常是如何处理的? 以s5p6818+按键为例 1)按键中断的触发 中断源级配置 管脚功 ...
- bootloader启动代码init.s解析----IRQ中断处理函数
bootloader启动代码init.s解析----IRQ中断处理函数 init.s源代码如下: ;///////////////////////////////////////////// ;opt ...
- 痞子衡嵌入式:以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是以i.MXRT的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程. 在痞子衡旧文 <串口(UART)自动波特率识 ...
- Linux驱动实践:中断处理函数如何【发送信号】给应用层?
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- 【转】中断处理函数中不用disable_irq而用disable_irq_nosync原因
原文网址:http://blog.csdn.net/skyflying2012/article/details/8265869 今天在写触摸屏驱动时在中断处理函数中使用disable_irq关中断发现 ...
- -1-1 java 基础语法 java关键字 java 注释 常量 语句 运算符 函数 数组定义
Java语言基础组成 关键字 标识符 注释 常量和变量 运算符 语句 函数 数组 关键字 定义:被Java语言赋予了特殊含义的单词 特点:关键字中所有字母都为小写 用于定义数据类型的关键字 class ...
随机推荐
- JVM(13)之 阶段回顾
开发十年,就只剩下这套架构体系了! >>> 各位小伙伴,到上一篇博文为止,我们的内存模型相关知识就已经讲完了!讲!完!了!不知道大家吸收了多少,这里我们简单的来回顾一下吧! ...
- post请求中的参数形式和form-data提交数据时取不到的问题
@Controller页面form表单请求时不会丢数据返回json数据时需要加 注解@ResponseBody请求格式如下 @ResponseBody public Object login(Sign ...
- R语言子集
取子集方法 x[]:适用于所有r语言 x[[ ]]:适用于list或者data.frame中提取元素 x$:使用元素名做索引,提取list或者data.frame中的某个元素 注意,取出的子集数据类型 ...
- shell判断/bin目录下date文件是否存在
- vue不是内部或外部命令的解决方法
1.在nodejs的安装目录下,找到vue.cmd,将此路径加到环境变量中,我是通过nvm管理node版本的,路径是C:\Users\hy\AppData\Roaming\nvm\v6.10.0,关闭 ...
- Word里的红色、绿色和蓝色波浪线
有时候我们写完文章会发现,有的地方有红色波浪线,有的地方有绿色/蓝色二重线,那么这两种线各代表什么意思呢?其实红色波浪线代表此处存在拼写错误,绿色/蓝色波浪线代表此处可能有语法错误.如果你不希望Wor ...
- 使用jstack排查线程问题
以一个例子来演示排查服务器cpu占用率过高的问题. 准备 将下面的代码文件上传到服务器上,然后使用javac编译,并使用java命令将程序跑起来. public class JStackCase { ...
- jmeter 参数化2_CSV Data Set Config
CSV Data Set Config:适用于参数取值范围较大的时候使用,该方法具有更大的灵活性 操作路径:HTTP取样器-->Add-->Config Element-->CSV ...
- java ajax返回 Json 的 几种方式
原文:https://blog.csdn.net/qq_26289533/article/details/78749057 方式 1. : 自写代码转 Json 需要 HttpHttpServlet ...
- STM32 通用定时器好文章收藏
https://blog.csdn.net/fengshuiyue/article/details/79150724 单片机入门学习十三 STM32单片机学习十 通用定时器 里面写的挺不错,图文并茂, ...