QEMU

来自osdev
跳到导航 跳到搜索
Emulators
PC Emulators
PC Virtual Machine Monitors
PowerPC Emulators

QEMU是一个免费的开源模拟器,可执行硬件虚拟化。 它广泛用于各种主机操作系统,并且在操作系统开发中需要最少的配置。 它能够模拟各种各样的系统,包括 ARMx86risc-v 等等。 有关更全面的目标清单,请参阅 正式文件


特性

  • 支持多个主机,多个目标。
  • 两种操作模式: 完整的系统仿真 (对操作系统开发感兴趣) 和Linux用户进程仿真 (想要仿真应用程序的人会感兴趣)。
  • 使用 “just in time” 代码编译技术 (允许重用以前的代码解释)。这使得它比流行的替代模拟器 Bochs 更快。
  • 提供原生的 GDB 支持。 QEMU可以附加到 GDB/DDD 来调试客户操作系统。 有关更多信息,请参阅下面的 GDB-Stub 部分。
  • 支持 VBE 2.0.

VBE 支持

通过在 GRUB 命令行中键入 'vbeprobe' 来检查 VBE 支持。 测试返回:

0x101 Packed pixel 640x480x8
0x110 Direct Color 640x480x15
0x111 Direct Color 640x480x16
0x112 Direct Color 640x480x24
0x103 Packed pixel 800x600x8
0x113 Direct Color 800x600x15
0x114 Direct Color 800x600x16
0x115 Direct Color 800x600x24
0x105 Packed pixel 1024x768x8
0x116 Direct Color 1024x768x15
0x117 Direct Color 1024x768x16
0x118 Direct Color 1024x768x24
0x107 Packed pixel 1024x768x8
0x119 Direct Color 1024x768x15
0x11A Direct Color 1024x768x16

支持的体系结构

支持的设备

用法

QEMU不需要使用像Bochs这样的配置脚本。下面可以看到QEMU的示例用法:

qemu-system-i386                                 \
  -accel tcg,thread=single                       \
  -cpu core2duo                                  \
  -m 128                                         \
  -no-reboot                                     \
  -drive format=raw,media=cdrom,file=myos.iso    \
  -serial stdio                                  \
  -smp 1                                         \
  -usb                                           \
  -vga std

在非UNIX系统上运行QEMU时,可能需要使用 -L 命令行选项来指示QEMU在哪里可以找到BIOS映像。

-m 128 参数指示QEMU创建具有128MB RAM的guest系统。 -drive format=raw,media=cdrom,file=myos.iso 参数指示QEMU在我们的guest系统中创建驱动器。 在这种情况下,创建的驱动器是CDROM驱动器,其加载介质为 myos.iso。 如果guest系统中需要多个驱动器,则可以使用 -boot 选项来定义系统检查可引导介质的顺序。

上面使用的 -serial stdio 参数指示QEMU将串行输入和输出重定向到主机系统的 stdio 流。 这对于调试目的特别有用。

为了帮助追踪triple fault三重故障的根源,-d int 选项可用于显示有关发生的中断的其他调试信息。 此外,还可以使用 -no-shutdown-no-reboot 选项。 这些指示虚拟机在错误时停止,而不是重新启动或关闭,从而允许操作员在三重故障后检查计算机的状态。

其他有用的命令行选项在 有用的QEMU命令行选项 部分中列出。

键盘快捷键 CTRL-ALT-{1,2,3} 可在仿真器内部使用,以交换输入/输出仿真屏幕,QEMU控制台和串行控制台。 可以从系统控制台发出其他调试命令,例如更改磁盘映像和执行内存转储等。

QEMU控制台

QEMU的内部控制台可以通过QEMU内的组合键 CTRL-ALT-3 访问。

Bochs 不同,QEMU不提供直接与其内部控制台通信的 IO端口。 输出到内部控制台可以通过串行输出的重定向来完成。 使用以下命令行选项将把COM1的输出重定向到QEMU控制台:

 -串行文件: CON

QEMU监视器

正文: Qemu Monitor


QEMU具有自己的内部 “监视器” 控制台,用于调试guest操作系统。 通过各种命令,监视器允许您检查正在运行的来宾OS,更改可移动介质和USB设备,拍摄屏幕截图和音频抓取以及控制虚拟机的各个方面。 可以通过QEMU内的组合键 CTRL-ALT-2 访问监视器。

调用QEMU时,可以使用以下命令行选项将QEMU的监视器输出重定向到stdio:

 -monitor stdio


一些有用的命令:

xp
eXamine Physical memory. Much like GDB's x command, but with no address translation.
cpu n
switch to CPU n. Note that GDB's threads are numbered from 1, but QEMU's CPUs are numbered from 0.
info registers
dump register state
info tlb
Show virtual memory translation state.
info mem
Show the page table mappings in a compact form.
help
List all commands -- keep in mind that there may be more commands available than those mentioned in the QEMU documentation.


QEMU监视器功能的完整列表可在 官方文档 以及 在此处 找到。

有用的QEMU命令行选项

”下面显示了QEMU的命令行选项列表,这些选项对操作系统开发具有特殊意义。 有关选项的完整列表,请参阅 QEMU官方文档

Option Description
-no-reboot 防止QEMU在发生 三重故障 时重新启动。
-no-shutdown 不要在guest关闭时退出QEMU,而是只停止仿真。
-d 启用额外调试信息的打印。 Arguments for this option include cpu_reset, int, guest_errors ( among others ). 当设置 IDT 以实时查看中断执行时,这可能非常有用。
-gdb or -s 在GDB Stub模式下启动QEMU。 这导致QEMU接受来自 GDB 客户端的传入连接。 有关更多信息,请参见下文或参考 官方文档
-S 导致guestCPU在启动时不开始执行。 这对于调试非常有用,因为它会在暂停状态下启动guest。 用户必须使用控制台 (或GDB) 中的 continue 命令在guest系统上启动执行。

GDB-Stub

使用 -gdb-s <dev> 命令行选项启动QEMU将指示QEMU侦听传入的 GDB 连接。 默认情况下,QEMU将在 localhost:1234 上通过HTTP侦听连接,但是该选项将接受其他连接的参数。 将此开关与 -S 选项一起使用很有用,这会导致QEMU在暂停状态下启动。 这将允许额外的时间来连接GDB客户端,以启动模拟需要在GDB或QEMU控制台中发出 continue 命令。

为方便起见,还可以创建一个包含命令的文件,供GDB自动执行。 GDB将读取并执行当前工作目录中名称为 .gdbinit 的文件的内容。 或者,可以通过使用 -command = file 命令行参数来指定不同的文件。下面可以看到一个示例文件:

file <my-kernel-binary>
target remote localhost:1234

# Inspect page tables
x /8wg &page_tables_start

这将自动将内核二进制文件的符号文件加载到调试器中,然后打开与QEMU的远程连接。
确保使用包含调试符号的内核进行编译。这可以通过使用GCC选项 -g 来实现。 如果发现调试器找不到本地变量,请尝试在编译过程中使用 -fno-omit-frame-pointer 选项,或禁用优化。

运行SMP内核时,info threadsthread 命令可用于提供有用的信息。 也可以使用GDB中的 monitor 命令使用QEMU监视器及其命令。 有关可用命令及其描述的列表,请使用 monitor help 命令。

获取详细日志

通过取消注释QEMU源文件中的某些预处理器指令,可以将其他调试信息输出到stdot。

QEMU源代码中的某些文件具有以下形式的注释行:

// #define DEBUG_*

使用定义的预处理器变量从源代码重新编译QEMU将导致来自适用文件的其他调试信息被打印到stdoout。

另见

文章

外部链接

de:QEMU