やる気がストロングZERO

やる気のストロングスタイル

「ゼロからのOS自作入門」を読んでる 11

ゼロからのOS自作入門を少しずつ読んでいる。

実際にCやC++でコードを書きながら読むのが良いと思われるが、自分は時間の都合で要点要点を読んでいくような読み方をしている。 以下、読んで得た自分の認識をメモしていく。(理解できてない部分あるので間違いはあるかもしれない。)

第11章:タイマとACPIで得た知見

定期的になにかを行いたい場合がある。例えば定期的に画面を再描画したいなど。 こういうとき時間を測る必要がある。

Local APICタイマという機能があってこれが使える。CPUではなく周辺機器の機能っぽい。1CPUに対し1つある。

使い方

4種類ほどのレジスタがあり、カウンタ初期値を設定するとクロック周期に従ってカウンタを減らしていき、0になったタイミングで予め登録した割り込みを実行させる感じ。

1CPUに対して1つしかないため、複数の処理で時間を測るには工夫がいる。

Local APICタイマを短い単位時間で割り込みを発生させ、割り込みが発生したことをキューに追加する。 キューを監視しているループでそれをキャッチし、カウンターをカウントアップさせる。(このときhlt命令をつかっておくことで割り込み発生までCPUを休ませることができる。)

タイムアウト値を保持した複数のtimerオブジェクトの優先度付きキューを用意しておき、それぞれがタイムアウトに達しているかどうかをチェックする。 タイムアウトしていればそれを通知するキューに追加し、メインスレッドにて検知し何らかの処理を行うことができる感じ。(言葉で表現するのムズい)

Local APICタイマは周期が機器によってかなり差があり実際の時間として測るのが難しいが、ACPI PMタイマの機能を使うことによって1周期の時間を現実の時間換算に計算することができる。