c语言interrupt函数,中断处理函数数组interrupt[]初始化

在系统初始化期间,trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是建一张IDT表,让其指向ignore_intr函数),而在这次初始化期间,系统的0~19号中断(用于分NMI和异常的中断向量)均被设置好。与此同时,用于系统调用的0x80号向量也已被设置。

然而,对于外部中断的初始化 却没有在这个函数中进行。而是在函数init_IRQ中。

仔细想一想内核这样做,的确是使代码清晰又有条理。

1)trap_init -----> 内部中断异常和NMI(中断向量号:0~19)

2) init_IRQ   -----> 外部可屏蔽中断  (中断向量号:32~127,129~238)

在init_IRQ函数中,对IDT中断描述符表进行了第三次完善(把相应的外部中断对应的中断向量进行填充)

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 }

上述代码解释:

FIRST_EXTERNAL_VECTOR = 0x16;

设置中断向量号32---NR_IRQS相应的中断处理程序地址为数组interrupt[i]的内容。(除去128号中断向量,已经这个向量号已经被用于系统调用)。

我们看一下interrupt数组的定义:这段程序时用汇编写的。

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]内容呢?

啰嗦了这么半天...

如下一个声明就搞定了。[])(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从中断返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bytevalue_Java Number byteValue()方法与示例

bytevalueNumber类byteValue()方法 (Number Class byteValue() method) byteValue() method is available in java.lang package. byteValue()方法在java.lang包中可用。 byteValue() method is used to return the value denoted by this Number object converted to type byt…

第二章 染色热力学理论单元测验

1,()测定是染色热力学性能研究的基础 吸附等温线。 2,吸附是放热反应,温度升高,亲和力() 减小 3,染色系统中包括() 染料。 染深色介质。 染色助剂。 纤维。 4,下列对状态函数特点叙述正确的为() 状态函数只有在平衡状态的系统中才有确定值。 在非平衡状态的系统…

使用鸢尾花数据集实现一元逻辑回归、多分类问题

目录鸢尾花数据集逻辑回归原理【1】从线性回归到广义线性回归【2】逻辑回归【3】损失函数【4】总结TensorFlow实现一元逻辑回归多分类问题原理独热编码多分类的模型参数损失函数CCETensorFlow实现多分类问题独热编码计算准确率计算交叉熵损失函数使用花瓣长度、花瓣宽度将三种鸢…

开源HTML5应用开发框架 - iio Engine

随着HTML5的发展&#xff0c;越来越多的基于HTML5技术的网页开发框架出现&#xff0c;在今天的这篇文章中&#xff0c;我们将介绍iio Engine&#xff0c;它是一款开源的创建HTML5应用的web框架。整个框架非常的轻量级&#xff0c;只有45kb大小&#xff0c;并且整合了debug系统&…

c语言double root,C语言修仙

root(1)(2/2)AD1AD4林浔合理推测&#xff0c;青城山剑宗&#xff0c;也就是祁云所在的剑修一脉&#xff0c;掌握着一些道修并不知道的传承。譬如——怎样找到赤霄龙雀剑&#xff0c;又或者&#xff0c;怎样使用它。这样一来&#xff0c;青城的守卫阵法没有反应也能解释了&#…

【转】Black Box

Introduction BlackBox是FPGA设计中一个重要的技巧&#xff0c;不过觉得Xilinx的文档没有很好地将它讲清楚。 BlackBox的主要想法就是把设计的某一个子模块单独综合&#xff0c;综合的结果作为一个黑盒子子模块&#xff0c;上层设计不再对这个模块进行优化&#xff0c;只能看到…

Java Compiler disable()方法与示例

编译器类disable()方法 (Compiler Class disable() method) disable() method is available in java.lang package. disable()方法在java.lang包中可用。 disable() method is used to cause the compiler to stop operation. disable()方法用于使编译器停止操作。 disable() m…

【神经网络计算】——神经网络实现鸢尾花分类

本blog为观看MOOC视频与网易云课堂所做的笔记 课堂链接&#xff1a; 人工智能实践:TensorFlow笔记 吴恩达机器学习 疑问与思考 为什么按照batch喂入数据 之前看的视频里面处理数据都是一次性将所有数据喂入&#xff0c;现在看的这个视频对数据进行了分组投入。这是为何&#…

第三章 染色动力学理论单元测试

1,准二级动力学模型认为,染色速率与()的二次方成正比 纤维上未被占满的位置(空位)数量 2,研究染色动力学的意义有() 了解染料走向平衡的速率。 初染速率。 匀染性。 3,求出染料的扩散系数的意义有() 了解各因素对扩散系数的影响。 求出不同温度下的扩散系数,计算…

CDOJ--1668

原题链接&#xff1a;http://acm.uestc.edu.cn/problem.php?pid1668 由于题目意思指的是将分数拆分成不同的单位分数之和&#xff0c;所以就不用考虑将2/3拆成1/31/3这种情况了&#xff1b;又由于好的拆分要求项数即len要少&#xff0c;最小的项要大&#xff0c;故可以采用迭代…

c# xaml语言教程,c#学习之30分钟学会XAML

1.狂妄的WPF相对传统的Windows图形编程&#xff0c;需要做很多复杂的工作&#xff0c;引用许多不同的API。例如&#xff1a;WinForm(带控件表单)、GDI(2D图形)、DirectXAPI(3D图形)以及流媒体和流文档等&#xff0c;都需要不同的API来构建应用程序。WPF就是看着上面的操作复杂和…

(Android实战)AsyncTask和Handler两种异步方式实现原理和优缺点比较

1 AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l 简单,快捷 l 过程可控 使用的缺点…

Java Collections list()方法与示例

集合类list()方法 (Collections Class list() method) list() method is available in java.util package. list()方法在java.util包中可用。 list() method is used to return an array list that contains all the elements returned by the given Enumeration and the way o…

第八章 异常

第八章 异常 异常事件可能是错误&#xff08;如试图除以零&#xff09;&#xff0c;也可能是通常不会发生的事情。 Python提供功能强大的替代解决方案——异常处理机制。 异常是什么&#xff1f; Python使用异常对象来表示异常状态&#xff0c;并在遇到错误时引发异常。异常…

hdu 1564 Play a game

对于本题&#xff0c;若要当前的 player 赢&#xff0c;剩下所走的步数必须是奇数步。所以对于每步的 player 所放弃的选择的步数为偶数步。因此&#xff0c;对于整个 game 来说&#xff0c;所放弃的步数 m 为偶数步&#xff0c;设所走的步数为 k &#xff0c;则 n*n-1mk&…

【电设控制与图像训练题】【激光打靶】【opencv测试代码以及效果】

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 规则 激光枪自动射击装置(E题) 【本科组】 一、任务 设计一个能够控制激光枪击发、自动报靶及自动瞄准等功能的电子系统。该…

.NET 小结之内存模型

.NET 小结之内存模型 为什么要解.NET 的内存模型 在.NET下的内存管理、垃圾回收其实大部分不需要我们操心&#xff0c;因为大部分.NET已经帮我们做了&#xff0c;通常情况下也不需要考虑这些。但是如果想要了解一些.NET一些稍微“底层”的原理&#xff0c;如&#xff1a;“装箱…

C ++ STL中的set :: upper_bound()函数

C STL set :: upper_bound()函数 (C STL set::upper_bound() function) set::upper_bound() function is a predefined function, it is used to get the upper bound of any element in a set. set :: upper_bound()函数是预定义的函数&#xff0c;用于获取集合中任何元素的上…

c语言if不能判断u8变量值,C语言变量名命规则.doc

C语言变量名命名规则一、程序风格&#xff1a;???????? 1、严格采用阶梯层次组织程序代码&#xff1a;???????? 各层次缩进的分格采用VC的缺省风格&#xff0c;即每层次缩进为4格&#xff0c;括号位于下一行。??? 要求相匹配的大括号在同一列&#xff0c;对…

【电设控制与图像训练题】【激光打靶】【openmv测试代码以及效果】

9.4加入串口通讯,送出靶心坐标、激光坐标、激光所在环数、方位;加入防误判操作 博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 目录 规则坐标系代码总结相关openmv使用文…