reactos操作系统实现(11)

前端之家收集整理的这篇文章主要介绍了reactos操作系统实现(11)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
中断机制发明以来,就一直成为@H_404_1@ cpu@H_404_1@ 的主导地位通知机制,因为中断的高效方式,没有其它任何的方式可以取代它的。在@H_404_1@ IA-32@H_404_1@ 的@H_404_1@ cpu@H_404_1@ 架构里,采用了中断寄存器和中断描述符来判断中断的来源,如下图所示:@H_404_1@
@H_404_1@
@H_404_1@

在@H_404_1@ReactOS@H_404_1@里使用下面这行代码来设置@H_404_1@IDTR@H_404_1@寄存器的值:@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@


@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 *******************************************************************/ @H_404_1@

#002 @H_404_1@ @H_404_1@

#003 @H_404_1@.data @H_404_1@

#004 @H_404_1@.globl _KiIdt @H_404_1@

#005 @H_404_1@_KiIdt: @H_404_1@

#006 @H_404_1@/* This is the Software Interrupt Table that we handle in this file: @H_404_1@*/ @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@*/ @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@*/ @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@*/ @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@*/ @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@*/ @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@*/ @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@*/ @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@*/ @H_404_1@

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

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

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

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

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

#020 @H_404_1@idt _KiTrap13, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 0D: General Protection (#GP) @H_404_1@*/ @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@*/ @H_404_1@

#022 @H_404_1@idt _KiTrap 0F , @H_404_1@INT_32_DPL0 @H_404_1@/* INT 0F : RESERVED @H_404_1@*/ @H_404_1@

#023 @H_404_1@idt _KiTrap16, @H_404_1@INT_32_DPL0 @H_404_1@/* INT 10: x87 FPU Error (#MF) @H_404_1@*/ @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@*/ @H_404_1@

#025 @H_404_1@idt _KiTrap 0F , @H_404_1@INT_32_DPL0 @H_404_1@/* INT 12: Machine Check Exception (#MC)*/ @H_404_1@

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

#027 @H_404_1@.rept 22 @H_404_1@

#028 @H_404_1@idt _KiTrap 0F , @H_404_1@INT_32_DPL0 @H_404_1@/* INT 14-29: UNDEFINED INTERRUPTS @H_404_1@*/ @H_404_1@

#029 @H_404_1@.endr @H_404_1@

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

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

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

#033 @H_404_1@idt _KiDebugService, @H_404_1@INT_32_DPL3 @H_404_1@/* INT 2D: Debug Service Handler @H_404_1@*/ @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@*/ @H_404_1@

#035 @H_404_1@idt _KiTrap 0F , @H_404_1@INT_32_DPL0 @H_404_1@/* INT 2F : RESERVED @H_404_1@*/ @H_404_1@

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

#037 @H_404_1@ @H_404_1@

@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@

@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@

猜你在找的React相关文章