只谈外部中断的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中断管理的更多相关文章

  1. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  2. STM32-NVIC中断管理实现[直接操作寄存器]

    源:stm32 NVIC中断管理实现[直接操作寄存器]     cortex-m3支持256个中端,其中包含了16个内核中断,240个外部中断.stm32只有84个中断,包括16个内核中断和68个可屏 ...

  3. Linux中断管理 (1)Linux中断管理机制

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  4. Linux中断管理 (2)软中断和tasklet

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  5. Linux中断管理 (3)workqueue工作队列

    目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...

  6. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  7. Linux中断管理 (3)workqueue工作队列【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8659988.html 目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机 ...

  8. Linux中断管理 (1)Linux中断管理机制【转】

    转自:https://www.cnblogs.com/arnoldlu/p/8659981.html 目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机 ...

  9. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

随机推荐

  1. Centos7下永久修改mysql5.6最大连接数

    由于解除系统限制,设置最大连接数时,量力而行.https://blog.csdn.net/five3/article/details/79671317

  2. 嵌入式linux第一阶段笔记

    1.虚拟网络编辑器(vm):三种模式:(VMnet0)桥接模式(vm和windows公用同个网络(同个物理端口)),(VMnet1)仅主机模式,(VMnet8)NAT模式(vm连接一个虚拟的路由(WA ...

  3. WEB监控系列第三篇:graphite指南

    一  使用说明 以下是喂数据的方式,但是在实际使用中我们使用statsd来喂数据,请参考我的第四篇文章:statsd指南 喂数据有三种方式: There are three main methods ...

  4. 怎样修改 VS Code 主题?

    方法1. 点击左上角 File > Preferences > Color Theme. 方法2. 使用快捷键: Ctrl + K , Ctrl + T  PS: 查询各种操作的快捷键可以 ...

  5. 微信小程序实现折叠面板

    wxml: <view class='help'> <view class='help_item'> <view class='title' data-index='1' ...

  6. java获取类的3种方式

    1.Class.forName("全类名"):将字节吗文件加载进内存,返回Class对象,多用于配指文件,将类名定义在配置文件中,便于利用java的反射机制生成类对象,加载类. / ...

  7. C#/.net中出现 "GDI+中发生一般性错误"解决方案

    有时我们在读取本地图片,调用 Image.Save() 方法,将其另保存为其他格式时,经常会碰到一个错误:“GDI+中发生一般性错误”:一般出现这种错误有 3 种可能: 1.保存路径不存在或者错误: ...

  8. seaborn:一个更强大的画图工具

    数据加载: 1. Countplot 和之前的pandas绘图相比,使用countplot可以自动计算每类的数量. 2. KDE Plot KDE,是"kernel density esti ...

  9. 网页免费转换为可编辑的PDF

    Chrome自带的"打印"功能中,另存为PDF 可选择保存选中的内容.如果浏览器/网络出错,不能纠正.(推荐0) https://www.printfriendly.com (有C ...

  10. DDOS 攻击的防范教程--转载自阮一峰的博客

    一个多月前,我的个人网站遭受 DDOS 攻击,下线了50多个小时.这篇文章就来谈谈,如何应对这种攻击. 需要说明的是,我对 DDOS 并不精通,从没想过自己会成为攻击目标.攻击发生以后,很多素昧平生的 ...