Linux Kernel の HPET(High Precision Event Timer Driver) を見ていきます。HPET のドライバには次の機能が実装されています。
次の図は廉価で普及している PC を構成している HPET の構造です。HPET ブロックは PC のチップセット内に 1 組存在します。HPET を構成する timer は PIT と RTC を置換する timer とアプリケーションが自由に使える timer で構成されます。timer の個数は少なくとも 3 個、多い場合は (2 + プロセッサ数) 個 あるいは これより 2, 3 個多くなっています。
Interrupt Routing 回路により timer が割り込みをかける IRQ 番号は柔軟に設定できます。HPET timer で PIT(Programmable Interrupt Timer), RTC(Real Time Clock) の割り込みを置換した場合、PIT, RTC から発生する割り込みは PIC あるいは APIC から切り離され補足できなくなります。1 個の timer が発生する割り込みは 1 個の割り込み要員となります。timer が発生する割り込みは他の割り込みと共有できます。ほぼ Low Active の Level 割り込みを使いワイヤード OR による共有となります。
HPET の最小構成は仕様書を参照してください
HPET の最小(必須・オプション)構成は HPET specification "2.2 Minimum Recommended Hardware Implementation" を参照してください。多くの PC では実装されている PIT, RTC を置き換える機能はオプション扱いになっています。
HPET ドライバ drivers/char/hpet.c で対応する HPET のハードウエア構成は普及している PC の構造に比べてより複雑です。次の図に示す通り HPET ブロックは PC (プラット・ホーム)内に複数存在している場合に対応しています。ACPI による列挙あるいは Kernel 初期化処理によるデバイス登録において、複数存在し繰り返し probe された場合も十分に対応できます。
HPET driver が関係する事柄は多岐にわたります。それぞれを深く追っていると記述量が多くなり、書き切れなくなるのでおおよその理解で十分な範囲で説明していきます。ソースコードを読み進めてある程度自発的に理解を深めることを期待しています。
HPET が存在するか確かめる。
$ cat /proc/iomem | grep -i HPET feff0000-feff03ff : HPET 0
$ cd /sys/bus/acpi/devices $ ls | grep PNP0103 PNP0103:00