reactos操作系统实现(11)

前端之家收集整理的这篇文章主要介绍了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 _KiTrap 0F , 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 _KiTrap 0F , INT_32_DPL0 /* INT 12: Machine Check Exception (#MC)*/

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

#027 .rept 22

#028 idt _KiTrap 0F , 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 _KiTrap 0F , INT_32_DPL0 /* INT 2F : RESERVED */

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

#037

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

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

原文链接:https://www.f2er.com/react/308538.html

猜你在找的React相关文章