引き続き。。

72.3kg

 

変わらないな。(変えなくちゃならないって思っているが。。)

という訳で、あれからずっと色々と調べているが、全く進展なし。。。(Orz...)

 

gdbを使って動きを調べてみようと思ったが、シンボルが読み込まれて

いないって事で、上手くデバッガが使えない。。。

 

むむむ。。。悩んで色々やっていたが、なんとqemu自体で色々できるって

当たり前の所に戻った。(涙)

ここにも、素敵な方が。

qemu monitorを使って自作OSをデバッグする - Yabu.log

 

まぁ、そもそもqemuもオプションの意味も良く分からず使ってるしな。。

qemu実行時のオプションに、-monitor stdioってのをつけるとデバッグ用の

モニタが使えるらしい。。

 

Makefileより抜粋 〜

qemu-system-i386 -L . -m 32 -monitor stdio -s -drive  file=haribote.img,format=raw,if=floppy -boot a

 

ipl10.nasの中で、下記のような事をして進んだ場所をチェックしている。

MOV   [0x0ff0],CH    ; IPLがどこまで読んだのかをメモ

これ使えるかも。。

 

まずは、実行してみて

$ make run

make -r img

make -r haribote.img

nasm ipl10.nas -o ipl10.bin -l ipl10.lst

nasm -f elf32 asmhead.nas -o asmhead.bin -l asmhead.lst

nasm -f elf32 naskfunc.nas -o naskfunc.o -l naskfunc.lst

x86_64-elf-gcc -c -g -march=i486 -m32 -nostdlib bootpack.c -o bootpack.o

x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld bootpack.o naskfunc.o

cat asmhead.bin bootpack.hrb > haribote.sys

mformat -f 1440 -C -B ipl10.bin -i haribote.img ::

mcopy -i haribote.img haribote.sys ::

qemu-system-i386 -L . -m 32 -monitor stdio -s -drive file=haribote.img,format=raw,if=floppy -boot a

QEMU 5.0.0 monitor - type 'help' for more information

(qemu) 

 

上のWebにあるコマンド見ながら、そもそもちゃんとメモリ上に思っている

ものが読み込まれているのか?確認してみようかと。。

 

まず、ipl10.binは、

hexdump ipl10.bin | less

 

0000000 eb 4e 90 48 41 52 49 42 4f 54 45 00 02 01 01 00

0000010 02 e0 00 40 0b f0 09 00 12 00 02 00 00 00 00 00

0000020 40 0b 00 00 00 00 29 ff ff ff ff 48 41 52 49 42

0000030 4f 54 45 4f 53 20 46 41 54 31 32 20 20 20 00 00

0000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0000050 b8 00 00 8e d0 bc 00 7c 8e d8 b8 20 08 8e c0 b5

0000060 00 b6 00 b1 02 be 00 00 b4 02 b0 01 bb 00 00 b2

0000070 00 cd 13 73 10 83 c6 01 83 fe 05 73 37 b4 00 b2

0000080 00 cd 13 eb e3 8c c0 83 c0 20 8e c0 80 c1 01 80

0000090 f9 12 76 d1 b1 01 80 c6 01 80 fe 02 72 c7 b6 00

00000a0 80 c5 01 80 fd 0a 72 bd 88 2e f0 0f c6 06 f1 0f

00000b0 0b e9 7c 46 be cc 7c 8a 04 83 c6 01 3c 00 74 09

00000c0 b4 0e bb 0f 00 cd 10 eb ee f4 eb fd 0a 0a 6c 6f

00000d0 61 64 20 65 72 72 6f 72 0a 00 00 00 00 00 00 00

00000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

*

00001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

0000200

 

これは、0x7c00に読み込まれるという事だったので、qemuモニタで

ここを調べてみよう。

(qemu) xp/300xh 0x7c00

0000000000007c00: 0x4eeb 0x4890 0x5241 0x4249 0x544f 0x0045 0x0102 0x0001

0000000000007c10: 0xe002 0x4000 0xf00b 0x0009 0x0012 0x0002 0x0000 0x0000

0000000000007c20: 0x0000 0x0000 0x0000 0xe529 0xd76e 0x4e2c 0x204f 0x414e

0000000000007c30: 0x454d 0x2020 0x2020 0x4146 0x3154 0x2032 0x2020 0x0000

0000000000007c40: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007c50: 0x00b8 0x8e00 0xbcd0 0x7c00 0xd88e 0x20b8 0x8e08 0xb5c0

0000000000007c60: 0xb600 0xb100 0xbe02 0x0000 0x02b4 0x01b0 0x00bb 0xb200

0000000000007c70: 0xcd00 0x7313 0x8310 0x01c6 0xfe83 0x7305 0xb437 0xb200

0000000000007c80: 0xcd00 0xeb13 0x8ce3 0x83c0 0x20c0 0xc08e 0xc180 0x8001

0000000000007c90: 0x12f9 0xd176 0x01b1 0xc680 0x8001 0x02fe 0xc772 0x00b6

0000000000007ca0: 0xc580 0x8001 0x0afd 0xbd72 0x2e88 0x0ff0 0x06c6 0x0ff1

0000000000007cb0: 0xe90b 0x467c 0xccbe 0x8a7c 0x8304 0x01c6 0x003c 0x0974

0000000000007cc0: 0x0eb4 0x0fbb 0xcd00 0xeb10 0xf4ee 0xfdeb 0x0a0a 0x6f6c

0000000000007cd0: 0x6461 0x6520 0x7272 0x726f 0x000a 0x0000 0x0000 0x0000

0000000000007ce0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007cf0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d00: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d10: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d20: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d30: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d40: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d50: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d60: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d70: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d80: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007d90: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007da0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007db0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007dc0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007dd0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007de0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000007df0: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0xaa55

 

ふむ。読み込まれてるんだな。。

次に、進捗チェックのフラグを見てみる。

(qemu) xp/100xh 0x0ff0

0000000000000ff0: 0x000a 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001000: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001020: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

あった!じゃ、ipl10.nasはちゃんと動いているのかな。。

下記を、iplからasmheadへjumpする直前に下記を追記

 

MOV             BYTE [0x0ff1],0x0b      ; 進捗チェック用フラグ

(qemu) xp/100xh 0x0ff0

0000000000000ff0: 0x0b0a 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001000: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001020: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

ふむ。

ブートはちゃんとしてるんだな。。。

じゃ、次はasmhead以降。。

ここで、また問題が。。

 

そのまま実行した場合。

f:id:kanazo3:20200518082942j:plain

 

asmhead.binを確認

$ hexdump asmhead.bin | less

0000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

0000010 01 00 03 00 01 00 00 00 00 00 00 00 00 00 00 00

0000020 40 00 00 00 00 00 00 00 34 00 00 00 00 00 28 00

0000030 06 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00

0000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

*

0000060 00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00

0000070 06 00 00 00 00 00 00 00 30 01 00 00 30 01 00 00

0000080 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00

0000090 07 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00

00000a0 60 02 00 00 2b 00 00 00 00 00 00 00 00 00 00 00

00000b0 01 00 00 00 00 00 00 00 11 00 00 00 02 00 00 00

00000c0 00 00 00 00 00 00 00 00 90 02 00 00 30 01 00 00

00000d0 04 00 00 00 13 00 00 00 04 00 00 00 10 00 00 00

00000e0 19 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00

00000f0 c0 03 00 00 7d 00 00 00 00 00 00 00 00 00 00 00

0000100 01 00 00 00 00 00 00 00 21 00 00 00 09 00 00 00

0000110 00 00 00 00 00 00 00 00 40 04 00 00 18 00 00 00

0000120 03 00 00 00 01 00 00 00 04 00 00 00 08 00 00 00

0000130 b0 13 b4 00 cd 10 c6 05 f2 0f 00 00 08 66 c7 05

0000140 f4 0f 00 00 40 01 66 c7 05 f6 0f 00 00 c8 00 c7

0000150 05 f8 0f 00 00 00 00 0a 00 b4 02 cd 16 a2 f1 0f

0000160 00 00 b0 ff e6 21 90 e6 a1 fa e8 ac 00 00 00 b0

0000170 d1 e6 64 e8 a3 00 00 00 b0 df e6 60 e8 9a 00 00

0000180 00 0f 01 15 2a 01 00 00 0f 20 c0 25 ff ff ff 7f

 

0x0130へipl10.binからJumpさせてるので、ここにちょっと

ipl同様、一番頭に動作確認用のコードを入れてみた。

16                                 ;  ORG  0xc200   ; このプログラムがどこに読み込まれるのか 

17

18                                 ; 画面モードを設定

19                                  

20 00000000 C605F20F00000C            MOV  BYTE [0x0ff2], 0x0c    ; 進み具合テスト1 

21                                                  

22 00000007 B013                      MOV  AL,0x13   ; VGAグラフィックス、320x200x8bitカラー

23 00000009 B400                      MOV  AH,0x00  

24 0000000B CD10                      INT  0x10     

25 0000000D C605F20F000008            MOV  BYTE [VMODE],8 ; 画面モードをメモする(C言語が参照する)

26 00000014 66C705F40F00004001        MOV  WORD [SCRNX],320

27 0000001D 66C705F60F0000C800        MOV  WORD [SCRNY],200

28 00000026 C705F80F000000000A-       MOV  DWORD [VRAM],0x000a0000

28 0000002F 00                                      

 

実行!!!

f:id:kanazo3:20200518084222j:plain

 

は?

(qemu) xp/100xh 0x0ff0

0000000000000ff0: 0x0b0a 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001000: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001010: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

0000000000001020: 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000

は?

 

続く。。。