中断处理—步骤
来源:互联网 发布:python的matplotlib 编辑:程序博客网 时间:2024/05/24 01:43
一.硬件处理
我们在每条指令完成的时候,控制单元就会检查是否发生了中断。若不发生:继续执行下一条指令;若发生:进行下面的硬件处理:
1.确定中断的向量i。
2.读IDT中的第i项得到向量i的中断描述符。
3.中断描述符结合GDT得到得到中断处理程序的段描述符。
4.进程的CPL与段描述符的DPL比较,若CPL优先级比DPL的优先级高,说明中断的优先级比进程优先级低,产生异常。进程的CPL与中断描述符的DPL比较,若CPL优先级
比DPL的优先级低,说明这个门不是用户进程可以访问的,也产生异常,正常则执行下面步骤。
5.检查CPL是否发生变化(这个其实就是是否是从用户态进入内核态),如果变化,则要切换栈。这个很容易弄清,因为,用户态和内核态用的栈是不一样的。
6.如果发生的是故障,故障要重新执行导致异常的那条指令。所以用那条指令的地址装载cs和eip来执行那条指令。
7.将eflags、cs、和eip的值圧栈。
8.如果异常产生硬件出错码,则也圧栈。
9.用刚才得到的段描述符中的基址和中段描述符中的偏移地址装载cs和eip。这个就可以开始执行相应的处理程序了。
然后进入了中断处理程序,针对中断和异常的处理流程是不同的,下面分开讲述
二.异常处理
1.保存寄存器的值
2.高级C函数处理异常
3.通过ret_from_exception()函数从异常处理程序退出
三.中断处理
1.在内核栈中保存IRQ和寄存器的值
2.给为IRQ服务的PIC发送一个应答,并允许PIC进一步发出中断
3.执行共享这个IRQ的所有设备的中断服务例程
4.调到ret_from_intr()的地址从中断处理程序退出
四.软中断处理
1.通常在硬件中断中将可延迟的处理函数加到专门的数据结构中
2.在合适的时机,调用这些函数
五.中断的退出
1.考虑返回到内核控制路径还是用户态
2.考虑允许抢占来进行调度
3.是否要处理挂起信号等
- 中断处理—步骤
- 中断步骤
- [linux中断]——中断处理
- 面试 —— 中断处理
- Linux——中断处理
- 中断—响应和处理
- 中断和中断处理
- 中断处理--串口中断
- 中断及中断处理
- 中断和中断处理
- 中断和中断处理
- 中断响应时间/中断步骤/中断源
- 中断处理
- 中断处理
- 中断处理
- 中断处理
- 中断处理
- 中断处理
- undefined method `devise' for User(Table doesn't exist):Class解决方法
- x210---uboot第一阶段
- Oracle11本地安装流程
- Python 学习笔记 多进程 multiprocessing
- 怎么样递增的注册成对的点云
- 中断处理—步骤
- uboot主Makefile分析
- C/C++左值&右值
- c++进阶之路
- ClientDataSet初步使用
- poj_1002超时版
- Linux makefile 教程 非常详细,且易懂
- WebService运行原理
- Python编程语言主要应用领域介绍