朝活!(結構、続いてる。。)

体重測ったら、72.1kg...

ふむ。

結構、夜中に汗かいてるだけで痩せるのかな。。

 

で、昨日の続きをとりあえず。。

 

Bootまでは意図しているように実行されているっぽいので、次は0xc200へ飛んで行っている

のか?って事を確認してみた。

Hex friendを用いて、イメージファイルのiplからの飛び先に直接バイナリコードを書き込んで

実行させてみる事で、ホントにちゃんとそこへ飛んでいるか?を確認。

〜 harib00gの、haribote.nasを利用 〜

1; haribote-os

2; TAB=4

3

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

5

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

7 00000002 B400         MOV             AH,0x00

8 00000004 CD10         INT             0x10

9                 fin:

10 00000006 F4          HLT

11 00000007 EBFD        JMP             fin

 

このコードを直接、0xc200へ書き込んでみる。

f:id:kanazo3:20200513065655j:plain

0x4200をHex Friendを使い、 

7F454C46 01010100 00000000 → B013B400 CD10F4EB FD000000

へ変更!!

f:id:kanazo3:20200513065818j:plain

念の為、実行前にイメージファイルの必要アドレスに意図している内容が書かれているか?

再確認。

$ hexdump haribote.img | 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 00 00 00 00 00 00 29 3c 65 69 06 4e 4f 20 4e 41

0000030 4d 45 20 20 20 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 32 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 e9 51 45 be

00000b0 c7 7c 8a 04 83 c6 01 3c 00 74 09 b4 0e bb 0f 00

00000c0 cd 10 eb ee f4 eb fd 0a 0a 6c 6f 61 64 20 65 72

00000d0 72 6f 72 0a 00 00 00 00 00 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 55

0000200 f0 ff ff 03 40 00 ff 0f 00 00 00 00 00 00 00 00

0000210 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

*

0001400 f0 ff ff 03 40 00 ff 0f 00 00 00 00 00 00 00 00

0001410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

*

0002600 48 41 52 49 42 4f 54 45 53 59 53 20 18 00 85 bb

0002610 ac 50 ac 50 00 00 85 bb ac 50 02 00 c5 05 00 00

0002620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

*

0004200 b0 13 b4 00 cd 10 f4 eb fd 00 00 00 00 00 00 00

0004210 01 00 03 00 01 00 00 00 00 00 00 00 00 00 00 00

0004220 40 00 00 00 00 00 00 00 34 00 00 00 00 00 28 00

0004230 06 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00

0004240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

*

 

$ qemu-system-i386 -drive file=haribote.img,format=raw,if=floppy -boot a

f:id:kanazo3:20200513073137j:plain

という事で、ちゃんと意図した場所へ飛んでいる模様。

 

という事で、ここまでを整理すると。

1. boot OK

2. 意図したアドレスへJump OK

3. asmhead.nasの最初にelfフォーマットへ変換している為なのか?何か入っている

 っぽいが、ここへ来た後、本来実行して欲しいコードが実行されていない。

 

ふむふむ。では、asmhead.nasの最初ってのは

 

 1                                 ; haribote-os boot asm

 2                                 ; TAB=4

 3

 4                                 BOTPAK EQU  0x00280000  ; bootpackのロード先    

 5                                 DSKCAC EQU  0x00100000  ; ディスクキャッシュの場所

 6                                 DSKCAC0 EQU  0x00008000  ; ディスクキャッシュの場所(リアルモード)

 7                                  

 8                                 ; BOOT_INFO関係

 9                                 CYLS EQU  0x0ff0   ; ブートセクタが設定する

10                                 LEDS EQU  0x0ff1

11                                 VMODE EQU  0x0ff2   ; 色数に関する情報。何ビットカラーか?

12                                 SCRNX EQU  0x0ff4   ; 解像度のX

13                                 SCRNY EQU  0x0ff6   ; 解像度のY                 

14                                 VRAM EQU  0x0ff8   ; グラフィックバッファの開始番地

15                                  

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

17                                  

18                                 ; 画面モードを設定

19                                  

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

21 00000002 B400                     MOV  AH,0x00

22 00000004 CD10                     INT  0x10

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

24 0000000D 66C705F40F00004001       MOV  WORD [SCRNX],320

25 00000016 66C705F60F0000C800       MOV  WORD [SCRNY],200         

26 0000001F C705F80F000000000A       MOV  DWORD [VRAM],0x000a0000

26 00000028 00                                    

 

この赤字部分のコードへジャンプすれば同じ動きになるはず。。

$ hexdump haribote.img | less

〜 省略 〜

*

0004260 00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00

0004270 06 00 00 00 00 00 00 00 30 01 00 00 30 01 00 00

0004280 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00

0004290 07 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00

00042a0 60 02 00 00 2b 00 00 00 00 00 00 00 00 00 00 00

00042b0 01 00 00 00 00 00 00 00 11 00 00 00 02 00 00 00

00042c0 00 00 00 00 00 00 00 00 90 02 00 00 30 01 00 00

00042d0 04 00 00 00 13 00 00 00 04 00 00 00 10 00 00 00

00042e0 19 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00

00042f0 c0 03 00 00 7d 00 00 00 00 00 00 00 00 00 00 00

0004300 01 00 00 00 00 00 00 00 21 00 00 00 09 00 00 00

0004310 00 00 00 00 00 00 00 00 40 04 00 00 18 00 00 00

0004320 03 00 00 00 01 00 00 00 04 00 00 00 08 00 00 00

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

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

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

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

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

あるな。 0x4330! つまり、ipl10.nas の JMP 0xc200 → JMP 0xc330へ変更

したら動くはず。

という事で、変更して実行!

$ 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

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

x86_64-elf-ld -m elf_i386 -e HariMain -o bootpack.hrb -T hrb.ld asmhead.bin bootpack.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 -drive file=haribote.img,format=raw,if=floppy -boot a

f:id:kanazo3:20200513080111j:plain

おぉぉぉ!!!!

行ったやん!

でも、何故 0xc200のままだとダメだったんだろう。。。

まぁ、これはこれで、また調べていきますか。。

とにかく、これで本自体は次に進めるのだろうか。

まぁ、このC言語導入障壁は、まだ解決されていないので続くんだろうな。。。

ぶっちゃけ、これをさらに調べるとなると。。

0xc200へJumpした際の動作が知りたくなる。。

となると、gdb辺りをqemuへ繋げるとかになるのか。。。(orz...)

と思ったら、さすが先人の方がいらっしゃった。

QEMUにGDBを繋げてhariboteOSをデバッグする方法 - Yabu.log

っていうか、嬉しい。。。

 

この辺りをやってみるか、先に進めるかはやりながら考えよう。。

一先ず、ちょっとずつ前に進んでいるのかな。。

 

続く。