個人用雑記

勉強したことを書いていければなーと

30日でできる!OS自作入門(Day 7)

Day 6の勘違いについて

Day 6でマウスが動かないのは動きに対応した画像の移動を作成していないからだと思っていたが、そもそもまだマウスの割り込みすら受け取れない設定だったらしい。ちなみにマウスを動かせるのはDay 8。

キーボードの入力

Day 6ではキーボードの割り込みを受け取ることには成功したわけだが、肝心の何のキーが押されたかを受け取れていないし、何なら一度割り込みが発生したらそのあとずっとHLT命令を実行しているため何もできなくなる。そこで、まずはマウスより先にキーボードの入力を受け取れるように変更する。(これが結果的にマウスの割り込みを学ぶにあたって力になる。)
そもそも、今のコードでは割り込みを一回しか受け付けられないのは割り込みを受け取ったことをPICに返していないからで、割り込みが発生して処理している間は他の割り込みができない仕様になっているからきちんと割り込みを受け取ったことを教えなければいけない。また当然ながら割り込みを受け取ったことはできる限り早くPICに伝え、次の割り込みに対して受け取れる準備をしなければならないため、割り込みでの処理は割り込みを先に終わらせてから実行するべきということになる。

FIFOを使う

割り込み発生時のレジスタの値はスタック、つまりFILO型のデータ構造に収納したわけだが、割り込みの処理はFIFO型のデータ構造で行わなければならない。そうしないといつまでも最初の割り込みでやりたかったことが行われないかもしれないし・・・
可能であればキューにポンポン入れていきたいけれど、そんな便利なデータ構造はない。という感じなのでとりあえずリングバッファを使って対処する。(とはいえバッファサイズを超えた時は拡張するわけではなく諦めてもらうコードになっているけれど)
この辺はまぁ次にデータを入れる位置と、次に取り出すべきデータがどこに入っているかがわかればなんとかなるので単純な実装で実現できる。そして割り込みが発生した時はとりあえずバッファにデータを入れるところまでやっておけばあとは割り込みが発生していない時に適宜そのデータを処理すればいいことになる。

マウスにも拡張する

じゃあすぐにマウスにも適用できるかというとそうでもなくて、マウスはキーボードと違って2つの装置に割り込みの許可をしなくてはいけないらしい。具体的には、
マウス→マウスの制御回路→キーボードの制御回路→CPU
という構造になっていて、まず先にキーボードの制御回路でマウスの制御回路の許可を出してからマウスの制御回路でマウスの許可を出すという手順が必要になる。普通にめんどいし、順番を変えてしまうとマウスの割り込みがキーボードの制御回路よりも先に来た時にうけとれないことになっちゃう。
とはいえ、割り込みの許可さえ出せればあとはキーボードのデータ受け取りとほとんど同じように動かすことができる。違うところとしてはマウスが接続されているPICの位置がCPU→IRQ-2→IRQ-15となっているから、割り込みを受け付けたことをIRQ-15に知らせた後にIRQ-2にも知らせないといけないことくらい。

Day 8へ

表面上は大して何もやってないように見えるけど裏ではOSにほぼ必須といえる機能を作っていて、縁の下の力持ち感がすごい。
エミュレータでマウスぐりぐりしながらキーボード連打しても適切に動いてるしCPUの速さには勝てなかったよ・・・
Day 8ではついにマウスを動かせるようになるらしいけど、先にようやく1週間分終わったし1週間の総まとめみたいなのを作りたい気持ちもある。

そして相変わらず画面の進捗がないので写真もない。