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 を列挙する call back (hpet_acpi_add() の中で使っている acpi_walk_resources()) を使ったデバイス登録において、複数存在し繰り返し probe された場合にも対応しています。

HPETStructureInLinuxKernelDriver.png

始めに発見された HPET は PIT, RTC を置き換える機能があるかもしれません。それ以外の HPET は汎用の timer を複数持つ構成になります。HPET ドライバは複数の HPET がそれぞれ異なる構成・クロック源になるを想定しています。

HPET ブロックが複数あった場合、アプリケーションは適した HPET ブロックを選べるのか?

/dev/hpet を close せずに open していけば順次空いている HPET の timer が割り当てられていくので、探すことはできるかもしれません。一時的であってもプラット・ホームが提供している資源を使い果たすことになるので、平行して HPET timer 資源を獲得しようとするプロセスがあるのならば、資源獲得競争で期待した動作にならない可能性を考慮した方が良いでしょう。

drivers/char/hpet.c 内のデータ構造と HPET の対応を見ていきます。hpet_acpi_add() の中でローカル変数として確保した hpet_data 構造体に call back で呼ばれた hpet_resources() が HPET ブロックの物理アドレス(hd_phys_address)、論理アドレス(hd_address)、timer 数(hd_nirqs)、複数の IRQ 番号(id_irq)を格納していきます。

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

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


添付ファイル: fileDevHpet.xlsx 129件 [詳細] filehpet-driver-data-structure.oxps 96件 [詳細] fileHPETPCModel.png 272件 [詳細] fileHPETStructureWithDataStructure.png 379件 [詳細] fileHPETStructureInLinuxKernelDriver.png 295件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-07 (火) 12:29:30 (2365d)