qemu基本架构

qemu基本架构
最近在阅读qemu底层源码,由于⽹上资料甚少,从基本架构开始了解会好很多。
(于博客中整理搬运供⾃⼰学习)
如图所⽰,QEMU由以下⼏个部分组成:四川川南减震器集团有限公司
l  Hypervisor控制仿真
l  Tiny Code Generator(TCG)在虚拟机器代码和宿主机代码之间进⾏转换。
l  软件内存管理单元(MMU)处理内存访问。
l  磁盘⼦系统处理不同的磁盘映像格式
设备⼦系统处理⽹卡和其他硬件设备
下⾯将对这些组件介绍。
Hypervisor管理程序
Hypervisor(虚拟机管理程序)是⼀种创建和运⾏虚拟机的虚拟机监视器。 QEMU中的Hypervisor(虚拟机管理程序)从磁盘映像加载⼆进制机器代码,使⽤TCG将其转换为本机机器代码,连接到虚拟或实际设备,并启动软件MMU,然后开始在磁盘映像中模拟操作系统。其中,TCG和软件MMU是实现虚拟化CPU和内存的关键。
热传导率
⽽集成KVM后,QEMU将使⽤Linux内核的KVM功能以纯模式执⾏虚拟机。KVM基本上是Linux内核中的Hypervisor(虚拟机管理程序)。它可以并⾏运⾏多个操作系统。QEMU可以在KVM中启动⼀个新线程以执⾏模拟操作系统,然后KVM控制执⾏。从这部分来
说,KVM的Hypervisor(虚拟机管理程序)替换掉了QEMU的Hypervisor(虚拟机管理程序)。
微代码⽣成器(TCG)
在QEMU中,Tiny Code Generator(TCG)将源处理器机器代码转换为虚拟机运⾏所需的机器代码块(如x86机器代码块)。从物理硬件的架构和⾓度上来说,不可能在⼀个处理器上运⾏为另⼀个处理器的指令集架构(ISA)编译的机器代码,例如,x86处理器上的ARM机器代码。因此,引⼊中间环节对不同的处理器指令集架构(ISA)进⾏翻译和转换是实现虚拟化通⽤性的技术途径和解决⽅案。在Tiny Code Generator(TCG)中,这些已经翻译的代码块放在转换缓存中,并通过跳转指令将源处理器的指令集(ISA)和⽬标处理器的指令集(ISA)链接在⼀起。当Hypervisor(虚拟机管理程序)在执⾏代码时,存放于转换缓存中的链接指令可以跳转到指定的代码块,并且执⾏可以在不同的已翻译代码块上运⾏,直到需要翻译新块为⽌。在执⾏的过程中,如果遇到了需要翻译的代码块,执⾏动作就会暂停并回会跳回到Hypervisor(虚拟机管理程序),Hypervisor(虚拟机管理程序)就会使⽤和协调TCG对需要进⾏⼆进制翻译的源处理器指令集(ISA)进⾏转换和翻译并存储到转换缓存中。
下图显⽰了QEMU的TCG⼯作原理:
图.微代码⽣成器⼯作原理
在TCG在运⾏的过程中存在⼀个⼩缺点,即它⽆法正确运⾏⾃修改代码,因为它没有将修改后的代码页进⾏标记,再次运⾏时需要重新翻译。这影响了QEMU的⼆进制运⾏效率,从另外⼀个⾓度来说,这也增加了⼀定的安全性。⾃修改代码在软件世界中容易被漏洞利⽤。特别是缓冲区溢出攻&击等内存损坏漏洞,这些漏洞利⽤威胁代理(例如后门)提供的特殊代码覆盖易受攻&击的应⽤程序代码,如果已经被覆盖的代码已经被运⾏(并因此被缓存),出了正常运⾏的会导致漏洞攻&击利⽤外,更多的时候则会导致TCG运⾏和翻译失败,从⽽导致程序复现异常或崩溃。
此外,在翻译的过程中,如果新处理器使⽤的寄存器多于x86处理器并且具有许多复杂指令,那么对T
CG进⾏编程以处理和适应新的CPU仿真就可能需要⼤量的⼯作。⽬前来说,QEMU所⽀持的⼤部分处理器都拥有部分相同的指令集。例如,“MOV”指令⼏乎存在于所有处理器中,并且可以简单地复制,除⾮CPU寄存器中存在⼀些位⼤⼩差异。例如,在32位处理器上模拟64位处理器可能需要许多额外的指令,这也需要更多时间在TCG转换器中进⾏编程。
在QEMU的源代码中,有⼀个名为'tcg'的⼦⽬录,其中包含将机器指令转换为相应的x86机器指令的代码。此代码是⼀个⽤C编写的简单翻译状态机。还有⽤于内存访问和跳转的特殊转换,因为它们可以⽣成对软件内存管理单元的调⽤。⽽虚拟化CPU和内存也往往是在⼀起的,因为从本质上来说,CPU的⼯作就是对内存的区域数据进⾏搬运,CPU是内存的搬运⼯。在QEMU保护代码块之外的其他内存区域。机器代码中的跳转和分⽀也必须到达正确的存储器地址。
所以通过⼆进制翻译技术,针对CPU的仿真和虚拟化就⾮常简单了。TCG和Hypervisor(虚拟机管理程序)能够实现基于CPU的仿真,其中,其CPU仿真流程如下图所⽰:
从上图我们可以看到,针对CPU的仿真和虚拟化其实就是将源处理器的指令集(ISA)转换和翻译成⽬标处理器的指令集(ISA)。CPU仿真和虚拟化就是通过中间的转换和翻译来实现的,由此,针对CPU的虚拟化的第⼀种技术就完全实现了。这种⼆进制翻译技术是最早的CPU虚拟化技术,诞⽣了VMware这样的虚拟化巨头,也诞⽣了QEMU这样的开源虚拟化⿐祖。
硬件设备
虚拟机的硬件设备要求可以通过直接连接主机中的实际物理设备或通过QEMU中的硬件设备仿真来实现。与硬件相关的⼤多数QEMU代码位于⽬录“hw”中。
在QEMU中,存在两种使⽤硬件设备的⽅式:直通模式使⽤主机实际物理设备和QEMU的设备驱动仿真实现的模拟虚拟设备。如果采⽤直通⽅式使⽤实际的物理设备,那么就会抢占主机的设备使⽤权,并且其他虚拟机也将⽆法使⽤该物理设备。在直通模式中,虚拟机可以直接访问USB总线或PCI总线,并可以直接与设备通信。⼀般情况下,采⽤直通模式的物理设备都是很难进⾏QEMU仿真的设备,⽐如⽹络摄像头、串⾏和并⾏端⼝等。其他设备因为⼤部分虚拟机都会使⽤,⽽且很难与主机共享,例如⽹络设备,因此⼤都会使⽤QEMU模拟仿真的虚拟设备。⽐如在虚拟机的⽹络设备中,可通过模拟⽹卡来解决,从⽽在⽹络堆栈上添加额外的层。此外,QEMU可以选择连接到Linux内核中的“virtio”半虚拟化驱动程序,这意味着Linux内核处理虚拟机和硬件设备之间的输⼊/输出,⽽不采⽤QEMU的模拟设备进⾏中转和传输(仅⽤作中介)。
中国特社会主义道路
磁盘映像
QEMU可以处理⼏种不同的磁盘映像格式。⾸选格式为raw或qcow2。Raw是⼀种⾮常简单的格式,它将⽂件系统中的字节逐字节存储在⽂件中。⼤多数其他仿真器都⽀持此格式。Qcow2是QEMU⾃⼰的图像格式,对⼩图像很有⽤。并且⽀持磁盘映像压缩以及捕获磁盘映像状态的快照。还⽀持另外两种格式:在VirtualBox中使⽤的vdi和在VMWare中使⽤的vmdk。
QEMU的磁盘映像通过其存储IO协议栈来进⾏⽀持,其存储协议栈如下图所⽰:
图 QEMU存储协议栈tm2007
从QEMU的存储协议栈来说,应⽤程序和虚拟机内核的⼯作类似于裸机。虚拟机通过仿真硬件与QEMU交互,并将IO执⾏情况的控制流和数据流交互给QEMU,QEMU代表虚拟机对磁盘镜像⽂件执⾏I / O操作。⽽从主机内核层⾯上,主机内核会将虚拟机I / O视为⼀种⽤户空间的应⽤程序IO请求进⾏正常的执⾏处理。
软件MMU
传统处理器中的内存管理单元(MMU)处理对计算机内存位置的访问。当处理器想要访问某个存储器地址时,MMU获取该地址的内容。此内容可以来⾃处理器芯⽚上的本地快速缓存,来⾃随机存取存储器(RAM)或来⾃光盘。它甚⾄可以做出⼀些关于缓存某些内存位置的控制决定。
QEMU有⼀个基于软件的MMU,其⼯作⽅式与硬件MMU类似。它使⽤地址转换缓存,其中包含访客地址、主机地址和偏移值,以提⾼转换速度。它还允许智能链接代码块,以便在没有内存故障的情况下实现更快的执⾏,其中必须重新加载和重新转换内存块。1yys
在寻在QEMU中运⾏的虚拟机的漏洞时,软件MMU是否正在进⾏翻译和正确放置块会是其测试和Fuzz的重点。

本文发布于:2024-09-22 13:45:10,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/199231.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:代码   内存   设备   处理器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议