QEMU 中的 MS-DOS 在 GDB 中运行 while 循环后中断

问题描述 投票:0回答:1

使用 qemu 使用命令

qemu-system-i386 -fda ./images/disk01.img
运行 MS-DOS 3.20 似乎工作正常。附加 GDB(使用用于 qemu 和
qemu-system-i386 -fda ./images/disk01.img -S -s
的命令
target remote localhost:1234
并继续该程序似乎也可以正常工作并且按预期工作(MS-DOS 正确启动以及一切)。但是,当我在 GDB 中执行以下 while 循环时:

while 1
si
end

经过一段时间的指令后,由于某种原因,它在 MS-DOS 上打印出“Disk Boot Failure”。这对我来说没有意义(毕竟内存中的所有指令都应该是相同的,为什么会有不同的行为)而且我不知道是什么原因导致了这种情况,GDB 中是否可能有某些东西可能导致这对 QEMU 的干扰?

x86 gdb x86-64 dos qemu
1个回答
0
投票

这几乎肯定是 DOS 超时的原因,因为通过 gdbstub 的单步指令意味着 CPU 执行速度非常慢。

QEMU(在非 icount 模式下使用时)使来宾定时器设备按照主机“挂钟”时间工作,因此如果来宾说“读取软盘的尝试应在 10 秒后超时”,那么它将超时现实世界 10 秒后。与此同时,模拟 CPU 的执行速度与 QEMU 的运行速度一样快。通常这没问题,但如果您通过 gdb 单步执行往返的每条指令来减慢来宾 CPU 的速度,来宾可能无法在超时之前执行尽可能多的 BIOS 或 DOS 代码火灾。

如果您想将模拟时间与已执行的客户指令数量联系起来(有效地设置客户 CPU 速度并说“当执行 N 条指令时,客户需要 1 秒”),您可以查看

-icount
但更常见的方法是“不要在 gdb 中执行大量单步操作,而是使用断点”。

© www.soinside.com 2019 - 2024. All rights reserved.