<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Interrupt_Descriptor_Table</id>
	<title>Interrupt Descriptor Table - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=Interrupt_Descriptor_Table"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Interrupt_Descriptor_Table&amp;action=history"/>
	<updated>2026-04-06T21:36:22Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=Interrupt_Descriptor_Table&amp;diff=881&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“'''中断描述符表'''('''IDT-Interrupt Descriptor Table''')是特定于IA-32和x86-64体系结构的二进制数据结构。 它是实模式里中断向量表(IVT)的保护模式和长模式对应物，用以告诉CPU中断服务例程 (ISR-Interrupt Service Routines) 所在的位置 (一个中断向量代表一个例程)。 它在结构上类似于G…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=Interrupt_Descriptor_Table&amp;diff=881&amp;oldid=prev"/>
		<updated>2022-03-16T02:13:47Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;#039;&amp;#039;&amp;#039;中断描述符表&amp;#039;&amp;#039;&amp;#039;(&amp;#039;&amp;#039;&amp;#039;IDT-Interrupt Descriptor Table&amp;#039;&amp;#039;&amp;#039;)是特定于&lt;a href=&quot;/index.php?title=IA32_Architecture_Family&quot; title=&quot;IA32 Architecture Family&quot;&gt;IA-32&lt;/a&gt;和&lt;a href=&quot;/index.php?title=X86-64&quot; title=&quot;X86-64&quot;&gt;x86-64&lt;/a&gt;体系结构的二进制数据结构。 它是&lt;a href=&quot;/index.php?title=Real_Mode&quot; title=&quot;Real Mode&quot;&gt;实模式&lt;/a&gt;里中断向量表(&lt;a href=&quot;/index.php?title=IVT&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;IVT（页面不存在）&quot;&gt;IVT&lt;/a&gt;)的&lt;a href=&quot;/index.php?title=Protected_Mode&quot; title=&quot;Protected Mode&quot;&gt;保护模式&lt;/a&gt;和长模式对应物，用以告诉CPU&lt;a href=&quot;/index.php?title=Interrupt_Service_Routines&quot; title=&quot;Interrupt Service Routines&quot;&gt;中断服务例程&lt;/a&gt; (ISR-Interrupt Service Routines) 所在的位置 (一个中断向量代表一个例程)。 它在结构上类似于G…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''中断描述符表'''('''IDT-Interrupt Descriptor Table''')是特定于[[IA32_Architecture_Family|IA-32]]和[[X86-64|x86-64]]体系结构的二进制数据结构。 它是[[Real Mode|实模式]]里中断向量表([[IVT]])的[[Protected Mode|保护模式]]和长模式对应物，用以告诉CPU[[Interrupt Service Routines|中断服务例程]] (ISR-Interrupt Service Routines) 所在的位置 (一个中断向量代表一个例程)。 它在结构上类似于[[Global Descriptor Table|全局描述符表-GDT]]。&lt;br /&gt;
&lt;br /&gt;
IDT条目被称为门(gate)。 它可以包含中断门、任务门和陷阱门。&lt;br /&gt;
&lt;br /&gt;
在实现IDT之前，请确保你有一个有效的GDT。&lt;br /&gt;
&lt;br /&gt;
== IDTR ==&lt;br /&gt;
&lt;br /&gt;
'''IDT'''的位置保存在'''IDTR'''（'''IDT Register'''寄存器）中。 这是使用'''LIDT'''汇编指令加载的，该指令的参数为'''IDTR'''：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+IDT Descriptor (IDTR):&lt;br /&gt;
!style=&amp;quot;width: 66%; text-align: left;&amp;quot; |79 (64-bit Mode)&amp;lt;br&amp;gt;48 (32-bit Mode)&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;16&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 34%; text-align: left; vertical-align: bottom;&amp;quot; |15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Offset'''&amp;lt;br&amp;gt;63 (64-bit Mode)&amp;lt;br&amp;gt;31 (32-bit Mode)&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|'''Size'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Size''': 比“IDT”的大小（字节）小一。&lt;br /&gt;
* '''Offset''': '''Interrupt Descriptor Table(中断描述符表)'''的线性地址(不是物理地址，应用分页)。&lt;br /&gt;
&lt;br /&gt;
请注意，'''LIDT'''加载的数据量在32位和64位模式下有所不同，'''Offset'''在32位模式下为4字节长，在64位模式下为8字节长。&lt;br /&gt;
&lt;br /&gt;
这与'''[[GDT]]'''类似，只是：&lt;br /&gt;
* 第一个条目(偏移量为零)可用于'''IDT'''。（译者注：GDT的第一个条目为空无用条目）&lt;br /&gt;
* 有256个中断向量 (0..255)，因此 '''IDT'''应该具有256个条目，每个条目对应于特定的中断向量。&lt;br /&gt;
* 虽然'''IDT'''可以包含256个以上的条目，但它们会被忽略。&lt;br /&gt;
* 虽然'''IDT'''可以包含少于256个条目，但任何不存在的条目(由于此或其他原因)将在尝试访问它们时生成一个'''[[Exceptions#General Protection Fault|一般保护异常（General Protection Fault）]]'''。 理想情况下，'''IDT''' 应该包含足够的条目，以便可以处理此故障 (它本身是一个中断向量)。&lt;br /&gt;
&lt;br /&gt;
有关更多信息，请参阅《英特尔软件开发人员手册》第3-A卷的'''Section 2.4.3: IDTR Interrupt Descriptor Table Register'''和'''Figure 2-6: Memory Management Registers'''。&lt;br /&gt;
&lt;br /&gt;
==IA-32上的结构==&lt;br /&gt;
&lt;br /&gt;
=== 表 Table ===&lt;br /&gt;
&lt;br /&gt;
在32位处理器上，'''IDT''' 中的条目长度为8个字节，并形成如下表:&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Interrupt Descriptor Table (32-bit)&lt;br /&gt;
! 地址 !! 内容&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 0 || Entry 0&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 8 || Entry 1&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 16 || Entry 2&lt;br /&gt;
|- style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
| '''...''' || '''...'''&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 2040 || Entry 255&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
给定'''中断向量'''的对应项在内存中被指向，方法是将向量缩放8，并将其添加到'''IDTR'''的'''Offset'''字段中的值。&lt;br /&gt;
&lt;br /&gt;
=== 门描述符（Gate Descriptor） ===&lt;br /&gt;
&lt;br /&gt;
表中的每个条目都有一个复杂的结构:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Gate Descriptor (32-bit):&lt;br /&gt;
!style=&amp;quot;width: 50%; text-align: left;&amp;quot;|63&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;48&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 3.125%&amp;quot;|47&lt;br /&gt;
!style=&amp;quot;width: 6.25%; text-align: left;&amp;quot;|46&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;45&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 3.125%&amp;quot;|44&lt;br /&gt;
!style=&amp;quot;width: 12.5%; text-align: left;&amp;quot;|43&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;40&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 25%; text-align: left;&amp;quot;|39&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Offset'''&amp;lt;br&amp;gt;31&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;16&amp;lt;/span&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align: center; vertical-align: top;&amp;quot;|'''P'''&lt;br /&gt;
|'''DPL'''&amp;lt;br&amp;gt;1&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align: center; vertical-align: top;&amp;quot;|0&lt;br /&gt;
|'''Gate Type'''&amp;lt;br&amp;gt;3&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|Reserved&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;text-align: left;&amp;quot; |31&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;16&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;text-align: left;&amp;quot; colspan=&amp;quot;5&amp;quot; |15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Segment Selector'''&amp;lt;br&amp;gt;15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|colspan=&amp;quot;5&amp;quot; |'''Offset'''&amp;lt;br&amp;gt;15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Offset:'''一个32位的值，分为两部分。它表示'''[[Interrupt Service Routines|中断服务例程]]'''入口点的地址。&lt;br /&gt;
* '''Selector:''' '''[[Segment Selector|段选择器]]'''具有多个字段，这些字段必须指向'''[[GDT]]'''中的有效代码段。&lt;br /&gt;
* '''Gate Type:''' 一个4位值，它定义了此'''中断描述符'''的门类型。有五个有效的类型值:&lt;br /&gt;
** '''0b0101''' or '''0x5''': 任务门(Task Gate)，请注意，在这种情况下，'''Offset''' 值未使用，应设置为零。&lt;br /&gt;
** '''0b0110''' or '''0x6''': 16位中断门&lt;br /&gt;
** '''0b0111''' or '''0x7''': 16位陷阱门&lt;br /&gt;
** '''0b1110''' or '''0xE''': 32位中断门&lt;br /&gt;
** '''0b1111''' or '''0xF''': 32位陷阱门&lt;br /&gt;
* '''DPL:''' 一个2位值，用于定义'''[[Security#Rings|CPU特权级别]]'''，允许通过'''INT'''指令访问此中断。 硬件中断会忽略此机制。&lt;br /&gt;
* '''P:''' Present位。必须设置('''1''')才能使描述符有效。&lt;br /&gt;
&lt;br /&gt;
有关更多信息，请参阅《英特尔软件开发人员手册》 (第3-A卷) 的 '''Section 6.11: IDT Descriptors''' 和 '''Figure 6-2: IDT Gate Descriptors'''。&lt;br /&gt;
&lt;br /&gt;
=== 示例代码 ===&lt;br /&gt;
&lt;br /&gt;
C结构体：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct InterruptDescriptor32 {&lt;br /&gt;
   uint16_t offset_1;        // offset bits 0..15&lt;br /&gt;
   uint16_t selector;        // a code segment selector in GDT or LDT&lt;br /&gt;
   uint8_t  zero;            // unused, set to 0&lt;br /&gt;
   uint8_t  type_attributes; // gate type, dpl, and p fields&lt;br /&gt;
   uint16_t offset_2;        // offset bits 16..31&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
人们可能会使用的示例 ''type_attributes'' 值(假设DPL为0):&lt;br /&gt;
* 32-bit '''Interrupt Gate: 0x8E''' (p=1, dpl=0b00, type=0b1110 =&amp;gt; type_attributes=0b1000_1110='''0x8E''')&lt;br /&gt;
* 32-bit '''Trap Gate: 0x8F''' (p=1, dpl=0b00, type=0b1111 =&amp;gt; type_attributes=1000_1111b='''0x8F''')&lt;br /&gt;
* '''Task Gate: 0x85''' (p=1, dpl=0b00, type=0b0101 =&amp;gt; type_attributes=0b1000_0101='''0x85''')&lt;br /&gt;
&lt;br /&gt;
==x86-64上的结构==&lt;br /&gt;
&lt;br /&gt;
=== 表 Table===&lt;br /&gt;
&lt;br /&gt;
在64位处理器上，'''IDT'''中的条目为16字节长，形成如下表格：&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Interrupt Descriptor Table (64-bit)&lt;br /&gt;
! Address !! Content&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 0 || Entry 0&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 16 || Entry 1&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 32 || Entry 2&lt;br /&gt;
|- style=&amp;quot;text-align: center;&amp;quot;&lt;br /&gt;
| '''...''' || '''...'''&lt;br /&gt;
|-&lt;br /&gt;
| IDTR Offset + 4080 || Entry 255&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
通过将给定的'''中断向量'''缩放16，并将其添加到'''IDTR'''的'''Offset'''字段中的值，可以在内存中指向该'''中断向量'''的相应条目。&lt;br /&gt;
&lt;br /&gt;
=== 门描述符（Gate Descriptor）===&lt;br /&gt;
&lt;br /&gt;
表中的每个条目都有一个复杂的结构:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Gate Descriptor (64-bit):&lt;br /&gt;
!colspan=&amp;quot;7&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|127&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;96&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;7&amp;quot; |Reserved&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;7&amp;quot; style=&amp;quot;text-align: left;&amp;quot;|95&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;64&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|colspan=&amp;quot;7&amp;quot; |'''Offset'''&amp;lt;br&amp;gt;63&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;width: 50%; text-align: left;&amp;quot;|63&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;48&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 3.125%&amp;quot;|47&lt;br /&gt;
!style=&amp;quot;width: 6.25%; text-align: left;&amp;quot;|46&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;45&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 3.125%&amp;quot;|44&lt;br /&gt;
!style=&amp;quot;width: 12.5%; text-align: left;&amp;quot;|43&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;40&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 15.625%; text-align: left;&amp;quot;|39&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;35&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;width: 9.375%; text-align: left;&amp;quot;|34&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;32&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Offset'''&amp;lt;br&amp;gt;31&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;16&amp;lt;/span&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align: center; vertical-align: top;&amp;quot;|'''P'''&lt;br /&gt;
|'''DPL'''&amp;lt;br&amp;gt;1&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|style=&amp;quot;text-align: center; vertical-align: top;&amp;quot;|0&lt;br /&gt;
|'''Gate Type'''&amp;lt;br&amp;gt;3&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot;|Reserved&lt;br /&gt;
|'''IST'''&amp;lt;br&amp;gt;2&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!style=&amp;quot;text-align: left;&amp;quot; |31&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;16&amp;lt;/span&amp;gt;&lt;br /&gt;
!style=&amp;quot;text-align: left;&amp;quot; colspan=&amp;quot;6&amp;quot; |15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|'''Segment Selector'''&amp;lt;br&amp;gt;15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|colspan=&amp;quot;6&amp;quot; |'''Offset'''&amp;lt;br&amp;gt;15&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;span style=&amp;quot;float: right;&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* '''Offset:'''一个64位的值，分为三部分。 它表示'''[[Interrupt Service Routines|中断服务例程]]'''入口点的地址。&lt;br /&gt;
* '''Selector:''' 一个 '''[[Segment Selector|段选择器]]'''，具有多个字段，这些字段必须指向你的 '''[[GDT]]''' 中的有效代码段。&lt;br /&gt;
* '''IST:''' 一个3位值，它是'''Interrupt Stack Table'''的偏移量，存储在'''[[Task State Segment]]'''中。 如果所有位都设置为零，则不使用'''Interrupt Stack Table'''。&lt;br /&gt;
* '''Gate Type:''' 一个4位值，它定义了此 '''Interrupt Descriptor''' 代表的门的类型。 在长模式下，有两个有效的类型值：&lt;br /&gt;
** '''0b1110'''或 '''0xE'''：64位中断门&lt;br /&gt;
** '''0b1111''' 或 '''0xF''': 64位陷阱门&lt;br /&gt;
* '''DPL：''' 2位值，定义允许通过'''INT'''指令访问此中断的'''[[Security#Rings|CPU特权级别]]'''。 硬件中断忽略了这种机制。&lt;br /&gt;
* '''P:''' Present 位 必须设置 ('''1''')，描述符才有效。&lt;br /&gt;
&lt;br /&gt;
在你的'''[[Interrupt Service Routines|中断服务例程]]'''中，请记住使用'''IRETQ'''指令而不是'''IRET'''指令从中断返回，因为汇编器不会为你转换该指令。 论坛上许多与64位IDT相关的问题都是由缺少 'Q' 引起的。 别让这种事发生在你身上。&lt;br /&gt;
&lt;br /&gt;
有关详细信息，请参阅《英特尔软件开发人员手册》第3-A卷的'''Section 6.14.1: 64-Bit Mode IDT'''和'''Figure 6-8: 64-Bit IDT Gate Descriptors'''。&lt;br /&gt;
&lt;br /&gt;
=== 示例代码 ===&lt;br /&gt;
&lt;br /&gt;
C结构体：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct InterruptDescriptor64 {&lt;br /&gt;
   uint16_t offset_1;        // offset bits 0..15&lt;br /&gt;
   uint16_t selector;        // a code segment selector in GDT or LDT&lt;br /&gt;
   uint8_t  ist;             // bits 0..2 holds Interrupt Stack Table offset, rest of bits zero.&lt;br /&gt;
   uint8_t  type_attributes; // gate type, dpl, and p fields&lt;br /&gt;
   uint16_t offset_2;        // offset bits 16..31&lt;br /&gt;
   uint32_t offset_3;        // offset bits 32..63&lt;br /&gt;
   uint32_t zero;            // reserved&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
人们可能会使用的示例 ''type_tributes''值(假设DPL为0)：&lt;br /&gt;
* 64-bit '''Interrupt Gate: 0x8E''' (p=1, dpl=0b00, type=0b1110 =&amp;gt; type_attributes=0b1000_1110='''0x8E''')&lt;br /&gt;
* 64-bit '''Trap Gate: 0x8F''' (p=1, dpl=0b00, type=0b1111 =&amp;gt; type_attributes=1000_1111b='''0x8F''')&lt;br /&gt;
&lt;br /&gt;
== 门类型 ==&lt;br /&gt;
&lt;br /&gt;
基本上有两种中断： 当代码执行由于错误代码而遇到'''[[Exception|Exception]]'''时发生的事件，或者处理与当前正在执行的代码无关的事件时发生的事件。 在第一种情况下，有必要保存'''当前'''执行指令的地址，以便可以重试，这些称为 “陷阱（Traps）”。 在第二种情况下，保存''下一条''指令的地址是必要的，这样就可以在中断的地方继续执行。 这可能是由IRQ或其他硬件事件或使用'''INT'''指令引起的。 需要注意的另一个区别是，使用'''Traps'''时，在服务例程期间可能会发生新的中断， 但当CPU为IRQ提供服务时，进一步的中断会被屏蔽，直到发出“中断结束（End of Interrupt）”信号。 如何处理某个中断取决于你在IDT条目中放置的门的类型。&lt;br /&gt;
&lt;br /&gt;
=== 中断门（Interrupt Gate） ===&lt;br /&gt;
&lt;br /&gt;
'''中断门'''用于指定一个'''[[Interrupt Service Routines|中断服务例程]]'''。 例如，当在保护模式下运行时执行汇编指令'''INT 50'''时，CPU将查找'''IDT'''中的第50个条目(位于50*8)。 然后加载中断门的 '''选择器（Selector）'''; 和 '''偏移（Offset）'''值。 '''选择器（Selector）'''和'''偏移量（Offset）'''用于调用'''中断服务例程'''。 当执行'''IRET'''指令时，CPU从中断返回。 如果CPU以32位模式运行，并且指定的选择器是16位门，则在调用'''ISR'''后，CPU将进入16位'''受保护模式'''。 在这种情况下，要返回，应该使用'''O32 IRET'''指令，否则CPU将不知道它应该执行32位返回（从[[stack|堆栈]]读取32位值，而不是16位）。&lt;br /&gt;
&lt;br /&gt;
=== 陷阱门（Trap Gate） ===&lt;br /&gt;
&lt;br /&gt;
'''陷阱门'''应该用来处理'''[[Exceptions|异常]]'''。 当一个异常发生时，有时会在堆栈上放置一个错误代码，应该在中断返回之前弹出该代码。&lt;br /&gt;
&lt;br /&gt;
'''陷阱门'''和'''中断门'''是相似的，它们的描述符在结构上是相同的，只是在'''门类型'''字段中有所不同。 不同之处在于，对于 '''中断门'''，中断在进入时会自动禁用，并在 '''IRET''' 时重新启用，而对于 '''陷阱门''' 则不会发生。&lt;br /&gt;
&lt;br /&gt;
=== 任务门（Task Gate） ===&lt;br /&gt;
&lt;br /&gt;
'''任务门'''是特定于IA-32的门类型，用于硬件任务切换。 对于'''任务门'''，'''选择器'''值应指向'''[[GDT]]'''中的位置，该位置指定 '''[[Task State Segment|任务状态段]]'''，而不是代码段， '''偏移量'''值未使用，应设置为零。 当CPU处理该中断时，它将执行到指定任务的硬件任务切换，而不是跳转到服务例程。 返回被中断的任务的指针将存储在'''TSS''' 的'''Task Link（任务链接）'''字段中。&lt;br /&gt;
&lt;br /&gt;
{{Quotation|&amp;quot;*注释* 因为IA-32任务不是可重入（re-entrant）的，所以中断处理程序任务必须在其完成处理中断时和执行IRET指令之间禁用中断。 此操作可防止在中断任务的TSS仍被标记为忙时发生另一个中断，这将导致常规保护 (#GP-general-protection) 异常。&amp;quot;|英特尔软件开发人员手册}}&lt;br /&gt;
&lt;br /&gt;
这种类型的门不经常使用，因为硬件任务切换很慢，并且在现代处理器上几乎没有优化。 同样，它在 [[X86-64|x86-64]]上已被完全删除。&lt;br /&gt;
&lt;br /&gt;
==另见==&lt;br /&gt;
=== 文章 ===&lt;br /&gt;
&lt;br /&gt;
* [[GDT]]&lt;br /&gt;
* [[IDT_problems|IDT problems]]&lt;br /&gt;
&lt;br /&gt;
=== 外部链接 ===&lt;br /&gt;
&lt;br /&gt;
* [http://www.logix.cz/michal/doc/i386/chp09-00.htm Michal Ludvig's Intel 80386 Programmer's Reference Manual chapter 9]&lt;br /&gt;
&lt;br /&gt;
[[Category:X86 CPU]]&lt;br /&gt;
[[Category:Interrupts]]&lt;br /&gt;
[[de:Interrupt_Descriptor_Table]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>