欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

QEMU

程序员文章站 2022-06-04 08:51:46
...

引言

我们把QEMU的内部描述成一个使用了一种原始的可移植的动态翻译器的快速模拟器。它在本地 (x86, PowerPC, ARM, Sparc, Alpha andMIPS)模拟一些CPU((x86, PowerPC, ARM and Sparc).QEMU支持全系统的模拟(一个完整的、未修改的操作系统运行在一个虚拟机上)和用户模式的模拟(目标CPU的LINUX进程能够在另一个CPU上运行)。

1 介绍

QEMU是一个机器模拟器:它能够在虚拟机上运行一整个目标操作系统(比如 Windows or Linux)及其应用。QEMU能够运行的本地操作系统有Linux,Windows and Mac OS X。主机和目标CPU可以是不同的。
QEMU最基础的使用是在Linux上的Windows,或者Windows上的Linux上运行一个操作系统。另一个使用就是调试,因为虚拟机能够轻易的被停止,它的状态能够被调查、保存和恢复。而且特殊的嵌入式设备能够通过增加心得机器描述和心得模拟设备来模拟。
QEMU同样也包括一个Linux特殊的用户模式模拟器。它是目标CPU的LINUX进程能够在另一个CPU上运行的机器模拟器。主要用于测试交叉编译器的结果或者是测试CPU模拟而不需要开启一个完整的虚拟机。
QEMU由几个子系统组成:
CPU模拟器(目前的x86, PowerPC, ARM andSparc)
模拟设备(IDE硬盘、键盘、鼠标、NE2000网卡、VGA接口等)
通用设备(块设备、字符设备、网络设备)用于连接模拟的设备和相应的主机设备
机器描述( PC, PowerMac, Sun4m)模拟设备的示例
调试器
用户界面
这篇文章检查了QEMU使用的动态翻译的实现。动态翻译执行了从目标CPU指令到主机指令集在运行时的转换。作为结果的二进制代码被存储到翻译缓存中,因此它能够被再次使用。与解释器相比,它的优点是目标CPU的指令只用翻译一次。
通常,动态翻译器很难从一个主机移植到另一个主机,因为整个代码生成器必须重写。它表示的工作量与向C编译器添加新目标的工作量大致相同。QEMU要简单得多,因为它只是将GNU C编译器离线生成的机器码片段连接起来
一个CPU模拟器同样面对其他经典但是困难的问题:
翻译块缓存的管理
寄存器的分配
条件代码的优化
直接块的链接
内存管理
自修改代码的支持
异常的支持
硬件中断
用户模式模拟

2 可移植的动态翻译

2.1 描述

第一步是将每个目标CPU指令分割成更少的称为微操作的更简单的指令。每个微操作都是由一小段C代码实现的。这个小C源代码由GCC编译成一个目标文件。微操作的选择使得它们的数量比目标CPU的所有指令和操作数的组合要少得多(通常只有几百个)。从目标CPU的结构到微操作的转换完全是用手工编码完成的。源代码经过了可读性和紧凑性的优化,因为这一阶段的速度没有解释器那么重要。
名为dyngen的编译时工具使用包含微操作的对象文件作为输入来生成动态代码生成器。这个动态代码生成器在运行时被调用,以生成一个连接多个微操作的完整主机函数。这个过程类似于11,但是为了获得更好的性能,在编译时需要做更多的工作。其中一个关键思想是在OEMU中可以为微观操作提供常数参数。为此,使用GCC为每个con stant参数生成伪代码重新定位。这使得dyngen工具能够定位重定位并生成适当的C代码,以便在构建动态代码时重新解决它们。还支持重定位,以支持对静态数据和微操作中的其他函数的引用。
相关标签: QEMU