Yabu.log

色々勉強するブログです

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イメージをバイナリエディタで表示したものと一致していることがわかります!!!