当前位置: 首页 > 图灵资讯 > 行业资讯> qemu是用python写的吗

qemu是用python写的吗

发布时间:2025-04-06 15:36:12

一、QEMU简介

QEMU是法布里斯·贝拉在Linux内核上写的CPU模拟器。这个开源模拟器软件和Bochs、PearPC相似,但具有后两者所不具备的高速和跨平台特性。QEMU可以在不同的机器上运行独立开发的操作系统和软件,通过开源加速器KQEMU可以模拟到接近真实计算机的速度。QEMU构思巧妙, 效率极高, 在核心态KQEMU加速器的帮助下,模拟代码的执行速度甚至可以接近真实机器。QEMU已成为目前使用最广泛的模拟器,KVM和Google 基于QEMU的Android模拟器。

QEMU是一种开源模拟器和虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要为用户提供两个功能。首先,作为一个用户模拟器,动态代码翻译机制用于执行不同于主机架构的代码。第二,作为虚拟机监管器,模拟整个系统,使用其他VMM(Xen, KVM, etc)利用硬件提供的虚拟化支持,创建接近主机性能的虚拟机。

用户可以通过不同Linux发行版本的软件包管理器安装QEMU。例如,以下命令可以安装在Debian系列的发行版本中:

sudoapt-getinstallqemu

或在红帽系列发行版上使用以下命令:

sudoyuminstallqemu-y

此外,还可以选择从源码安装。

获取QEMU源码

QEMU源码的tar包可以从QEMU官网下载,以命令行下载2.0版QEMU为例:

$wgethttp://wiki.qemu-project.org/download/qemu-2.0.0.tar.bz2
$tarxjvfqemu-2.0.0.tar.bz2

若需要参与QEMU的开发,最好使用Git获取源代码:

$gitclonegit://git.qemu-project.org/qemu.git

编译及安装

获取源代码后,可根据需要配置和编译QEMU。

$cdqemu-2.0.0///如果使用git下载的源代码,执行cdqemu
$./configure--enable-kvm--enable-debug--enable-vnc--enable-werror--target-list="x86_64-softmmu"
$make-j8
$sudomakeinstall

用于生成Makefile的configure脚本,其选项可以使用./configure --help查看。此处使用的选项含义如下:

--enable-kvm:使用KVM访问硬件提供的虚拟化服务,编译KVM模块。
--enable-vnc:启用VNC。
--enalbe-werror:在编译过程中,将所有警告视为错误。
--target-list:选择目标机器的架构。默认情况下,所有的架构都是编译的,但为了更快地完成编译,可以指定所需的架构。

二、基本原理

当QEMU作为系统模拟器时,它会模拟一个可以独立操作系统的虚拟机。如下图所示,每台虚拟机对应主机(Host)QEMU进程之一,虚拟机的VCPU对应QEMU进程的线程。

d0f12980a5cc4a42ca4b3ad1039ab4e.png

QEMU结构图

虚拟化系统最重要的是虚拟化CPU、内存和I/O设备。虚拟CPU称为VCPU,QEMU借用KVMM提高效率、XEN等虚拟化技术直接利用硬件支持虚拟化,在主机上安全运行虚拟机代码(需要硬件支持)。虚拟机VCPU调用KVM接口执行任务的过程如下(代码来自QEMU开发者Stefan的技术博客):

open("/dev/kvm")
ioctl(KVM_CREATE_VM)
ioctl(KVM_CREATE_VCPU)
for(;;){
ioctl(KVM_RUN)
switch(exit_reason){
caseKVM_EXIT_IO:/*...*/
caseKVM_EXIT_HLT:/*...*/
}
}

QEMU启动ioctrl调用KVM接口,KVM利用硬件扩展直接在主机上运行虚拟机代码。一旦VCPU需要操作设备寄存器,VCPU将停止并返回QEMU,QEMU将模拟操作结果。

虚拟机内存将在启动时映射到QEMU的过程地址空间。在虚拟机看来,QEMU分配的主机上的虚拟地址空间是虚拟机的物理地址空间。

QEMU在主机用户模拟虚拟机的硬件设备中,VCPU在用户模拟硬件的操作结果。如果虚拟机需要将数据写入硬盘,实际结果是将数据写入主机的镜像文件中。

python学习网,大量免费python视频教程,欢迎在线学习!

相关文章

如何让vim支持python3

如何让vim支持python3

2025-09-12
python2.7和3.6区别有哪些

python2.7和3.6区别有哪些

2025-09-12
python3有serial库吗

python3有serial库吗

2025-09-12
python中w、r表示什么意思

python中w、r表示什么意思

2025-09-12
python中如何把list变成字符串

python中如何把list变成字符串

2025-09-12
python命名空间是什么

python命名空间是什么

2025-09-12