HPET Driver

Linux Kernel の HPET(High Precision Event Timer Driver) を見ていきます。HPET のドライバには次の機能が実装されています。

普通の PC の HPET 構造

次の図は廉価で普及している PC を構成している HPET の構造です。HPET ブロックは PC のチップセット内に 1 組存在します。HPET を構成する timer は PIT と RTC を置換する timer とアプリケーションが自由に使える timer で構成されます。timer の個数は少なくとも 3 個、多い場合は (2 + プロセッサ数) 個 あるいは これより 2, 3 個多くなっています。

HPETPCModel.png

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.c ドライバ の HPET 構造

HPET ドライバ drivers/char/hpet.c で対応する HPET のハードウエア構成は普及している PC の構造に比べてより複雑です。次の図に示す通り HPET ブロックは PC (プラット・ホーム)内に複数存在している場合に対応しています。ACPI による列挙あるいは Kernel 初期化処理によるデバイス登録において、複数存在し繰り返し probe された場合も十分に対応できます。

HPETStructureInLinuxKernelDriver.png
HPETStructureWithDataStructure.png

ほんの触りだけ通ります

HPET driver が関係する事柄は多岐にわたります。それぞれを深く追っていると記述量が多くなり、書き切れなくなるのでおおよその理解で十分な範囲で説明していきます。ソースコードを読み進めてある程度自発的に理解を深めることを期待しています。

環境準備

HPET を有効にする

HPET が存在するか確かめる。

$ cat /proc/iomem | grep -i HPET
  feff0000-feff03ff : HPET 0
$ cd /sys/bus/acpi/devices
$ ls | grep PNP0103
PNP0103:00

Device Register

ACPI device

memory mapped device

Device Node

misc device

file_operations

割り込み処理

Share, Level Low High, Edge Rise Fall

request_irq() free_irq()

IRQ handler

User context に割り込みを伝える

poll

signal

blocking non-blocking

Test Application

hpet_sample plus

サンプルアプリが動かない


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS