やる気がストロングZERO

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

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

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

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

第七章:割り込みとFIFOで得た知見

マウス操作があったときなどは「割り込み」を発生させてマウス移動などの処理を行わせるが、具体的に「割り込み」とはどういうことが行われているのかをふんわりとイメージできた。

割り込みベクタ

割り込みには種類がある。マウス入力や、0除算の発生や、HDDの書き込み終了時に発生する割り込みはそれぞれ種類が異なる。 この割り込み種別毎に番号が振られていて、これを割り込みベクタと呼ぶらしい。

割り込みベクタはx86-64だと0-255のどれかということになる。

割り込みベクタ毎に割り込みハンドラを紐づけておけば、その割り込みが発生した際には紐づけたハンドラが実行される、という流れ。

割り込みベクタと割り込みハンドラを紐づけるためのIDTテーブルと呼ばれるテーブルデータ構造が存在し、この構造をメモリ上に作成してそのアドレスをCPUの特定の手法でレジスタに書き込んでおくことで、割り込みベクタとハンドラの紐づけ設定を行う。

IDTテーブルはデータのメモリ配置が重要なので、コンパイラコンパイル時に自動的を最適化行わないように設定しなければならない。

MSI割り込み

ハード側(マウスやHDD)から見た場合、割り込みを発生させる方法が必要になる。 xHCIが割り込みの発生方法として採用しているのがMSI割り込みである。

MSI割り込みとは、特定のメモリアドレスの書き込みにより割り込みをCPUに伝える方法である。 どういう値を書き込めばよいのかはCPU側の仕様による。

x86-64の場合は、MessageAddressレジスタとMessageDataレジスタを使うらしい。 割り込み対象のCPUとベクタ番号を伝えることで、IDTテーブルで設定した対象のベクタに対するハンドラが起動する。