HPET

base version : v0.1.0

 

HPETとは

HPETとは最近のx86アーキテクチャーにおいて時間計測を高精度で行えるタイマーである。詳しい話はこのブログ記事が参考になる。

PICのタイマーは雑魚いし、APICタイマーは動作周波数に依存するので、正確な時間計測が行えない。なので、数百us待つ、みたいな状況ではHPETを使うのが良い。ちなみに、HPET程の分解能はないが、似たような用途としてはACPI PMタイマーも使える。→いろんなタイマーの話

 

また、APICタイマーの方が高精度なので、HPETを用いてAPICタイマーのカウントを計測する事で、APICタイマーのカウント辺りの経過時刻を測定し、APICタイマーで正確な時間測定を行えるようにする事ができる。

APICタイマーについては、外部ハードウェアであるHPETと比べるとAPICの内部にあるAPICタイマーの方がCPUに近くて、アクセス遅延とかで有利なんじゃないかと思うのだけど、確証はない。

 

初期化

HPETに関する基本的な情報(レジスタのベースアドレスとか)はACPI(→ACPICA)から取得できる。kernel/dev/hpet.h#L52

kernel/dev/hpet.h#L59ではHPETの分解能をレジスタから取得し、1カウントが何ナノ秒かを算出している。この_cnt_clk_periodという変数は、Timerクラスから継承したもので、実体はRaph_Library/rlib/timer.hにある。

 

カウンタ値の取得

kernel/dev/hpet.h#L79ではレジスタにアクセスし、カウンタ値を取得している。この値の差分を用いる事で経過時間を測定できる。経過時間の計測等はTimerクラス上に実装されているので、HPETドライバーは関与しない。

ちなみに、カウンタ値の取得はコードを見てもらえれば分かる通り、ただの64bitメモリアクセスである。こう書くと低コストなように思えるが、実体はメモリマップドI/Oによるハードウェアアクセスなので、遅い。全般的にメモリマップドI/Oはメモリアクセスだから大丈夫っしょ、と馬鹿にしていると痛い目を見る。

例えば、経過時刻よりもカウンタ値の取得の方が時間が掛かって、正確な時間計測ができない、とかね。

 

その他

HPETには割り込みによる時刻通知があるが、現状ではRaph KernelではHPETによる割り込みを用いていない。実装の残骸がkernel/dev/hpet.h#L81にあるが、動くかどうかは不明。ちなみに、HPETの割り込みにはワンショットモード(Xナノ秒後に一回割り込み)と周期的モード(Xナノ秒間隔で周期的に割り込み)の二種類のモードがあり、それを複数存在するテーブルに対して個別に設定できる。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中