「OSを作れる」「仕組みが学べる」という言葉に惹かれて、プログラミング軽くかじった程度の私が、OSを自作しようと思い立ちました。

2019年の目標の一つは『OS自作入門でOSを作る』です。

目標を次のように設定。

「2019年3月31日までに、完読してわからないなりにもOSを自作してみよう。」

そのための覚書です。

 

・・・・・

マウスを動かすために、割り込みをできるようにしているところです。

GDT, IDT, PICの初期化をして割り込み受付プログラムをつくりました。現時点では、設定不足でマウスが思うように動かない状況です。

 

マウスをどうこうする前に、キーボードで練習して理解を深めるとのこと。

 

◆ harib04a (キーコード取得)

“int.c” のinthandler21を改造。

 

「io_out8(PIC0_OCW2, 0x61);」 PICに対して、IRQ1が発生したことがわかったよ、と知らせる。IRQ3だったら、0x63を書き込む。これをやると、PICはIRQ1をしっかり見張ろうと思ってくれる(見張りを再開させている)

IRQ1:キーボード
IRQ12:マウス

http://oswiki.osask.jp/?(PIC)8259A

 

その次に、装置番号0x0060から8ビットを入力する。キーコード。

http://oswiki.osask.jp/?(AT)keyboard

 

「make run」して “E”を押したり離したりすると、16進数がでました。

 

◆ harib04b (割り込み処理を手早く)

割り込み処理中は、他の割り込みが受け付けられなくなるので、割り込みはすぐに終わらせなくてはならない。

そのための改造。

「割り込み処理ではとりあえずキーデータを受け取って変数にして保存しておいて、HariMainのほうその変数をたまにチェックして、データが入ったら表示する」

キー入力に関するバッファを考えて、それを構造体にまとめたものを「keybuf」。この中の「flag」という変数が、バッファに空きがあるかどうかを表している。

 

「io_cli命令」で割り込みを禁止する。

割り込み禁止後、flagが0だったらすることがないのでio_hltと思いきや、このままHLT命令を実行するとキーを押しても反応できなくなるので、STIとHLTの両方をする。それが io_stihlt。

elseは、if文の続きで、if文の中の条件式が成立しなかった場合、以下の{}を実行してくださいという意味。

 

これで、「make run」して、Ctrlキーを押すと、押しても離しても「E0」。本来であれば、押して「E0 1D」離して「E0 9D」となるはず。

 

◆ harib04c (FIFOバッファを作る)

原因は、著者の作ったバッファが1バイトしか覚えられないため。

今回必要なバッファはFIFO型。「ABC」と入力して「CBA」と逆順で取り出すことになったら困るから。

最初、keybuf.next は0なので、最初のデータは keybuf.data[0]に記憶される。次のデータは[1]にというように記憶できる場所が32個。

 

やっていることは、

data[0] = data[1] ;
data[1] = data[2] ;
data[2] = data[3] ;

というように、データが詰まっている範囲をずらしている。ずらしておかないとdata[0]でデータが受け取れなくなるから。

 

これで、「make run」するとうまくいく。

しかし、かりにずらし作業が32個も行うようだとよろしくないので、次章で改良する。

 

・・・・・

結局、今回もマウスは動かせない。

割り込みを行うにも、知識と知恵と工夫がいることが、ざっくりとわかりました。

 

以上。

スポンサーリンク