<?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=HPET</id>
	<title>HPET - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=HPET"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=HPET&amp;action=history"/>
	<updated>2026-04-04T04:14:16Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=HPET&amp;diff=964&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“:''本页不是对HPET的完整描述，只是一个轻量级的介绍。 如果你需要本文未涵盖的任何信息，请参考[http://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/software-developers-hpet-spec-1-0a.pdf HPET规范]。''  '''HPET'''或高精度事件定时器（High Precision Event Timer），是英特尔和微软设计的一款硬件，用于取代较旧的 PIT 和 RTC。 它由（通常为64位）主…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=HPET&amp;diff=964&amp;oldid=prev"/>
		<updated>2022-03-21T05:29:21Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“:&amp;#039;&amp;#039;本页不是对HPET的完整描述，只是一个轻量级的介绍。 如果你需要本文未涵盖的任何信息，请参考[http://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/software-developers-hpet-spec-1-0a.pdf HPET规范]。&amp;#039;&amp;#039;  &amp;#039;&amp;#039;&amp;#039;HPET&amp;#039;&amp;#039;&amp;#039;或高精度事件定时器（High Precision Event Timer），是英特尔和微软设计的一款硬件，用于取代较旧的 &lt;a href=&quot;/index.php?title=PIT&quot; class=&quot;mw-redirect&quot; title=&quot;PIT&quot;&gt;PIT&lt;/a&gt; 和 &lt;a href=&quot;/index.php?title=RTC&quot; title=&quot;RTC&quot;&gt;RTC&lt;/a&gt;。 它由（通常为64位）主…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;:''本页不是对HPET的完整描述，只是一个轻量级的介绍。 如果你需要本文未涵盖的任何信息，请参考[http://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/software-developers-hpet-spec-1-0a.pdf HPET规范]。''&lt;br /&gt;
&lt;br /&gt;
'''HPET'''或高精度事件定时器（High Precision Event Timer），是英特尔和微软设计的一款硬件，用于取代较旧的 [[PIT]] 和 [[RTC]]。 它由（通常为64位）主计数器（递增计数）以及3到32位或64位宽的比较器组成。 HPET使用内存映射IO进行编程，使用[[ACPI]]可以找到HPET的基地址。&lt;br /&gt;
&lt;br /&gt;
== 使用ACPI检测HPET ==&lt;br /&gt;
&lt;br /&gt;
那个[http://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/software-developers-hpet-spec-1-0a.pdf HPET规范]定义了一个ACPI 2.0表，用于检测系统中存在的HPET的存在、地址和功能。 如果该表不存在，你应该假设没有HPET，并且应该回退到[[PIT]]或[[APIC Timer]]。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct address_structure&lt;br /&gt;
{&lt;br /&gt;
    uint8_t address_space_id;    // 0 - system memory, 1 - system I/O&lt;br /&gt;
    uint8_t register_bit_width;&lt;br /&gt;
    uint8_t register_bit_offset;&lt;br /&gt;
    uint8_t reserved;&lt;br /&gt;
    uint64_t address;&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&lt;br /&gt;
struct description_table_header&lt;br /&gt;
{&lt;br /&gt;
    char signature[4];    // 'HPET' in case of HPET table&lt;br /&gt;
    uint32_t length;&lt;br /&gt;
    uint8_t revision;&lt;br /&gt;
    uint8_t checksum;&lt;br /&gt;
    char oemid[6];&lt;br /&gt;
    uint64_t oem_tableid;&lt;br /&gt;
    uint32_t oem_revision;&lt;br /&gt;
    uint32_t creator_id;&lt;br /&gt;
    uint32_t creator_revision;&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&lt;br /&gt;
struct hpet : public description_table_header&lt;br /&gt;
{&lt;br /&gt;
    uint8_t hardware_rev_id;&lt;br /&gt;
    uint8_t comparator_count:5;&lt;br /&gt;
    uint8_t counter_size:1;&lt;br /&gt;
    uint8_t reserved:1;&lt;br /&gt;
    uint8_t legacy_replacement:1;&lt;br /&gt;
    uint16_t pci_vendor_id;&lt;br /&gt;
    address_structure address;&lt;br /&gt;
    uint8_t hpet_number;&lt;br /&gt;
    uint16_t minimum_tick;&lt;br /&gt;
    uint8_t page_protection;&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HPET-定时器（timer）vs比较器（comparators） ==&lt;br /&gt;
&lt;br /&gt;
定时器中只有一个递增计数主计数器，但中断生成由*比较器*处理。 有3到32个比较器，确切的数量由上面&amp;lt;code&amp;gt;hpet&amp;lt;/code&amp;gt;结构中的&amp;lt;code&amp;gt;compasator_count&amp;lt;/code&amp;gt;字段表示。 请记住，你必须初始化主计数器和所有比较器。 此外，比较器中断的路由以及'''允许的'''路由是独立的，因此你必须为每个中断单独检测和设置它。 正文中进一步提供了有关此过程的更多信息。&lt;br /&gt;
&lt;br /&gt;
== HPET操作模式 ==&lt;br /&gt;
&lt;br /&gt;
HPET提供两种操作模式： 单次(one-shot,规范中也称为“非周期”)和周期模式。&lt;br /&gt;
&lt;br /&gt;
=== One-shot模式 ===&lt;br /&gt;
&lt;br /&gt;
在非周期模式下，操作系统用主计数器的值对定时器的一个比较器寄存器进行编程，以触发中断。 如果定时器设置为32位模式，则计数器回绕（wraps around）时也会产生中断。 比较器寄存器的值永远不会被硬件写入，你可以随时对其进行写入和读取，因此你可以更改主计数器中将生成中断的值。&lt;br /&gt;
&lt;br /&gt;
HPET中的每个比较器都必须支持非周期模式。&lt;br /&gt;
&lt;br /&gt;
===周期模式===&lt;br /&gt;
&lt;br /&gt;
周期模式比非周期模式更棘手。 对于周期模式，类似于一次触发模式，写入一个值，在该值处，将向比较器寄存器生成中断。 但是，当产生中断时，硬件将'''将比较器寄存器中的值增加最后一个写入它的值'''！ 这是HPET的主要计数器向上计数的结果。&lt;br /&gt;
&lt;br /&gt;
因此，如果我们设置定时器时，主计数器的值是12345，并且我们将12456写入比较器（即，从现在起，中断将触发111个时间单位），当中断触发时，12456将“添加”到比较器寄存器，因此它将变为24912，即从第一个中断开始的12456个时间单位。 有两种技术可以处理此问题；这两种技术都将在本文的后面部分介绍。&lt;br /&gt;
&lt;br /&gt;
'''不需要''' 比较器来支持此模式; 初始化比较器时，你必须检测到此功能。 本文将进一步提供有关这方面的更多信息。&lt;br /&gt;
&lt;br /&gt;
==中断例程（Interrupt routing）==&lt;br /&gt;
&lt;br /&gt;
HPET支持三种中断映射选项: “遗留替换（legacy replacement）” 选项、标准选项和FSB选项。&lt;br /&gt;
&lt;br /&gt;
===“旧版替换”映射===&lt;br /&gt;
&lt;br /&gt;
在此映射中，HPET的定时器(比较器)#0替换PIT中断，而定时器#1替换RTC的中断(换句话说，PIC和RTC将不再导致中断)。 虽然HPET规范提供了下表描述了此映射中定时器 #0和 #1的路由，但建议至少检查ACPI表中IRQ0和IRQ8到I/O APIC的路由例程（routing）。&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
! 定时器&lt;br /&gt;
! PIC映射&lt;br /&gt;
! IOAPIC映射&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|IRQ0&lt;br /&gt;
|IRQ2&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|IRQ8&lt;br /&gt;
|IRQ8&lt;br /&gt;
|-&lt;br /&gt;
|N&lt;br /&gt;
|根据IRQ路由字段&lt;br /&gt;
|根据IRQ路由字段&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 标准映射 ===&lt;br /&gt;
&lt;br /&gt;
在标准映射中，每个定时器都有自己的中断路由控制。 通过读取定时器的能力寄存器可以找到允许的I/O APIC输入。&lt;br /&gt;
&lt;br /&gt;
=== FSB映射 ===&lt;br /&gt;
&lt;br /&gt;
这种映射几乎与PCI的消息信号中断相同。 定义如何配置FSB中断的“定时器N FSB中断路由寄存器”可在规范中找到。 使用定时器配置寄存器中的 “Tn_FSB_EN_CNF” 字段启用FSB中断。 本文将不再进一步讨论这种映射模式。&lt;br /&gt;
&lt;br /&gt;
==HPET寄存器==&lt;br /&gt;
&lt;br /&gt;
下表和字段描述也可以在规范中找到。 “偏移量”指与&amp;lt;code&amp;gt;hpet&amp;lt;/code&amp;gt;struct的&amp;lt;code&amp;gt;address&amp;lt;/code&amp;gt;字段中定义的地址的偏移量。 下表跳过规范中定义的保留寄存器。&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
!偏移&lt;br /&gt;
!寄存器&lt;br /&gt;
! 类型&lt;br /&gt;
|-&lt;br /&gt;
|0x000 - 0x007&lt;br /&gt;
|General Capabilities and ID Register&lt;br /&gt;
|Read only&lt;br /&gt;
|-&lt;br /&gt;
|0x010 - 0x017&lt;br /&gt;
|General Configuration Register&lt;br /&gt;
|Read/write&lt;br /&gt;
|-&lt;br /&gt;
|0x020 - 0x027&lt;br /&gt;
|General Interrupt Status Register&lt;br /&gt;
|Read/write clear&lt;br /&gt;
|-&lt;br /&gt;
|0x0F0 - 0x0F7&lt;br /&gt;
|Main Counter Value Register&lt;br /&gt;
|Read/write&lt;br /&gt;
|-&lt;br /&gt;
|(0x100 + 0x20 * N) - (0x107 + 0x20 * N)&lt;br /&gt;
|Timer N Configuration and Capability Register&lt;br /&gt;
|Read/write&lt;br /&gt;
|-&lt;br /&gt;
|(0x108 + 0x20 * N) - (0x10F + 0x20 * N)&lt;br /&gt;
|Timer N Comparator Value Register&lt;br /&gt;
|Read/write&lt;br /&gt;
|-&lt;br /&gt;
|(0x110 + 0x20 * N) - (0x117 + 0x20 * N)&lt;br /&gt;
|Timer N FSB Interrupt Route Register&lt;br /&gt;
|Read/write&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===General Capabilities and ID Register===&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
! 位&lt;br /&gt;
!名称&lt;br /&gt;
!描述&lt;br /&gt;
|-&lt;br /&gt;
|63:32&lt;br /&gt;
|COUNTER_CLK_PERIOD&lt;br /&gt;
|主计数器计时周期，单位为飞秒(10^-15s)。 不得为零，必须小于或等于0x05F5E100或100纳秒。&lt;br /&gt;
|-&lt;br /&gt;
|31-16&lt;br /&gt;
|供应商ID&lt;br /&gt;
| 此字段的解释应与PCI的供应商ID类似。&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|LEG_RT_CAP&lt;br /&gt;
| 如果此位为1，则HPET能够使用 “遗留替换” 映射。&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
| 保留&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|COUNT_SIZE_CAP&lt;br /&gt;
|该位为1时，HPET主计数器可以在64位模式下运行。&lt;br /&gt;
|-&lt;br /&gt;
|12:8&lt;br /&gt;
|NUM_TIM_CAP&lt;br /&gt;
|定时器的数量为-1。&lt;br /&gt;
|-&lt;br /&gt;
|7:0&lt;br /&gt;
|REV_ID&lt;br /&gt;
表示实现的是哪个版本的功能，不能为0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===General Configuration Register===&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
!位&lt;br /&gt;
!名称&lt;br /&gt;
!描述&lt;br /&gt;
|-&lt;br /&gt;
|63:2&lt;br /&gt;
| 保留&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|LEG_RT_CNF&lt;br /&gt;
|0-“旧版替换”映射已禁用&lt;br /&gt;
1-启用“传统替换”映射&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ENABLE_CNF&lt;br /&gt;
| 整体（Overall）启用。&lt;br /&gt;
0-主计数器停止，定时器中断被禁用&lt;br /&gt;
&lt;br /&gt;
1-主计数器正在运行，如果启用，则允许定时器中断&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===General Interrupt Status Register===&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
!位&lt;br /&gt;
!名称&lt;br /&gt;
!描述&lt;br /&gt;
|-&lt;br /&gt;
|63:32&lt;br /&gt;
| 保留&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|n&lt;br /&gt;
|Tn_INT_STS&lt;br /&gt;
|该功能取决于定时器#n使用的是边缘触发模式还是电平触发模式。&lt;br /&gt;
&lt;br /&gt;
对于'''电平触发：'''，默认值为0。 当相应的定时器中断处于活动状态时，将设置此位为1。 如果设置了1，软件可以通过向该位写入1来清除它。 写入0不起作用。&lt;br /&gt;
&lt;br /&gt;
''' 对于边缘触发: ''' 应忽略此位。 它始终设置为0。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Main Counter Value Register===&lt;br /&gt;
&lt;br /&gt;
该寄存器的位63：0称为MAIN_COUNTER_VAL。 仅当计数器暂停 (ENABLE_CNF = 0) 时，才应执行对该寄存器的写入操作。 Reads将返回主计数器的当前值。32位计数器对于较高的32位总是返回0。 如果在64位计数器上执行32位读取，请参考规范中的2.4.7，了解如何安全执行该操作的说明。 建议在仅32位软件上使用32位计数器。&lt;br /&gt;
&lt;br /&gt;
===Timer N Configuration and Capability Register===&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
!位&lt;br /&gt;
!名称&lt;br /&gt;
!描述&lt;br /&gt;
|-&lt;br /&gt;
|63:32&lt;br /&gt;
|Tn_INT_ROUTE_CAP&lt;br /&gt;
|定时器n中断路由功能。 如果在该字段中设置了位X，则意味着该定时器可以映射到I/O APIC的IRQX线。&lt;br /&gt;
|-&lt;br /&gt;
|31:16&lt;br /&gt;
|Reserved&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|Tn_FSB_INT_DEL_CAP&lt;br /&gt;
| 如果此只读位为1，则此定时器支持FSB中断映射。&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
|Tn_FSB_EN_CNF&lt;br /&gt;
|如果该位设置为1，该定时器将使用FSB中断映射。&lt;br /&gt;
|-&lt;br /&gt;
|13:9&lt;br /&gt;
|Tn_INT_ROUTE_CNF&lt;br /&gt;
|表示I/O APIC路由。可以使用TN_INT_ROUTE_CAP确定允许值。如果写入非法值，则从此字段读回的值将与写入的值不匹配。&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Tn_32MODE_CNF&lt;br /&gt;
| 对于64位定时器，如果设置了此字段，则定时器将被强制以32位模式工作。否则没有效果。&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|Reserved&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Tn_VAL_SET_CNF&lt;br /&gt;
|此字段用于允许软件直接设置周期定时器的累加器。详细解释将在本文中进一步提供。&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Tn_SIZE_CAP&lt;br /&gt;
|如果该只读位设置为1，则定时器的大小为64位。否则，它是32位的。&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Tn_PER_INT_CAP&lt;br /&gt;
| 如果此只读位设置为1，则此定时器支持周期性模式。&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Tn_TYPE_CNF&lt;br /&gt;
| 如果Tn_PER_INT_CAP为1，则向该字段写入1将启用周期定时器，写入0将启用非周期模式。否则，该位将被忽略，读取它将始终返回0。&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Tn_INT_ENB_CNF&lt;br /&gt;
|将此位设置为1可启用中断触发。即使此位为0，此定时器仍将设置TN_INT_STS。&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Tn_INT_TYPE_CNF&lt;br /&gt;
|0 - this timer generates edge-triggered interrupts.&lt;br /&gt;
1-此定时器生成电平触发的中断。当产生中断时，设置Tn_INT_STS。如果在清除该位之前发生另一个中断，则该中断将保持活动状态。&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Reserved&lt;br /&gt;
| -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Timer N Comparator Value Register===&lt;br /&gt;
&lt;br /&gt;
位63:0（或31:0，如果定时器在32位模式下工作）用于与主计数器进行比较，以检查是否应生成中断。&lt;br /&gt;
&lt;br /&gt;
==初始化==&lt;br /&gt;
&lt;br /&gt;
以下是初始化主计数器和比较器以接收中断所需执行的过程。&lt;br /&gt;
&lt;br /&gt;
一般初始化：&lt;br /&gt;
&lt;br /&gt;
1. 在‘HPET’ACPI表中查找HPET基地址。&lt;br /&gt;
&lt;br /&gt;
2. 计算HPET频率 (f = 10 ^ 15/周期)。&lt;br /&gt;
&lt;br /&gt;
3.保存最小刻度（来自ACPI表或配置寄存器）。&lt;br /&gt;
&lt;br /&gt;
4. 初始化比较器。&lt;br /&gt;
&lt;br /&gt;
5. 设置ENABLE_CNF位&lt;br /&gt;
&lt;br /&gt;
定时器N初始化：&lt;br /&gt;
&lt;br /&gt;
1.确定定时器N是否具有周期性功能，保存该信息以避免每次重新读取。&lt;br /&gt;
&lt;br /&gt;
2.确定当前定时器的允许中断路由，并为其分配一个中断。&lt;br /&gt;
&lt;br /&gt;
我只在实际使用定时器时才启用它们，所以这里没有比较器的“真正”初始化。&lt;br /&gt;
&lt;br /&gt;
请记住，允许的中断例程 '''可能跑飞'''。 也就是说，你可能还需要使用一些ISA中断-或者至少能够在某一点上明确使用它们。 上次我检查VirtualBox允许的HPET映射时，它允许将每个定时器路由到系统上存在的32个I/O APIC输入中的“任意”。 知道硬件有多有漏洞，我不会太惊讶，如果有一台带有HPET的PC声称允许输入#31，而实际上只有24个I/O APIC输入。 为定时器选择中断路由时请注意这一点。&lt;br /&gt;
&lt;br /&gt;
==使用定时器==&lt;br /&gt;
&lt;br /&gt;
===单次（One-shot）模式===&lt;br /&gt;
&lt;br /&gt;
要启用一次性模式:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// &amp;quot;time&amp;quot; is time in femtoseconds from now to interrupt&lt;br /&gt;
if (time &amp;lt; COUNTER_CLK_PERIOD)&lt;br /&gt;
{&lt;br /&gt;
    time = adjust_time(time);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
write_register_64(timer_configuration(n), (ioapic_input &amp;lt;&amp;lt; 9) | (1 &amp;lt;&amp;lt; 2));&lt;br /&gt;
write_register_64(timer_comparator(n), read_register(main_counter) + time);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
我希望上面的代码是显而易见的。 如果不是，请分析上面使用的寄存器中特定字段的含义。&lt;br /&gt;
&lt;br /&gt;
=== 周期模式 ===&lt;br /&gt;
&lt;br /&gt;
要启用周期模式，请执行以下操作：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
// &amp;quot;time&amp;quot; is time in femtoseconds from now to interrupt&lt;br /&gt;
if (time &amp;lt; COUNTER_CLK_PERIOD)&lt;br /&gt;
{&lt;br /&gt;
    time = adjust_time(time);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
write_register_64(timer_configuration(n), (ioapic_input &amp;lt;&amp;lt; 9) | (1 &amp;lt;&amp;lt; 2) | (1 &amp;lt;&amp;lt; 3) | (1 &amp;lt;&amp;lt; 6));&lt;br /&gt;
write_register_64(timer_comparator(n), read_register(main_counter) + time);&lt;br /&gt;
write_register_64(timer_comparator(n), time);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这段代码需要更多注释。&lt;br /&gt;
&lt;br /&gt;
位2同上，中断使能。 第3位也很简单——1表示周期定时器。 但我们也设置了第6位。 为什么？&lt;br /&gt;
&lt;br /&gt;
让我们看看HPET规范的引用内容：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Timer n Value Set: [...] Software uses this read/write bit only for timers that have been set to periodic mode. By writing this bit to a 1, the software is then allowed to directly set a periodic timer’s accumulator.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;软件不必将此位写回0(自动清0)。 如果定时器设置为非周期性模式，则软件不应在此位位置写入1。&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这意味着下一次写入定时器N比较器寄存器将具有通常的含义，而“第二次”下一次写入将直接写入累加器。 我举得这里的措辞本可以更好。&lt;br /&gt;
&lt;br /&gt;
== 另见 ==&lt;br /&gt;
* [[IOAPIC]]&lt;br /&gt;
* [[APIC]]&lt;br /&gt;
* [[APIC timer]]&lt;br /&gt;
* [[PIT]]&lt;br /&gt;
* [[RTC]]&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/High_Precision_Event_Timer HPET article on Wikipedia]&lt;br /&gt;
* [http://www.intel.com/content/dam/www/public/us/en/documents/technical-specifications/software-developers-hpet-spec-1-0a.pdf Intel's HPET Specification v1.0a]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Common Devices]]&lt;br /&gt;
[[Category:Interrupts]]&lt;br /&gt;
[[Category:Time]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>