プログラミング関連での備忘録なんかを載せています。
カレンダー
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
プロフィール
HN:
たっく
年齢:
42
性別:
男性
誕生日:
1982/03/11
職業:
システムエンジニアなの?
おすすめ
最新コメント
最新記事
(11/15)
(11/15)
(11/15)
(11/08)
(11/07)
最新トラックバック
ブログ内検索
最古記事
(11/06)
(11/07)
(11/07)
(11/07)
(11/07)
アクセス解析
3日目を始めます。
まずは2日目のおさらいですが、2日目はプログラム本体の部分をアセンブリ言語で記述したのと、ブートセクタのみをアセンブルするようにしました。
また、Makefileを作ってアセンブルからフロッピーディスクイメージ作成までをコマンド一発で行えるようにしました。
3日目の内容は、「32ビットモード突入とC言語導入」です。
まず、今まで作ったものは画面に文字を表示するだけで、他には何もしません。でも、本来はここからOSを読み出さなければいけないので、ブートセクタ以降のセクタを読み込んでいきます。
今回大きく変わったのは、以下の部分です。
; プログラム本体 entry: MOV AX,0 ; レジスタ初期化 MOV SS,AX MOV SP,0x7c00 MOV DS,AX ; ディスクを読む MOV AX, 0x0820 MOV ES, AX MOV CH, 0 ; シリンダ0 MOV DH, 0 ; ヘッド0 MOV CL, 2 ; セクタ2 readloop: MOV SI, 0 ; 失敗回数を数えるレジスタ retry: MOV AH, 0x02 ; AH=0x02 : こうする事でディスク読み込み MOV AL, 1 ; 1セクタ MOV BX, 0 MOV DL, 0x00 ; Aドライブ INT 0x13 ; ディスクBIOS呼び出し JNC next ; エラーがなあければnextに飛ぶ ADD SI, 1 ; SIに1を足す CMP SI, 5 ; SIを5と比較 JAE error ; SI >= 5 だったら、、errorへとぶ MOV AH, 0x00 ; | MOV DL, 0x00 ; | Aドライブ INT 0x13 ; | ドライブのリセット JMP retry next: MOV AX, ES ; | アドレスを0x200すすめる ADD AX, 0x0020 ; | MOV ES, AX ; | ADD ES, 0x020ができないからこうしている ADD CL, 1 CMP CL, 18 ; CLと18比較 JBE readloop ; CL <= 18 だったらreadloopへ MOV CL, 1 ADD DH, 1 CMP DH, 2 JB readloop ; DH < 2だったらreadloopへ飛ぶ MOV DH, 0 ADD CH, 1 CMP CH,CYLS JB readloop ; CH < CYLS だったらreadloopへ飛ぶ ; ここまででフロッピーディスクの先頭から180KByteまでを読み込んだので、 ; 次はOS部分を実行させる MOV [0x0ff0], CH ; IPLがどこまで読んだのかをメモ JMP 0xc200
何をしているかというと、
- ブートセクタの部分(フロッピーの最初の512byte)は起動時にメモリに読み込まれているので、その次のセクタから、10シリンダ分(180kbyte)までをメモリに読み込む。
- 読み込んだ結果、メモリの0xc200にOS部分の先頭があるはずなので、そこにJMP命令で飛んでいよいよOS部分の処理を走らせる(ブートセクタ卒業)
これで、ブートセクタ部分の開発はひとまず終了の様です。
それと今回は、OSの本体部分の着手もしました。
以下がOS本体部分のソースです。
ファイル名は、「oslite.asm」です。
※「30日でできる!OS自作入門」ではhariboteOSという名前で開発を行っていますが、それじゃつまらないので、私はosliteと言う名前にしています。
; oslite-os ; TAB=8 ORG 0xc200 MOV AL, 0x13 ; VGAグラフィックス, 320x320x8bitカラー MOV AH, 0x00 INT 0x10 fin: HLT JMP fin
で、このOS部分をフロッピーにファイルとして保存するのですが、ここでまた著者製のedimg.exeでフロッピーに書き込むと言うことを行っています。
2日目では、catコマンドを使用してブートセクタとそれ以降のデータをくっつけてイメージファイルを作りましたが、今回は単純にくっつけるだけではなく、その中にOS部分を書き込まなければいけなくなりました。
色々と調べていたら、ddコマンドで既存のファイルの特定の場所を上書き出来るという事が分かった為、Makefileを以下の様に変更しました。
# フロッピーディスク作成 helloos.img : ./bin/ipl.bin ./bin/oslite.sys ./bin/initflpimg.bin Makefile # フロッピーディスクのイメージの元となるファイルをコピー cp ./bin/initflpimg.bin ./bin/fdimage/oslite.img # iplを書き込み dd if=./bin/ipl.bin of=./bin/fdimage/oslite.img count=1 bs=512 conv=notrunc # イメージファイルの0x002600以降にoslite.sysというファイル名を書き込み dd if=./bin/osname.bin of=./bin/fdimage/oslite.img count=1 bs=512 seek=19 conv=notrunc # イメージファイルの0x004200以降にOS部分を書き込み dd if=./bin/oslite.sys of=./bin/fdimage/oslite.img count=1 bs=512 seek=33 conv=notrunc ./bin/ipl.bin : ./src/ipl.asm Makefile nasm ./src/ipl.asm -o ./bin/ipl.bin -l ipl.lst ./bin/oslite.sys : ./src/oslite.asm Makefile nasm ./src/oslite.asm -o ./bin/oslite.sys -l oslite.lst clean : rm -f ipl.lst rm -f ./bin/ipl.bin rm -f ./bin/fdimage/*.img
なんか、FAT12のファイルフォーマットを結構無視している気がしてきましたが、困ってしまうまではこの方法で行きます。
※付属CDの中をよくみたら、edimg.exeのC言語のソースファイルがありました。本格的に困ったら、コンパイルして使わせてもらおうと思います。著者様、ありがとうございます。
ここまで出来たので、makeを実行しイメージファイルを作成しました。
で、出来たイメージファイルを早速VMWareに読み込ませて起動してみると・・・・
できました〜。
え?黒いのは正しいですよ。
OS部分でグラフィックモードと言う物に変更しているので、今まであったカーソルすら消えています。
さて、今回学んだことをまとめると、
ブートセクタ部分は結局512Byte分しかないので、複雑な事をやるのなら他のセクタも読み込まなければいけない。
その為、ブートセクタでは他のセクタを読み込んで、次のプログラムがある場所へ処理を移すと言うことをやる。
と言うことになりますね。
漠然としか分かっていなかったブートの仕組みが、実際作ってみて理解出来ました。
次回は、3日目 その2として、32bitモードへの移行と、C言語での開発を行います。
いよいよC言語がでてきます。
PR
この記事にコメントする