qemu monitorを使って自作OSをデバッグする
qemuの起動オプションに-monitor stdio
を付け加えるとqemuを起動したコンソールでqemu monitorが使えるようです。
30日OS自作本の場合
※自分の環境はmacなのでWindows, Linuxの方は違いなどあれば適当に読み替えて実行して見てください。
HariboteOS/z_tools/qemu配下のMakefileに-monitor stdio
を書き足します。
QEMU = qemu-system-i386 QEMU_ARGS = -L . -m 32 -localtime -vga std -fda fdimage0.bin -monitor stdio default: $(QEMU) $(QEMU_ARGS)
info registers:レジスタの状態を表示
EFLAGSがないのが気になる。。。
(qemu) info registers EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000 ESI=00000000 EDI=00000000 EBP=00039ffc ESP=00039ff8 EIP=00000b00 EFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=1 ES =0008 00000000 ffffffff 00cf9300 DPL=0 DS [-WA] CS =0010 00280000 0007ffff 00479a00 DPL=0 CS32 [-R-] SS =0008 00000000 ffffffff 00cf9300 DPL=0 DS [-WA] DS =0008 00000000 ffffffff 00cf9300 DPL=0 DS [-WA] FS =0008 00000000 ffffffff 00cf9300 DPL=0 DS [-WA] GS =0008 00000000 ffffffff 00cf9300 DPL=0 DS [-WA] LDT=0000 00000000 00000000 00000000 TR =0020 000050b8 00000067 00008900 DPL=0 TSS32-avl GDT= 00270000 0000ffff IDT= 0026f800 000007ff CR0=00000019 CR2=00000000 CR3=00000000 CR4=00000000 DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000 DR6=ffff0ff0 DR7=00000400 EFER=0000000000000000 FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80 FPR0=0000000000000000 0000 FPR1=0000000000000000 0000 FPR2=0000000000000000 0000 FPR3=0000000000000000 0000 FPR4=0000000000000000 0000 FPR5=0000000000000000 0000 FPR6=0000000000000000 0000 FPR7=0000000000000000 0000 XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000 XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000 XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000 XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000 (qemu)
xpコマンド:メモリダンプ
(qemu) help xp xp /fmt addr -- physical memory dump starting at 'addr'
format: Used to specify the output format the displayed memory. The format is broken down as /[count][data_format][size]
- count: ダンプするデータ量。後述のsize * countで決まる
- data_format:データ形式を以下の文字で指定
letter | format |
---|---|
'x' | hex |
'd' | decimal |
'u' | unsigned decimal |
'o' | octal |
'c' | char |
'i' | (disassembled) processor instructions |
- size:
letter | size |
---|---|
'b' | 8 bit |
'h' | 16 bit |
'w' | 32 bit |
'g' | 64 bit |
hariboteOSのメモリマップを参考に早速メモリダンプをして見ます。
start | end | size | content |
---|---|---|---|
0x00000000 | 0x000fffff | 1MB | boot |
0x00100000 | 0x00267fff | 1440KB | floppy content |
0x00268000 | 0x0024f7ff | 30KB | empty |
0x0026f800 | 0x0026ffff | 2KB | IDT |
0x00270000 | 0x0027ffff | 64KB | GDT |
0x00280000 | 0x002fffff | 512KB | bootpack.hrb |
0x00300000 | 0x003fffff | 1MB | stack or etc |
0x00400000 | - | - | empty |
まずはフロッピーがロードされている0x00100000
のメモリ内容をダンプします。
(qemu) xp/200xc 0x00100000 0000000000100000: '\xeb' 'N' '\x90' 'H' 'A' 'R' 'I' 'B' 0000000000100008: 'O' 'T' 'E' '\x00' '\x02' '\x01' '\x01' '\x00' 0000000000100010: '\x02' '\xe0' '\x00' '@' '\x0b' '\xf0' '\x09' '\x00' 0000000000100018: '\x12' '\x00' '\x02' '\x00' '\x00' '\x00' '\x00' '\x00' 0000000000100020: '@' '\x0b' '\x00' '\x00' '\x00' '\x00' ')' '\xff' 0000000000100028: '\xff' '\xff' '\xff' 'H' 'A' 'R' 'I' 'B' 0000000000100030: 'O' 'T' 'E' 'O' 'S' ' ' 'F' 'A' 0000000000100038: 'T' '1' '2' ' ' ' ' ' ' '\x00' '\x00' 0000000000100040: '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' 0000000000100048: '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' '\x00' 0000000000100050: '\xb8' '\x00' '\x00' '\x8e' '\xd0' '\xbc' '\x00' '|' 0000000000100058: '\x8e' '\xd8' '\xb8' ' ' '\x08' '\x8e' '\xc0' '\xb5' 0000000000100060: '\x00' '\xb6' '\x00' '\xb1' '\x02' '\xbe' '\x00' '\x00' 0000000000100068: '\xb4' '\x02' '\xb0' '\x01' '\xbb' '\x00' '\x00' '\xb2' 0000000000100070: '\x00' '\xcd' '\x13' 's' '\x10' '\x83' '\xc6' '\x01' 0000000000100078: '\x83' '\xfe' '\x05' 's' '2' '\xb4' '\x00' '\xb2' 0000000000100080: '\x00' '\xcd' '\x13' '\xeb' '\xe3' '\x8c' '\xc0' '\x05' 0000000000100088: ' ' '\x00' '\x8e' '\xc0' '\x80' '\xc1' '\x01' '\x80' 0000000000100090: '\xf9' '\x12' 'v' '\xd1' '\xb1' '\x01' '\x80' '\xc6' 0000000000100098: '\x01' '\x80' '\xfe' '\x02' 'r' '\xc7' '\xb6' '\x00' 00000000001000a0: '\x80' '\xc5' '\x01' '\x80' '\xfd' '\n' 'r' '\xbd' 00000000001000a8: '\x88' '.' '\xf0' '\x0f' '\xe9' 'Q' 'E' '\xbe' 00000000001000b0: '\xc7' '|' '\x8a' '\x04' '\x83' '\xc6' '\x01' '<' 00000000001000b8: '\x00' 't' '\x09' '\xb4' '\x0e' '\xbb' '\x0f' '\x00' 00000000001000c0: '\xcd' '\x10' '\xeb' '\xee' '\xf4' '\xeb' '\xfd' '\n'
もちろんこれはmakeで作成したOSイメージをバイナリエディタで表示したものと一致していることがわかります!!!