OS自作入門を読んだ感想です。 完全な理解ではないので、適当に書かれています。 MacOSXでやったので、以下を参考にしました。 http://d.hatena.ne.jp/sandai/20120728/p2 https://github.com/sandai/30nichideosjisaku 本書で不足してる部分はこちら http://softwaretechnique.web.fc2.com/OS_Development/index.html 1日目 helloos.imgをバイナリエディタで書きます。 NASMというアセンブラを改良した筆者作のnaskというアセンブラでアセンブラ初体験。 バイナリエディタで書いたものをアセンブラ記述で18万行を超えるコードを書きます。(DB命令のみ) RESB命令も使って省略出来る部分を省略し、22行にまとめたコードを書きます。 この時点では意味不明なソースコードなので、コメントやもう少し意味が分かりやすい命令を使って50行のコードを書きます。 セクタ:フロッピーディスクは512バイトずつまとめて読み書きするので、512バイトを1セクタと呼ぶ。フロッピーディスクは約1440kb、つまり2880セクタで構成される。 ブートセクタ:フロッピーディスクの最初のセクタのことで、PCはまず最初のセクタを読み、最後の2バイトを見ます。この2バイトが「55 AA」でなければ、起動に必要なプログラムではないと解釈されてしまう。 IPL:initial program loader。普通のOSはまずブートセクタを読み、最後の55 AAを確認した後、その最初のセクタでOS本体を読み込むプログラムが書かれている。OS本体を読み込むための初期プログラム読み込み機のことをIPLと呼ぶが、ブートセクタと考えてよい。 2日目 テキストエディタの紹介でTeraPadを紹介される。 レジスタの説明。 INT命令で使うBIOS関数(Basic Input Output System)の詳細 http://community.osdev.info/?(AT)BIOS HLT命令について。 ORG命令の0x7c00とは一体何かの説明。 http://community.osdev.info/?(AT)memorymap ブートセクタが読み込むアドレスは既に決まっていて、0x00007c00 - 0x00007dffを読み込む。 Makefileの使い方について。 レジスタに[]をつけると、そのレジスタに代入されている数値のアドレスを参照する。 新出命令、単語 MOV命令 CMP命令 JE命令 INT命令:interrupt。ソフトウェア割り込み命令。BIOS関数の呼び出しと考えてよい。 HLT命令:halt。CPU停止命令。 3日目 ちゃんとしたIPLの作成。 フロッピーディスクの説明。 ここでは、0x8000以降のアドレスを使うことに。 harib00aはブートセクタから次のセクタを読み込むように改良。読み込めなかったら失敗。 harib00bはすぐ失敗ではなく、エラー回数5回で失敗にするよう改良。 harib00cは18セクタまでどんどん読むように改良 harib00dは10シリンダまで読むように改良 harib00eは空のディスクに対してHLTだけ行うプログラムを書き込んだ際にどこのアドレスに書き込まれるのかを確認する harib00fはブートセクタからOS本体のセクタへ飛んでOSを実行する。ブートセクタから一つ前に確認したアドレス(ブートセクタ分だけずらして)へ飛ぶ。 harib00gは画面モード切り替えで黒い画面の表示 harib00hは32bitモードへ準備。ここで16bitとはおさらばして、C言語が使えるようになるので、その前にやっておくべきことをしておく。画面モードに関する情報とキーボードの情報をメモリに書き込んでおく。 harib00iは32bitモードへ移行し、本格的にC言語を導入。 新出命令、単語 JC命令 ヘッド:表の0と裏の1があり、表裏に書き込める シリンダ:同心円上に0から79の80個の区分がされてるイメージ セクタ:シリンダをさらに18個に区分している フロッピーディスクの容量は2ヘッドx80シリンダx18セクタx512バイト=1440kb