4

このチュートリアルに示されている単純なブートローダーをステップ実行しようとしています: http://mikeos.berlios.de/write-your-own-os.html - Qemu モニターを使用して、教育目的で一般的なレジスターを検査できます。

Qemu と gdb を接続でき、ブレークポイントがブートローダー (0x7c0) の先頭に設定されていますが、gdb で「c」を押すと、コードは最後まで実行されます。

kvmがgbdを仮想メモリアドレスと「混同」する可能性があることを読んだので、無効にしました。これはうまくいきませんでした。

また、( qemu で gdb を使用してブートローダーをデバッグする ) HEAD から gdb をコンパイルした後に Freedos ブートをデバッグするときに機能することも読みました。gdb を再コンパイルする代わりに、Freedos ブートのデバッグを試みました - うまくいきました!

したがって、私の問題は、実際にはチュートリアルのブートローダーを段階的に実行することだと思います。

私が試した他のこと(どれもうまくいきませんでした):

ブレークポイントを挿入する前に「si」を何十回も使用する 別のブレークポイント アドレスを試す qemu で -singlestep キーを使用する

これが私のqemuコマンドラインです:

qemu-system-i386 -fda disquete.img -boot a -s -S -monitor stdio

gdb内のコマンドシーケンスは次のとおりです。

(gdb) ターゲット リモート localhost:1234 (gdb) セット アーキテクチャ i8086 (gdb) br *0x7c0

次に、「c」を押すと、ブレークポイントをずっと通過します。

バージョン:

$ uname -a

Linux Brod 3.8.0-30-generic #44-Ubuntu SMP Thu Aug 22 20:52:24 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ gdb --バージョン

GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu

$ qemu --バージョン

QEMU エミュレーター バージョン 1.4.0 (Debian 1.4.0+dfsg-1expubuntu4)、Copyright (c) 2003-2008 Fabrice Bellard

Freedos ブートをステップ実行できるので、セットアップは問題ないと思いますが、この投稿の冒頭で述べたブートローダー チュートリアルのブート プロセスの概念的な誤解の中で失敗しているに違いありません。

すべてのヘルプは大歓迎です!

4

2 に答える 2

3

ハードウェア仮想化のため、ハードウェア ブレークポイントを使用する必要がある場合があります。

(gdb) hbreak *0x7c00

また、64 ビット CPU (または kvm) を使用している場合でも、gdb の正しいアーキテクチャに注意して(gdb) set architecture i8086ください。CPU がまだリアル モードであるため、ブートローダーが必要です。

于 2015-01-24T05:05:24.950 に答える
0

mikeos.berlios.de/write-your-own-os.htmlから取得したサンプル ブートローダーを、特に 0x7c00 でロードするように書き直した後、実際にデバッグすることができました。私の情報源 (ここでの寄稿以外) は次のとおりです。

http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders http://viralpatel.net/taj/tutorial/hello_world_bootloader.php

最終的なコードは次のとおりです。

[BITS 16]           ; Tells nasm to build 16 bits code
[ORG 0x7C00]        ; The address the code will start

start: 
    mov ax, 0       ; Reserves 4Kbytes after the bootloader
    add ax, 288 ; (4096 + 512)/ 16 bytes per paragraph 
    mov ss, ax 
    mov sp, 4096 
mov ax, 0   ; Sets the data segment 
    mov ds, ax 
    mov si, texto   ; Sets the text position 
    call imprime    ; Calls the printing routine
jmp $       ; Infinite loop 
    texto db 'It works! :-D', 0 
imprime:            ; Prints the text on screen
    mov ah, 0Eh     ; int 10h - printing function 
.repeat: 
    lodsb           ; Grabs one char 
    cmp al, 0 
    je .done        ; If char is zero, ends 
    int 10h         ; Else prints char 
jmp .repeat 
.done: 
ret 
times 510-($-$$) db 0 ; Fills the remaining boot sector with 0s 
dw 0xAA55             ; Standard boot signature

これで、プログラムをステップ実行して、レジスターの変化を確認できます。

于 2014-06-25T12:57:18.317 に答える