やる気がストロングZERO

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

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

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

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

第六章:マウス入力とPCIを読んで得た知見

USBマウスの認識のされ方

マウスはUSBで接続されているが、CPUから見るとPCIという規格の接続経路上にそれらがあるように見える。 PCIとはCPUと周辺機器(メモリやUSBや各種ドライブなど)をつなぐバス(経路)の事である。 マウスからの入力をカーネルで処理するには、PCIに接続されている機器をすべて見つけ、その中からマウスを見つけ、ドライバプログラムを使って初期化し、入力を受けるとマウスポインタの位置を調整するObserver処理を実行させるようにする。

PCI接続機器とのやり取りについて

PCI接続機器はPCIの規格にそったコンフィグデータを持っている。 これを読み取ることで機器の情報(マウスなのか、HDDなのか、どこのベンダーのものかなど)を知ることができる。 読み取り方法に癖があって(物理デバイスとやり取りする一般的な手法をあまり知らないのでそう思った)、IOアドレス空間の特定のアドレスに対して設定した値によって、別の特定のアドレスに指定PCI機器のコンフィグが設定されるのでそれを読み取る、ということをするらしい。

PCI接続機器の操作について

PCI接続機器の操作にはその機器のレジスタを使用するらしいが、メモリマップドIOと呼ばれる方法でレジスタにアクセスする。 メモリマップドIOとは、カーネルからはメモリに見える空間上(メモリアドレスで読み書きできる)にPCI機器のレジスタがマップされていて、メモリにアクセスするようにこのアドレスにアクセスすると、PCI機器のレジスタにアクセスできる、というIO方法の事。 実際にどのアドレスがレジスタにマップされているかは、上記のコンフィグデータに記載されている。

割り込みハンドラの高速化

マウスから入力があると割り込みが発生し、そこでマウスからの入力値を読み取り処理を行う。 ただし、割り込みハンドラ内でマウスカーソルの再描画までやってるとその間他の割り込みが処理できないので、キューをつかって割り込みの事実をメモしておき、割り込み処理の外で(別ループで)マウスカーソルの描画をやるようにする。