@H_404_1@
在@H_404_1@ReactOS@H_404_1@里使用下面这行代码来设置@H_404_1@IDTR@H_404_1@寄存器的值:@H_404_1@
Ke386SetInterruptDescriptorTable(*(PKDESCRIPTOR)&KiIdtDescriptor.Limit);
具体的获取地址如下图所示:@H_404_1@
@H_404_1@
@H_404_1@
@H_404_1@
@H_404_1@
@H_404_1@
上面这行代码,就把中断描述符表加载到@H_404_1@IDTR@H_404_1@寄存器,这样就设置好中断表。那么在@H_404_1@ReactOS@H_404_1@中断表描述符的基地址是多少呢?从上图可以看到它是@H_404_1@_KiIdt@H_404_1@地址,它是在文件@H_404_1@reactos/ntoskrnl/ke/i386/trap.s@H_404_1@里,如下所示:@H_404_1@
#001 @H_404_1@/* GLOBALS *******************************************************************/
#004 @H_404_1@.globl _KiIdt
#005 @H_404_1@_KiIdt:
#006 @H_404_1@/* This is the Software Interrupt Table that we handle in this file: @H_404_1@*/
#007 @H_404_1@idt _KiTrap0, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 00: Divide Error (#DE) @H_404_1@*/
#008 @H_404_1@idt _KiTrap1, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 01: Debug Exception (#DB) @H_404_1@*/
#009 @H_404_1@idt _KiTrap2, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 02: NMI Interrupt @H_404_1@*/
#010 @H_404_1@idt _KiTrap3, @H_404_1@INT_32_DPL3 @H_404_1@/* INT 03: Breakpoint Exception (#BP) @H_404_1@*/
#011 @H_404_1@idt _KiTrap4, @H_404_1@INT_32_DPL3 @H_404_1@/* INT 04: Overflow Exception (#OF) @H_404_1@*/
#012 @H_404_1@idt _KiTrap5, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 05: BOUND Range Exceeded (#BR) @H_404_1@*/
#013 @H_404_1@idt _KiTrap6, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 06: Invalid Opcode Code (#UD) @H_404_1@*/
#014 @H_404_1@idt _KiTrap7, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 07: Device Not Available (#NM) @H_404_1@*/
#015 @H_404_1@idt _KiTrap8, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 08: Double Fault Exception (#DF) */
#016 @H_404_1@idt _KiTrap9, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 09: RESERVED @H_404_1@*/
#017 @H_404_1@idt _KiTrap10, @H_404_1@INT_32_DPL0 @H_404_1@/* INT
#018 @H_404_1@idt _KiTrap11, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 0B: Segment Not Present (#NP) @H_404_1@*/
#019 @H_404_1@idt _KiTrap12, @H_404_1@INT_32_DPL0 @H_404_1@/* INT
#020 @H_404_1@idt _KiTrap13, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 0D: General Protection (#GP) @H_404_1@*/
#021 @H_404_1@idt _KiTrap14, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 0E: Page-Fault Exception (#PF) @H_404_1@*/
#022 @H_404_1@idt _KiTrap
#023 @H_404_1@idt _KiTrap16, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 10: x87 FPU Error (#MF) @H_404_1@*/
#024 @H_404_1@idt _KiTrap17, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 11: Align Check Exception (#AC) @H_404_1@*/
#025 @H_404_1@idt _KiTrap
#026 @H_404_1@idt _KiTrap
#027 @H_404_1@.rept 22
#028 @H_404_1@idt _KiTrap
#030 @H_404_1@idt _KiGetTickCount, @H_404_1@INT_32_DPL3 @H_404_1@/* INT
#031 @H_404_1@idt _KiCallbackReturn,INT_32_DPL3 @H_404_1@/* INT 2B: User-Mode Callback Return @H_404_1@*/
#032 @H_404_1@idt _KiRaiseAssertion,INT_32_DPL3 @H_404_1@/* INT
#033 @H_404_1@idt _KiDebugService, @H_404_1@INT_32_DPL3 @H_404_1@/* INT 2D: Debug Service Handler @H_404_1@*/
#034 @H_404_1@idt _KiSystemService, @H_404_1@INT_32_DPL3 @H_404_1@/* INT 2E: System Call Service Handler @H_404_1@*/
#035 @H_404_1@idt _KiTrap
#036 @H_404_1@GENERATE_IDT_STUBS @H_404_1@/* INT 30-FF: UNEXPECTED INTERRUPTS @H_404_1@*/
上面就是@H_404_1@ReactOS@H_404_1@所有中断处理的中断表,每个中断里都处理中断服务函数。这里特别关心的,可能就是@H_404_1@KiGetTickCount@H_404_1@和@H_404_1@KiSystemService@H_404_1@这两个中断函数了,第一个是硬件的时间片中断服务,第二个是从应用程序到@H_404_1@ReactOS@H_404_1@系统调用服务,也就是内核提供的@H_404_1@API@H_404_1@功能入口点,也是应用使用内核提供功能的入口点。@H_404_1@
通上面这行代码,就可以把中断描述符表设置到@H_404_1@cpu@H_404_1@的@H_404_1@IDTR@H_404_1@寄存器,实现了@H_404_1@ReactOS@H_404_1@中断调用初始化,只有这样初始化之后,才能允许打开中断,否则系统运行就出错了。@H_404_1@