当前位置:   article > 正文

Qemu(纯软实现)架构+KVM(基于kernel模拟硬件)原理(一)(1)_kvm和qemu

kvm和qemu

QEMU是“Quick Emulator”的缩写,是一个用C语言编写的开源虚拟化软件。本文的目的是描述本人所理解的QEMU技术架构的见解,并以此抛砖引玉。众所周知,QEMU的源代码开发文档非常稀少,描述内部结构和工作机理的文档更是凤毛麟角,一般的开发人员想要从事QEMU的开发工作,通常只能从源代码入手。因此,对于技术人员来说,了解QEMU是一项艰巨的任务。

QEMU有几种虚拟化模式。首先,它可以使用基于内核的虚拟机(KVM)执行x86处理器硬件虚拟化,以几乎比拟硬件本机的速度执行运算任务。其次,它可以通过机器代码的实时转换来模拟其他处理器以用于虚拟机运行不同平台的操作系统。最后,它可以使用实时转换为其他架构运行简单的程序,类似于Linux中的Wine。因为QEMU没有图形用户界面(GUI),而其提供的核心能力又是关键而重要的,因此通常用作更复杂的虚拟化管理器的一部分。比如,我们经常使用的开源VirtualBox、Xen等虚拟化产品,其核心底层的虚拟化部分就有集成和使用QEMU,此外,主流的KVM虚拟化也是集成和使用QEMU的主力虚拟化管理器系统。

从KVM的角度来说,KVM(Kernel Virtual Machine)是Linux的一个内核驱动模块,它能够让Linux主机成为一个Hypervisor(虚拟机监控器)。在支持VMX(Virtual Machine Extension)功能的x86处理器中,Linux在原有的用户模式和内核模式中新增加了客户模式,并且客户模式也拥有自己的内核模式和用户模式,虚拟机就是运行在客户模式中。KVM模块的职责就是打开并初始化VMX功能,提供相应的接口以支持虚拟机的运行。KVM通过调用Linux本身内核功能,实现对CPU的底层虚拟化和内存的虚拟化,使Linux内核成为虚拟化层。KVM在2007年2月被导入Linux 2.6.20内核中。从存在形式来看,它包括两个内核模块:kvm.ko和kvm_intel.ko(或kvm_amd.ko),本质上,KVM是管理虚拟硬件设备的驱动,该驱动使用字符设备/dev/kvm(由KVM本身创建)作为管理接口,主要负责vCPU的创建、虚拟内存的分配、vCPU寄存器的读写以及vCPU的运行。

从QEMU的角度来说,QEMU(Quick Emulator)本身并不包含或依赖KVM模块,而是一套由Fabrice Bellard编写的模拟计算机的自由软件。QEMU虚拟机是一个纯软件的实现,可以在没有KVM模块的情况下独立运行,但是性能比较低。QEMU有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化以及I/O设备的虚拟化。在不需要KVM加速的情况下,QEMU通过一个特殊的“重编译器”对特定的处理器的二进制代码进行翻译,从而具有了跨平台的通用性。QEMU有两种工作模式:系统模式,可以模拟出整个电脑系统,另一种是用户模式,可以运行不同与当前硬件平台的其他平台上的程序(比如在x86平台上运行跑在ARM平台上的程序)。目前最新版本是4.x。从QEMU角度来看,虚拟机运行期间,QEMU通过KVM模块提供的系统调用接口进行内核设置,由KVM模块负责将虚拟机置于处理器的VMX模式运行。QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化加速以提高虚拟机的性能。

而现在流行的KVM虚拟化平台,就是在修改了QEMU代码,把他模拟CPU、内存的代码换成KVM,而网卡、显示器等留着,因此QEMU+KVM就成了一个完整的虚拟化平台。由于KVM运行在内核空间,只是内核模块,QEMU运行在用户空间,实际模拟创建,管理各种虚拟硬件(磁盘,网卡,显卡等)。从KVM的角度来说,用户没法直接跟内核模块交互,需要借助用户空间的管理工具,因此需要借助QEMU这个运行在用户空间的工具。KVM和QEMU相辅相成,QEMU通过KVM达到了硬件虚拟化的速度,而KVM则通过QEMU来模拟设备并实现和内核空间的KVM的交互,虽然这个交互并不仅仅只有QEMU能够办到。此外,由于QEMU模拟IO设备效率不高的原因,现在常常采用半虚拟化的virtio方式来虚拟IO设备。

综上,理解了QEMU和KVM的关系,也就理解了VirtualBox、Xen等虚拟化产品集成和使用QEMU的关系了。

二、QEMU架构及组成

QEMU的架构如下图所示,由几个基本的组件组成:

图 QEMU架构图

如图所示,QEMU由以下几个部分组成:

l Hypervisor控制仿真

l Tiny Code Generator(TCG)在虚拟机器代码和宿主机代码之间进行转换。

l 软件内存管理单元(MMU)处理内存访问。

l 磁盘子系统处理不同的磁盘映像格式

l 设备子系统处理网卡和其他硬件设备

下面将对这些组件介绍。

2.1 Hypervisor管理程序

Hypervisor(虚拟机管理程序)是一种创建和运行虚拟机的虚拟机监视器。 QEMU中的Hypervisor(虚拟机管理程序)从磁盘映像加载二进制机器代码,使用TCG将其转换为本机机器代码,连接到虚拟或实际设备,并启动软件MMU,然后开始在磁盘映像中模拟操作系统。其中,TCG和软件MMU是实现虚拟化CPU和内存的关键。

而集成KVM后,QEMU将使用Linux内核的KVM功能以纯模式执行虚拟机。KVM基本上是Linux内核中的Hypervisor(虚拟机管理程序)。它可以并行运行多个操作系统。QEMU可以在KVM中启动一个新线程以执行模拟操作系统,然后KVM控制执行。从这部分来说,KVM的Hypervisor(虚拟机管理程序)替换掉了QEMU的Hypervisor(虚拟机管理程序)。

3.2微代码生成器(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处理器并且具有许多复杂指令,那么对TCG进行编程以处理和适应新的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这样的开源虚拟化鼻祖。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618165277)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/973387
推荐阅读
相关标签
  

闽ICP备14008679号