IA-PC HPET (高精度のでき事のタイマー)はこの十年の初期のIntelそしてマイクロソフトによって共同で開発された指定である。 最新バージョンは2004年10月日付を記入される。 それは目的がにあることを示した
最初にIAPCのために`のdefacto' timerハードウェアとして現在使用される遺産8254のプログラマブル・インターバル・タイマーをおよび実時間時計周期的な割り込み世代別機能を補い、結局取り替えなさい。
HPETの 建築はオペレーティングシステムによって使用することができる一組のタイマーを定義する。 タイマーブロックは単一のカウンターの組合せ32までのコンパレーターおよびマッチの記録であり。 コンパレーターは自由な連続した単調なカウンターの価値に対してマッチの記録の内容を比較する。 カウンターの出力がマッチの記録の価値に匹敵するとき割り込みは発生する。 コンパレーターのそれぞれは割り込みを出力できる。 最大8つのタイマーブロックは合計256のタイマーのために支えられる。 各タイマーブロックは異なった時間を記録する属性を有することができる。 特定の実施はこれらのタイマーのサブセットだけ含むことができる。 最低3つのタイマーは要求される。
指定はHPETの建築の次のブロックダイヤグラムを含んでいる。

タイマーのいくつかは周期的な割り込みを発生させるために可能になるかもしれない。 従ってタイマーが周期的であるために置かれればこのタイマーのための期間はマッチが起こるたびに割り込みを発生させるために次に計算するにマッチの記録、加えられる。 カウンターは通常広く64ビットであるが、32ビット実施は指定によって許可され、64ビットのカウンターはまた32ビットモードで運転することができる。 カウンターは最小10のMHzで動く。 大いに速いよりかどちらがより古い RTC (実時間時計)は大いにより高い決断でおよびこうして周期的な割り込みを作り出すことができる。 記録はメモリ・スペースにこれらのタイマーと地図を描かれる関連付けた。
HPETによって記憶地図を描かれる 記録 スペースの位置をオペレーティングシステムに知らせるBIOSの使用ACPI (高度構成および力インターフェイス)機能性。 Intel DX48BT2 (AKA BoneTrail)のマザーボードからの分解されたACPI HPETのテーブルの例はここにある。
$ cat /sys/firmware/acpi/tables/HPET > /var/tmp/hpet.out $ iasl -d /var/tmp/hpet.out $ cat /var/tmp/hpet.dsl /* * Intel ACPI Component Architecture * AML Disassembler version 20090123 * * Disassembly of /var/tmp/hpet.out, Sun Jul 5 19:34:47 2009 * * ACPI Data Table [HPET] * * Format: [HexOffset DecimalOffset ByteLength] FieldName : FieldValue */ [000h 000 4] Signature : "HPET" /* High Precision Event Timer table */ [004h 004 4] Table Length : 00000038 [008h 008 1] Revision : 01 [009h 009 1] Checksum : CE [00Ah 010 6] Oem ID : "INTEL " [010h 016 8] Oem Table ID : "DX48BT2 " [018h 024 4] Oem Revision : 0000076E [01Ch 028 4] Asl Compiler ID : "MSFT" [020h 032 4] Asl Compiler Revision : 01000013 [024h 036 4] Hardware Block ID : 8086A301 [028h 040 12] Timer Block Register :[028h 040 1] Space ID : 00 (SystemMemory) [029h 041 1] Bit Width : 00 [02Ah 042 1] Bit Offset : 00 [02Bh 043 1] Access Width : 00 [02Ch 044 8] Address : 00000000FED00000 [034h 052 1] Sequence Number : 00 [035h 053 2] Minimum Clock Ticks : 0001 [037h 055 1] Flags (decoded below) : 00 Page Protect : 0 4K Page Protect : 0 64K Page Protect : 0 Raw Table Data 0000: 48 50 45 54 38 00 00 00 01 CE 49 4E 54 45 4C 20 HPET8.....INTEL 0010: 44 58 34 38 42 54 32 20 6E 07 00 00 4D 53 46 54 DX48BT2 n...MSFT 0020: 13 00 00 01 01 A3 86 80 00 00 00 00 00 00 D0 FE ................ 0030: 00 00 00 00 00 01 00 00 ........ $
でき事の時間ブロックの個々のビットの詳しい故障のためのHPET v1.0aの指定のページを見なさい30 (AMLのdisassemberによってHardware Blockと呼ばれる)。 オペレーティングシステムをブートストラップするために1つのでき事のタイマーブロックだけHPETのテーブルで記述されている必要があることに注目しなさい。 これはここに事実である。 非遺産のプラットホームのために、HPETで記述されているでき事のタイマーブロックは8254/RTC周期的な割り込み論理を取り替えるために機能性を提供するものである。
他のでき事の時間ブロックはACPI namespaceで記述されている。 分解されたACPI DSDTのテーブルからの関連したセクションはここにある。
Device (HPET)
{
Name (_HID, EisaId ("PNP0103"))
Name (_CRS, ResourceTemplate ()
{
Memory32Fixed (ReadOnly,
0xFED00000, // Address Base
0x00004000, // Address Length
)
})
Method (_STA, 0, NotSerialized)
{
If (HPEE)
{
Return (0x0F)
}
Else
{
Return (Zero)
}
}
}
HPETのための割り当てられたPNPID (PNP0103)に注意しなさい。 _UIDは指定されないので他のHPETのタイマーブロックがないことを意味する。
この特定のマザーボードがソフト帽11.の下で追い出されるときoutputted HPET関係したメッセージのリストはここにある。
$ dmesg | grep -i HPET ACPI: HPET CFBF2000, 0038 (r1 INTEL DX48BT2 76E MSFT 1000013) ACPI: HPET id: 0x8086a301 base: 0xfed00000 hpet clockevent registered HPET: 4 timers in total, 0 timers will be used for per-cpu timer hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0, 0 hpet0: 4 comparators, 64-bit 14.318180 MHz counter rtc0: alarms up to one month, 114 bytes nvram, hpet irqs $
最初のラインはACPI HPETのテーブルが読まれるときoutputted。 第2ラインはACPI HPETのテーブルが… /arch/x86/kernel/acpi/boot.c.によって記憶に地図を描かれるときoutputted。 次のラインはHPETの遺産割り込みが始まり、HPETが全体的な時計として登録されているときoutputted。 次のラインは少なくとも1つのタイマーはuserspace (/dev/hpet。)のために予約であることを保障するために穀粒が点検するときoutputted 出力次の2つの行はHPETのデバイス・ドライバから来る(… /drivers/char/hpet.c.) 2つのタイマーは割り込みを割振り、2つはことを示す。
HPETに関連していると同時に/proc/time_listからの出力の関連した部分はここにある:
Tick Device: mode: 1 Broadcast device Clock Event Device: hpet max_delta_ns: 149983005959 min_delta_ns: 5000 mult: 61496114 shift: 32 mode: 3 next_event: 9223372036854775807 nsecs set_next_event: hpet_legacy_next_event set_mode: hpet_legacy_set_mode event_handler: tick_handle_oneshot_broadcast tick_broadcast_mask: 00000000 tick_broadcast_oneshot_mask: 00000000
/proc/sys/dev/hpetおよび/proc/driver/rtcからの出力はここにある:
$ cat /proc/sys/dev/hpet/max-user-freq 64 $ cat /proc/driver/rtc rtc_time : 06:34:31 rtc_date : 2009-07-06 alrm_time : **:24:40 alrm_date : ****-**-** alarm_IRQ : no alrm_pending : no 24hr : yes periodic_IRQ : no update_IRQ : no HPET_emulated : yes DST_enable : no periodic_freq : 1024 batt_status : okay
HPETの運転者(/dev/hpet)に実時間時計の運転者に同じようなAPIがある。 HPET装置のいくつもを支えることができるのはキャラクタ・デバイスである。 穀粒APIに運転者から輸出される3つのインターフェイスがある:
hpet_register( struct hpet_task *tp, int periodic ) hpet_unregister( struct hpet_task *tp ) hpet_control( struct hpet_task *tp, unsigned int cmd, unsigned long arg )
HPETへのuserspaceインターフェイスはヘッダー/usr/include/linux/hpet.hで定義される。 支えられた操作の現在のセットは次のとおりである:
#define HPET_IE_ON _IO('h', 0x01) /* interrupt on */
#define HPET_IE_OFF _IO('h', 0x02) /* interrupt off */
#define HPET_INFO _IOR('h', 0x03, struct hpet_info) /* get information */
#define HPET_EPI _IO('h', 0x04) /* enable periodic */
#define HPET_DPI _IO('h', 0x05) /* disable periodic */
#define HPET_IRQFREQ _IOW('h', 0x6, unsigned long) /* set frequency */
次の例にHPETにアクセスしたり2のそして99回間の秒簡単で周期的な信号の扱う人のhpet_alarmを呼ぶのに出版されたインターフェイスを使用する方法を示されている。
#include <stdio.h>
#include <stdlib.h;>
#include <fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <fcntl.h>
#include <sys/time.h>
#include <linux/hpet.h>
#include <stdint.h>
#include <sys/ioctl.h>
#include <signal.h>
static uint16_t hpet_sigio_count;
static uint64_t secs;
static void
hpet_alarm(int val)
{
struct timespec t;
clock_gettime(CLOCK_REALTIME, &t);
if (!secs) secs = t.tv_sec;
fprintf(stderr, "hpet_alarm called. iteration: %2d secs: %ld nsecs: %ld \n",
hpet_sigio_count, (t.tv_sec - secs) , t.tv_sec * 100000 + t.tv_nsec );
hpet_sigio_count++;
}
int
main(int argc, const char **argv)
{
struct sigaction old, new;
struct hpet_info info;
int frequency;
int iterations;
int retval = 0;
int fd;
int r, i, value;
if (argc != 3) {
fprintf(stderr, "Usage: %s frequency(1-64) iterations(10-99)\n", argv[0]);
return -1;
}
frequency = atoi(argv[1]);
iterations = atoi(argv[2]);
if (frequency > 64 || frequency < 1 ) {
fprintf(stderr, "ERROR: Invalid value for frequency\n");
return -1;
}
if (iterations < 10 || iterations > 99 ) {
fprintf(stderr, "ERROR: Invalid value for iterations\n");
return -1;
}
hpet_sigio_count = 0;
sigemptyset(&new.sa_mask);
new.sa_flags = 0;
new.sa_handler = hpet_alarm;
sigaction(SIGIO, NULL, &old);
sigaction(SIGIO, &new, NULL);
fd = open("/dev/hpet", O_RDONLY);
if (fd < 0) {
fprintf(stderr, "ERROR: Failed to open /dev/hpet\n");
return -1;
}
if ((fcntl(fd, F_SETOWN, getpid()) == 1) ||
((value = fcntl(fd, F_GETFL)) == 1) ||
(fcntl(fd, F_SETFL, value | O_ASYNC) == 1)) {
fprintf(stderr, "ERROR: fcntl failed\n");
retval = 1;
goto fail;
}
if (ioctl(fd, HPET_IRQFREQ, frequency) < 0) {
fprintf(stderr, "ERROR: Could not set /dev/hpet to have a %2dHz timer\n", frequency);
retval = 2;
goto fail;
}
if (ioctl(fd, HPET_INFO, &info) < 0) {
fprintf(stderr, "ERROR: failed to get info\n");
retval = 3;
goto fail;
}
fprintf(stdout, "\nhi_ireqfreq: 0x%lx hi_flags: %0x%lx hi_hpet: 0x%x hi_timer: 0x%x\n\n",
info.hi_ireqfreq, info.hi_flags, info.hi_hpet, info.hi_timer);
r = ioctl(fd, HPET_EPI, 0);
if (info.hi_flags && (r < 0)) {
fprintf(stderr, "ERROR: HPET_EPI failed\n");
retval = 4;
goto fail;
}
if (ioctl(fd, HPET_IE_ON, 0) < 0) {
fprintf(stderr, "ERROR: HPET_IE_ON failed\n");
retval = 5;
goto fail;
}
/* wait for specified number of signal interrupts */
for (i = 0; i < iterations; i++) {
(void) pause();
}
if (ioctl(fd, HPET_IE_OFF, 0) < 0) {
fprintf(stderr, "ERROR: HPET_IE_OFF failed\n");
retval = 6;
}
fail:
sigaction(SIGIO, &old, NULL);
if (fd > 0)
close(fd);
return retval;
}
32の頻度と実施されるおよび64の繰り返しの計算ここにあるときこの例からの出力は。
$ sudo ./hpet_example 32 64 hi_ireqfreq: 0x20 hi_flags: 00 hi_hpet: 0x2 hi_timer: 0x4a1cb9c8 hpet_alarm called. iteration: 0 secs: 0 nsecs: 124683205055050 hpet_alarm called. iteration: 1 secs: 0 nsecs: 124683236313149 hpet_alarm called. iteration: 2 secs: 0 nsecs: 124683267566342 hpet_alarm called. iteration: 3 secs: 0 nsecs: 124683298821905 hpet_alarm called. iteration: 4 secs: 0 nsecs: 124683330077493 hpet_alarm called. iteration: 5 secs: 0 nsecs: 124683361341893 hpet_alarm called. iteration: 6 secs: 0 nsecs: 124683392590764 hpet_alarm called. iteration: 7 secs: 0 nsecs: 124683423849157 hpet_alarm called. iteration: 8 secs: 0 nsecs: 124683455101917 hpet_alarm called. iteration: 9 secs: 0 nsecs: 124683486357683 hpet_alarm called. iteration: 10 secs: 0 nsecs: 124683517617931 hpet_alarm called. iteration: 11 secs: 0 nsecs: 124683548872198 hpet_alarm called. iteration: 12 secs: 1 nsecs: 124682580229541 hpet_alarm called. iteration: 13 secs: 1 nsecs: 124682611481235 hpet_alarm called. iteration: 14 secs: 1 nsecs: 124682642740016 hpet_alarm called. iteration: 15 secs: 1 nsecs: 124682673992697 hpet_alarm called. iteration: 16 secs: 1 nsecs: 124682705247479 hpet_alarm called. iteration: 17 secs: 1 nsecs: 124682736504664 hpet_alarm called. iteration: 18 secs: 1 nsecs: 124682767758840 hpet_alarm called. iteration: 19 secs: 1 nsecs: 124682799014280 hpet_alarm called. iteration: 20 secs: 1 nsecs: 124682830270129 hpet_alarm called. iteration: 21 secs: 1 nsecs: 124682861530334 hpet_alarm called. iteration: 22 secs: 1 nsecs: 124682892784577 hpet_alarm called. iteration: 23 secs: 1 nsecs: 124682924038220 hpet_alarm called. iteration: 24 secs: 1 nsecs: 124682955294110 hpet_alarm called. iteration: 25 secs: 1 nsecs: 124682986550572 hpet_alarm called. iteration: 26 secs: 1 nsecs: 124683017805756 hpet_alarm called. iteration: 27 secs: 1 nsecs: 124683049061117 hpet_alarm called. iteration: 28 secs: 1 nsecs: 124683080318331 hpet_alarm called. iteration: 29 secs: 1 nsecs: 124683111576954 hpet_alarm called. iteration: 30 secs: 1 nsecs: 124683142828988 hpet_alarm called. iteration: 31 secs: 1 nsecs: 124683174083954 hpet_alarm called. iteration: 32 secs: 1 nsecs: 124683205337967 hpet_alarm called. iteration: 33 secs: 1 nsecs: 124683236593144 hpet_alarm called. iteration: 34 secs: 1 nsecs: 124683267851530 hpet_alarm called. iteration: 35 secs: 1 nsecs: 124683299104054 hpet_alarm called. iteration: 36 secs: 1 nsecs: 124683330358748 hpet_alarm called. iteration: 37 secs: 1 nsecs: 124683361617445 hpet_alarm called. iteration: 38 secs: 1 nsecs: 124683392870249 hpet_alarm called. iteration: 39 secs: 1 nsecs: 124683424124489 hpet_alarm called. iteration: 40 secs: 1 nsecs: 124683455379717 hpet_alarm called. iteration: 41 secs: 1 nsecs: 124683486634424 hpet_alarm called. iteration: 42 secs: 1 nsecs: 124683517889149 hpet_alarm called. iteration: 43 secs: 1 nsecs: 124683549144315 hpet_alarm called. iteration: 44 secs: 2 nsecs: 124682580500695 hpet_alarm called. iteration: 45 secs: 2 nsecs: 124682611761325 hpet_alarm called. iteration: 46 secs: 2 nsecs: 124682643011863 hpet_alarm called. iteration: 47 secs: 2 nsecs: 124682674265864 hpet_alarm called. iteration: 48 secs: 2 nsecs: 124682705521034 hpet_alarm called. iteration: 49 secs: 2 nsecs: 124682736776049 hpet_alarm called. iteration: 50 secs: 2 nsecs: 124682768030654 hpet_alarm called. iteration: 51 secs: 2 nsecs: 124682799285398 hpet_alarm called. iteration: 52 secs: 2 nsecs: 124682830544701 hpet_alarm called. iteration: 53 secs: 2 nsecs: 124682861797319 hpet_alarm called. iteration: 54 secs: 2 nsecs: 124682893051578 hpet_alarm called. iteration: 55 secs: 2 nsecs: 124682924306748 hpet_alarm called. iteration: 56 secs: 2 nsecs: 124682955562132 hpet_alarm called. iteration: 57 secs: 2 nsecs: 124682986823545 hpet_alarm called. iteration: 58 secs: 2 nsecs: 124683018073636 hpet_alarm called. iteration: 59 secs: 2 nsecs: 124683049327560 hpet_alarm called. iteration: 60 secs: 2 nsecs: 124683080586707 hpet_alarm called. iteration: 61 secs: 2 nsecs: 124683111841132 hpet_alarm called. iteration: 62 secs: 2 nsecs: 124683143095147 hpet_alarm called. iteration: 63 secs: 2 nsecs: 124683174349985 hpet_alarm called. iteration: 64 secs: 2 nsecs: 124683205607103 $
それで、私は立ち去れるHPETインターフェイスとの実験あなた自身今べきであるように私が十分な情報を与えたと考え。
ところで、ないすべてのVMwareの製品サポートHPET。 現在ESXはゲストのオペレーティングシステムに事実上HPETを提供しないし、仮想計算機のタイマーの漂流のためにHPETを全体で不具にすることは時として必要かもしれない。 より多くの 情報については VMwareの計時を見なさい。
P.S.Iは2.6.29.5を- 191穀粒動かすIntel DX48BT2のマザーボードの上の例をテストした。


























