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

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

目標を次のように設定。

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

そのための覚書です。

 

・・・・・

一旦分からなかったところを勉強しなおそうと思って、時間を取ったのですが、まったく時間が足りませんでした。

 

何が問題だったか?

それは、勉強するためには、「何の」「何を」学べば良いかがわからなかった。もしくは探すのに時間がかかった(かかっている)。

まぁそんな状況です。何はともあれ、一週間後には戻ってくると決めたので戻りました。

 

それにしても、一週間離れると何をやってきたかについても、すっかり忘れます。

過去にやったことを復習しに行って、戻ってきたらまたこれまでのことを復習する、非効率な感じはしますがその分学んでいるのでしょうか・・・。

 

◆ asmhead.nasの謎の100行の説明

 

CPUのモードを切り替えている作業中に、割り込みがくると困るから、割り込み禁止の命令。

「NOP命令」は何もしない命令。CPUは1クロック休憩。

 

関数init_keyboardとまったく同じ。キーボードコントローラーにコマンドを送っている。
キーボードコントローラーのおまけ出力ポートに0xdfというデータを出力しなさいと命令。
oxdfは、A20GATE信号機がONになる。メモリの1MB以上の部分を使えるようにできる。

 

INSTRSET命令:LGDT命令とかEAXとかCR0とか、386以降のキーワードを使いたいから。

プロテクトモード。セグメントレジスタの解釈が16倍ではなくて、GDTを使うようになるモード。
アプリケーションが勝手にセグメントの設定を変えられなくなる、OS用のセグメントを使うこともできなくなる。

CR0レジスタ?

 

memcpyという関数を呼び出している。

memcpyはメモリをコピーする関数。memcpy (転送元番地, 転送先番地, 転送サイズ)
サイズはダブルワード単位。

真ん中は、
memcpy ( 0x7c00, DSKCAC, 512/4 );
⇒ 0x00007c00番地から512バイトを、0x001000000番地(DSKCAC)へコピー

その次は、
memcpy ( DSKCAC+512, DSKCAC+512, cyls * 512*18*2/4 – 512/4 );
⇒ 0x00008200番地からのディスクの中身を、0x00100200番地へコピー

最初は、
memcpy ( bootpack, BOTPAK, 512* 1024/4 );
⇒ bootpack番地から512KBを、0x00280000番地へコピー。bootpackはasmhead.nasの一番最後にあるラベル。

 

こちらも、memcpyしている。

bootpack.hrbのヘッダを解析して、実行に必要なデータを転送している。

[EBX+16]・・・bootpack.hrbの16番地。値は 0x11a8
[EBX+20]・・・bootpack.hrbの20番地。値は0x10c8
[EBX+12]・・・bootpack.hrbの12番地。値は0x00310000

SHR命令は右シフト命令。ECX >>= 2

JZは条件ジャンプ命令。「jump if zero」

 

はりぼてOSのメモリマップ。

0x00000000 – 0x000fffff:起動中にいろいろ使うけど、その後は空き(1MB)
0x00100000 – 0x00267fff:フロッピーディスクの内容記憶用(1440KB)
0x00268000 – 0x0026f7ff:あき(30KB)
0x0026f800 – 0x0026ffff:IDT(2KB)
0x00270000 – 0x0027ffff:GDT(64KB)
0x00280000 – 0x002fffff:bootpack.hrb(512KB)
0x00300000 – 0x003fffff:スタックなど(1MB)
0x00400000 –       :あき

 

waitkbdoutの処理をするところ。wait_KBC_sendreadyと同じ。

JNZはJZの逆。「jump if not zero」

 

memcpy。メモリのコピー。

 

ALIGNB命令:切りが良くなるまでDB 0を入れなさいという命令。
「切りが良くなる」ALIGNB 16の場合は、番地が16で割り切れることが切りがよいということ。

GDTラベルの番地が8の倍数になっていないと、セグメントレジスタへのMOVが遅くなるとのこと。

 

bootpack.cのHariMainにおいて、GDTとIDTを作り直している。

 

以上。

 

 

スポンサーリンク