reactos操作系统实现(11)

中断机制发明以来,就一直成为 CPU 的主导地位通知机制,因为中断的高效方式,没有其它任何的方式可以取代它的。在 IA-32 CPU 架构里,采用了中断寄存器和中断描述符来判断中断的来源,如下图所示:

ReactOS里使用下面这行代码来设置IDTR寄存器的值:

Ke386SetInterruptDescriptorTable(*(PKDESCRIPTOR)&KiIdtDescriptor.Limit);

 

具体的获取地址如下图所示:






上面这行代码,就把中断描述符表加载到IDTR寄存器,这样就设置好中断表。那么在ReactOS中断表描述符的基地址是多少呢?从上图可以看到它是_KiIdt地址,它是在文件reactos/ntoskrnl/ke/i386/trap.s里,如下所示:

#001  /* GLOBALS *******************************************************************/

#002 

#003  .data

#004  .globl _KiIdt

#005  _KiIdt:

#006  /* This is the Software Interrupt Table that we handle in this file:        */

#007  idt _KiTrap0,          INT_32_DPL0  /* INT 00: Divide Error (#DE)           */

#008  idt _KiTrap1,          INT_32_DPL0  /* INT 01: Debug Exception (#DB)        */

#009  idt _KiTrap2,          INT_32_DPL0  /* INT 02: NMI Interrupt                */

#010  idt _KiTrap3,          INT_32_DPL3  /* INT 03: Breakpoint Exception (#BP)   */

#011  idt _KiTrap4,          INT_32_DPL3  /* INT 04: Overflow Exception (#OF)     */

#012  idt _KiTrap5,          INT_32_DPL0  /* INT 05: BOUND Range Exceeded (#BR)   */

#013  idt _KiTrap6,          INT_32_DPL0  /* INT 06: Invalid Opcode Code (#UD)    */

#014  idt _KiTrap7,          INT_32_DPL0  /* INT 07: Device Not Available (#NM)   */

#015  idt _KiTrap8,          INT_32_DPL0  /* INT 08: Double Fault Exception (#DF) */

#016  idt _KiTrap9,          INT_32_DPL0  /* INT 09: RESERVED                     */

#017  idt _KiTrap10,         INT_32_DPL0  /* INT 0A: Invalid TSS Exception (#TS)  */

#018  idt _KiTrap11,         INT_32_DPL0  /* INT 0B: Segment Not Present (#NP)    */

#019  idt _KiTrap12,         INT_32_DPL0  /* INT 0C: Stack Fault Exception (#SS)  */

#020  idt _KiTrap13,         INT_32_DPL0  /* INT 0D: General Protection (#GP)     */

#021  idt _KiTrap14,         INT_32_DPL0  /* INT 0E: Page-Fault Exception (#PF)   */

#022  idt _KiTrap0F,         INT_32_DPL0  /* INT 0F: RESERVED                     */

#023  idt _KiTrap16,         INT_32_DPL0  /* INT 10: x87 FPU Error (#MF)          */

#024  idt _KiTrap17,         INT_32_DPL0  /* INT 11: Align Check Exception (#AC)  */

#025  idt _KiTrap0F,         INT_32_DPL0  /* INT 12: Machine Check Exception (#MC)*/

#026  idt _KiTrap0F,         INT_32_DPL0  /* INT 13: SIMD FPU Exception (#XF)     */

#027  .rept 22

#028  idt _KiTrap0F,         INT_32_DPL0  /* INT 14-29: UNDEFINED INTERRUPTS      */

#029  .endr

#030  idt _KiGetTickCount,   INT_32_DPL3  /* INT 2A: Get Tick Count Handler       */

#031  idt _KiCallbackReturn, INT_32_DPL3  /* INT 2B: User-Mode Callback Return    */

#032  idt _KiRaiseAssertion, INT_32_DPL3  /* INT 2C: Debug Assertion Handler      */

#033  idt _KiDebugService,   INT_32_DPL3  /* INT 2D: Debug Service Handler        */

#034  idt _KiSystemService,  INT_32_DPL3  /* INT 2E: System Call Service Handler  */

#035  idt _KiTrap0F,         INT_32_DPL0  /* INT 2F: RESERVED                     */

#036  GENERATE_IDT_STUBS                  /* INT 30-FF: UNEXPECTED INTERRUPTS     */

#037 

 

上面就是ReactOS所有中断处理的中断表,每个中断里都处理中断服务函数。这里特别关心的,可能就是KiGetTickCountKiSystemService这两个中断函数了,第一个是硬件的时间片中断服务,第二个是从应用程序到ReactOS系统调用服务,也就是内核提供的API功能入口点,也是应用使用内核提供功能的入口点。

 

通上面这行代码,就可以把中断描述符表设置到CPUIDTR寄存器,实现了ReactOS中断调用初始化,只有这样初始化之后,才能允许打开中断,否则系统运行就出错了。

 

转载于:https://www.cnblogs.com/ajuanabc/archive/2008/12/18/2463897.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
上册共分为10部分,这是第1部分 Windows内核情景分析(上册).part01.rar 基本信息 作者: 毛德操 出版社:电子工业出版社 ISBN:9787121081149 上架时间:2009-5-25 出版日期:2009 年5月 开本:16开 页码:1465 版次:1-1 所属分类:计算机 > 操作系统 > Windows 内容简介回到顶部↑ 本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及部分由微软公开的源代码)作为依据,使读者能深入理解Windows内核的方方面面,也可以使读者的软件开发能力和水平得到提高。. 本书可供大学有关专业的高年级学生和研究生用做教学参考,也可供广大的软件工程师,特别是从事系统软件研发的工程师用于工作参考或用做进修教材。... 目录回到顶部↑ 上 册. 第1章 概述 1 1.1 Windows操作系统发展简史 1 1.2 用户空间和系统空间 3 1.3 Windows内核 4 1.4 开源项目ReactOS及其代码 9 1.5 Windows内核函数的命名 10 第2章 系统调用 12 2.1 内核与系统调用 12 2.2 系统调用的内核入口KiSystemService() 22 2.3 系统调用的函数跳转 29 2.4 系统调用的返回 32 2.5 快速系统调用 35 2.6 从内核中发起系统调用 42 第3章 内存管理 44 3.1 内存区间的动态分配 47 3.1.1 内核对用户空间的管理 48 3.1.2 内核对于物理页面的管理 60 3.1.3 虚存页面的映射 67 3.1.4 Hyperspace的临时映射 78 .3.1.5 系统空间的映射 86 3.1.6 系统调用NtAllocateVirtualMemory() 90 3.2 页面异常 97 3.3 页面的换出 107 3.4 共享映射区(Section) 115 3.5 系统空间的缓冲区管理 133 第4章 对象管理 136 4.1 对象与对象目录 136 4.2 对象类型 148 4.3 句柄和句柄 162 4.4 对象的创建 169 4.5 几个常用的内核函数 179 4.5.1 ObReferenceObjectByHandle() 179 4.5.2 ObReferenceObjectByPointer() 187 4.5.3 ObpLookupEntryDirectory() 188 4.5.4 ObpLookupObjectName() 192 4.5.5 ObOpenObjectByName() 209 4.5.6 ObReferenceObjectByName() 213 4.5.7 ObDereferenceObject() 214 4.6 对象的访问控制 218 4.7 句柄的遗传和继承 218 4.8 系统调用NtDuplicateObject() 223 4.9 系统调用NtClose() 233 第5章 进程与线程 241 5.1 概述 241 5.2 Windows进程的用户空间 253 5.3 系统调用NtCreateProcess() 273 5.4 系统调用NtCreateThread() 284 5.5 Windows的可执行程序映像 300 5.6 Windows的进程创建和映像装入 305 5.7 Windows DLL的装入和连接 329 5.8 Windows的APC机制 358 5.9 Windows线程的调度和切换 381 5.9.1 x86系统结构与线程切换 382 5.9.2 几个重要的数据结构 385 5.9.3 线程的切换 388 5.9.4 线程的调度 395 5.10 线程和进程的优先级 409 5.11 线程本地存储TLS 421 5.12 进程挂靠 434 5.13 Windows的跨进程操作 442 5.14 Windows线程间的相互作用 450 第6章 进程间通信 467 6.1 概述 467 6.2 共享内存区(Section).. 469 6.3 线程的等待/唤醒机制 470 6.4 信号量(Semaphore) 499 6.5 互斥门(Mutant) 505 6.6 事件(Event) 512 6.7 命名管道(Named Pipe)和信插(Mailslot) 516 6.8 本地过程调用(LPC) 521 6.9 视窗报文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值