■
朝活!(結構、続いてる。。)
体重測ったら、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へ書き込んでみる。
0x4200をHex Friendを使い、
7F454C46 01010100 00000000 → B013B400 CD10F4EB FD000000
へ変更!!
念の為、実行前にイメージファイルの必要アドレスに意図している内容が書かれているか?
再確認。
$ 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
という事で、ちゃんと意図した場所へ飛んでいる模様。
という事で、ここまでを整理すると。
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
おぉぉぉ!!!!
行ったやん!
でも、何故 0xc200のままだとダメだったんだろう。。。
まぁ、これはこれで、また調べていきますか。。
とにかく、これで本自体は次に進めるのだろうか。
まぁ、このC言語導入障壁は、まだ解決されていないので続くんだろうな。。。
ぶっちゃけ、これをさらに調べるとなると。。
0xc200へJumpした際の動作が知りたくなる。。
となると、gdb辺りをqemuへ繋げるとかになるのか。。。(orz...)
と思ったら、さすが先人の方がいらっしゃった。
QEMUにGDBを繋げてhariboteOSをデバッグする方法 - Yabu.log
っていうか、嬉しい。。。
この辺りをやってみるか、先に進めるかはやりながら考えよう。。
一先ず、ちょっとずつ前に進んでいるのかな。。
続く。