我理解的windows中断管理
只谈外部中断的windows内核管理,异常和trap不在此文的讨论之列。
1. windows中断总貌
在windows中,物理上的中断源被抽象为KINTERRUPT结构。一个中断源在windows中对应一个KINTERRUPT数组,数组的长度为CPU的个数,如果是单核系统,那么这个数组长度为1。先分析KINTERRUPT结果。
windows存储了IDT(Interrupt Descriptor Table),这张表是一个数组结构,数组的下标是Vector号(此Vector不是PIC/APIC的中断号),数组元素8字节,该Vector中断的入口地址保存在此8字节中。再分析IDT。
PCI设备是共享中断,windows采用KINTERRUPT链表的方式组织共享中断的设备。结合ReactOS源码,说明中断挂接和中断响应的实现过程。
2. KINTERRUPT结构
用windbg可以直接查看KINTERRUPT结构。
nt!_KINTERRUPT
+0x000 Type : Int2B
+0x002 Size : Int2B
+0x004 InterruptListEntry : _LIST_ENTRY // LIST_ENTRY是通用双向链表节点,共享中断的链表
+0x00c ServiceRoutine : Ptr32 unsigned char // 我们的Isr
+0x010 ServiceContext : Ptr32 Void // 暂时不清楚怎么用
+0x014 SpinLock : Uint4B
+0x018 TickCount : Uint4B
+0x01c ActualLock : Ptr32 Uint4B
+0x020 DispatchAddress : Ptr32 void
+0x024 Vector : Uint4B // IDT表的数组下标,0~FF
+0x028 Irql : UChar
+0x029 SynchronizeIrql : UChar
+0x02a FloatingSave : UChar
+0x02b Connected : UChar // 已连接到IDT标志
+0x02c Number : Char
+0x02d ShareVector : UChar // 共享中断标志
+0x030 Mode : _KINTERRUPT_MODE // 本Isr响应中断后,是否由OS继续调用链表的next Isr
+0x034 ServiceCount : Uint4B
+0x038 DispatchCount : Uint4B
+0x03c DispatchCode : [106] Uint4B // 中断响应代码,IDT中登记的入口地址
_LIST_ENTRY:因为内核经常用到双向链表管理内核对象,windows实现了一个通用的双向链表结构_LIST_ENTRY,类似Linux内核的list_header. KINTERRUPT结构内部保存LIST_ENTRY节点,就可以将共享中断的KINTERRUPT链起来。
DispatchCode:是windows的中断响应模板,在调用Isr之前的hook。IDT登记的入口地址其实是DispatchCode的地址,等于KINTERRUPT地址+0x3C. 图1是windbg查看IDT的内容,例如73号Vector挂在了三个设备,入口地址(8208ddd4) 等于链表头结点KINTERRUPT地址(8208dd98)+0x3C.
图1 windbg查看IDT内容
图2 windbg查看KINTERRUPT实例的内容
3. IDT(Interrupt Descriptor Table)中断描述表
参见文章:IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表
4. 中断挂接与响应
在毛德操的《Windows内核情景分析》9.6节中,深入ReactOS的源码,剖析windows系统中断管理的内幕。看原文,请看windows内核情景分析之中断处理(毛德操)。
我理解的windows中断管理的更多相关文章
- Windows内存管理[转]
本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...
- STM32-NVIC中断管理实现[直接操作寄存器]
源:stm32 NVIC中断管理实现[直接操作寄存器] cortex-m3支持256个中端,其中包含了16个内核中断,240个外部中断.stm32只有84个中断,包括16个内核中断和68个可屏 ...
- Linux中断管理 (1)Linux中断管理机制
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- Linux中断管理 (2)软中断和tasklet
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- Linux中断管理 (3)workqueue工作队列
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...
- Linux中断管理 (3)workqueue工作队列【转】
转自:https://www.cnblogs.com/arnoldlu/p/8659988.html 目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机 ...
- Linux中断管理 (1)Linux中断管理机制【转】
转自:https://www.cnblogs.com/arnoldlu/p/8659981.html 目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机 ...
- 全面介绍Windows内存管理机制及C++内存分配实例
转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...
随机推荐
- Python 【格式化字符串】
print('血量:'+str(player_life)+' 攻击:'+str(player_attack)) 第一种格式化字符串 print('血量:%s 攻击:%s' % (player_life ...
- Python3 + selenium + Chrome浏览器(webdriver.Chrome()报错)
Python3 + selenium + Chrome浏览器 Error: selenium.common.exceptions.WebDriverException: Message: 'chrom ...
- 第十一章 ZYNQ-MIZ702 DDR3 PS读写操作方案
本编文章的目的主要用简明的方法在纯PS里对DDR3进行读写. 本文所使用的开发板是Miz702 PC 开发环境版本:Vivado 2015.4 Xilinx SDK 2015.4 11.0本章难度 ...
- C# 读取本地图片
/// <summary> /// 通过FileStream 来打开文件,这样就可以实现不锁定Image文件,到时可以让多用户同时访问Image文件 /// </summary> ...
- DVA-subscriptions
import { routerRedux } from 'dva/router' export default { namespace: 'notice', state: { notices:[], ...
- DX使用随笔--NavBarControl
1. Item图标大小显示 需要先设置此Item所在Group的属性GroupStyle的值为LargeImageText.
- Spring源码解析 - springMVC核心代码
一.首先来讲解下springMVC的底层工作流程 1.首先我们重点放在前端控制器(DispatcherServlet) 其类图: 因为从流程图看,用户的请求最先到达就是DispatcherServle ...
- shiro系列一、认识shiro
Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...
- 【Day2】4.第三方模块的安装与使用
课程目标 1. 使用模块 2. 安装第三方模块 使用模块 • 一个.Py文件称之为一个模块(Module) • 好处: 1. 便于代码维护,把很多函数放到不同文件,一个.py文件 的 代码数量少 2. ...
- What is libacl.so.1 ?
Google says, "This package contains the libacl.so dynamic library which contains the POSIX 1003 ...