忍者ブログ
2024.11│ 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
プログラミング関連での備忘録なんかを載せています。
カレンダー
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
職業:
システムエンジニアなの?
最新コメント
最新トラックバック
ブログ内検索
アーカイブ
アクセス解析
2024年11月23日 (Sat)
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2009年11月08日 (Sun)

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


何をしているかというと、
  1. ブートセクタの部分(フロッピーの最初の512byte)は起動時にメモリに読み込まれているので、その次のセクタから、10シリンダ分(180kbyte)までをメモリに読み込む。
  2. 読み込んだ結果、メモリの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に読み込ませて起動してみると・・・・
20c4495c.png

できました〜。
え?黒いのは正しいですよ。
OS部分でグラフィックモードと言う物に変更しているので、今まであったカーソルすら消えています。

さて、今回学んだことをまとめると、
ブートセクタ部分は結局512Byte分しかないので、複雑な事をやるのなら他のセクタも読み込まなければいけない。
その為、ブートセクタでは他のセクタを読み込んで、次のプログラムがある場所へ処理を移すと言うことをやる。
と言うことになりますね。

漠然としか分かっていなかったブートの仕組みが、実際作ってみて理解出来ました。
次回は、3日目 その2として、32bitモードへの移行と、C言語での開発を行います。

いよいよC言語がでてきます。

PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
←No.10No.9No.8No.7No.5No.4No.3No.2No.1