QEMU
Emulators |
---|
PC Emulators |
PC Virtual Machine Monitors |
PowerPC Emulators |
QEMU是一个免费的开源模拟器,可执行硬件虚拟化。 它广泛用于各种主机操作系统,并且在操作系统开发中需要最少的配置。 它能够模拟各种各样的系统,包括 ARM 、 x86 和 risc-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 |
支持的体系结构
- x86
- x86_64
- ARM
- ARM64
- LatticeMico32
- Motorola 68000
- MicroBlaze
- MIPS
- MIPS64
- Moxie
- PowerPC
- PowerPC64
- RISC-V
- IBM System/390
- SuperH
- SPARC
- SPARC64
- TriCore
- Unicore
- Xtensa
支持的设备
- Ne2000 network card
- e1000 network cards
- RTL8139 network card
- AMD PCnet network cards
- PC Speaker
- Sound Blaster 16 sound cards
- AC97
- Intel High Definition Audio
- Virtio devices
- PCI SVGA card (Cirrus Logic 5446)
- PCI support (With BIOS32).
用法
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 threads 和 thread 命令可用于提供有用的信息。 也可以使用GDB中的 monitor 命令使用QEMU监视器及其命令。 有关可用命令及其描述的列表,请使用 monitor help 命令。
获取详细日志
通过取消注释QEMU源文件中的某些预处理器指令,可以将其他调试信息输出到stdot。
QEMU源代码中的某些文件具有以下形式的注释行:
// #define DEBUG_*
使用定义的预处理器变量从源代码重新编译QEMU将导致来自适用文件的其他调试信息被打印到stdoout。
另见
文章
- QEMU and GDB in long mode
- QEMU_fw_cfg Pass strings and files into the VM from the QEMU command line