云计算虚拟化技术基础与实践:QEMU虚拟化原理_第1页
云计算虚拟化技术基础与实践:QEMU虚拟化原理_第2页
云计算虚拟化技术基础与实践:QEMU虚拟化原理_第3页
云计算虚拟化技术基础与实践:QEMU虚拟化原理_第4页
云计算虚拟化技术基础与实践:QEMU虚拟化原理_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

云计算虚拟化技术基础与实践

QEMU虚拟化原理目录CONTENT01.QEMU运行模式02.QEMU软件构成03.QEMU内存模型04.QEMU的PCI总线与设备本章重点理解QEMU的运行模式。了解QEMU的软件构成。理解QEMU的内存模型。理解QEMU的PCI总线与设备。QEMU运行模式01QEMU运行模式QEMU作为一个开源的硬件模拟器项目,除了支持x86体系架构之外,还支持ARM、MIPS、PowerPC、IA64等多种CPU硬件架构。QEMU除了支持KVM之外,还支持全虚拟机和kqemu加速模块等方式QEMU的三种模块架构QEMU软件构成QEMU源码架构QEMU线程事件模型Libkvm模块Virtio组件02QEMU软件构成QEMU的软件架构QEMU主要由以下几个部分组成:Hypervisor控制仿真。TinyCodeGenerator(TCG)在虚拟机器代码和宿主机代码之间进行转换。软件内存管理单元(MMU)处理内存访问。磁盘子系统处理不同的磁盘映像格式。设备子系统处理网卡和其他硬件设备。1.QEMU源码架构QEMU源码的获取可以访问QEMU的官方网站:/download/。QEMU的源码总体上分为指令翻译(位于tcg目录下的文件)、硬件模拟(位于hw目录下的文件)、网络传输(位于slirp目录下的文件)和文件系统(block前缀文件)四个部分,其主程序涉及的相关文件有vl.c、cpu-exec.c、exec.c、translate-all.c、thunk.c、disas.c。1.QEMU源码架构代码结构QEMU中有一个模块叫做微型代码生成器(TCG,TinyCodeGenerator),它用来将客户机代码翻译成宿主机代码。

QEMU指令动态翻译过程1.QEMU源码架构QEMU的主要功能就是不断提取客户机代码并且转化成宿主机指定架构的代码。整个翻译任务分为两个部分:第一个部分将客户机代码转化成TCG中间代码,然后再将中间代码转化成宿主机代码。开始执行:比较重要的C语言文件有:vl.c、cpus.c、exec-all.c、exec.c和cpu-exec.c。硬件模拟:所有的硬件设备都在/hw/目录下面,所有的设备都有独自的文件,包括总线,串口,网卡,鼠标等等。目标机器:现在QEMU可以模拟的CPU架构有:Alpha,ARM,Cris,i386,Mips,MicroBlaze,S390X和SH4等。主机:使用TCG代码生成主机的代码,存放在/tcg/目录中。代码结构1.QEMU源码架构2.TCG动态翻译TCG代码转换过程1.QEMU源码架构3.TB链在QEMU中,从代码CACHE到静态代码再回到代码CACHE,这个过程比较耗时,所以在QEMU中涉及了一个TB链将所有TB连在一起,可以让一个TB执行完以后直接跳到下一个TB,而不用每次都返回到静态代码部分。TB链的执行流程1.QEMU源码架构4.QEMU的TCG代码分析main_loop(...){/vl.c}:函数main_loop初始化qemu_main_loop_start()然后进入无限循环cpu_exec_all(),这个是QEMU的一个主要循环。qemu_main_loop_start(...){/cpus.c}:函数设置系统变量qemu_system_ready=1,然后重启所有的线程并且等待一个条件变量。cpu_exec(...){/cpu-exec.c}:是CPU指令执行的主函数。disas_insn(){/target-arch/translate.c}:真正的实现将客户机代码翻译成TCG代码。tcg_gen_code(...){/tcg/tcg.c}:将TCG的代码转化成主机代码1.QEMU源码架构5.QEMU中的ioctl创建KVM在/vl.c中通过kvm_init()将会创建各种KVM的结构体变量,并且通过ioctl与已经初始化好的KVM模块进行通讯,创建虚拟机,然后创建vCPU等等。KVM_RUN当KVM需要QEMU处理一些指令和I/O时,就会通过这个ioctl退回到QEMU进行处理,否则会一直在KVM中执行。KVM_IRQ_LINE当设备有中断时,通过ioctl调用KVM里面的kvm_set_irq将中断注入到虚拟的中断控制器。2.QEMU线程事件模型1.QEMU的事件驱动核心一个事件驱动的架构是以派发一个事件到处理函数的循环为核心的。QEMU的主事件循环是main_loop_wait(),它主要完成以下工作:1)等待文件描述符变成可读或可写。文件描述符是一个关键角色,因为files、sockets、pipes以及其他各种各样的资源都使用文件描述符(filedescriptors)。文件描述符的增加使用qemu_set_fd_handler()函数。2)处理到期的定时器(timer)。定时器的添加使用qemu_mod_timer()函数。3)执行bottom-halves(BHs),它和定时器类似会立即过期。BHs用来放置回调函数的重入和溢出。2.QEMU线程事件模型2.QEMU的线程分类主线程执行循环,主要做三件事情:1)执行select操作,查询文件描述符有无读写操作。2)执行定时器回调函数。3)执行下半部(BHs)回调函数。采用BHs的原因主要是避免可重入性和调用栈溢出。执行客户机代码的线程:只讨论KVM执行客户机代码情况(不考虑TCG,TCG采用动态翻译技术),如果有多个vCPU,就意味着存在多个线程。异步I/O文件操作线程:提交I/O操作请求到队列中,该线程从队列取请求,并进行处理。主线程与执行客户机代码同步线程:主线程与执行客户机代码线程不能同时运行,要通过一个全局互斥锁实现。3.Libkvm模块但是考虑到未来的扩展性,KVM开发小组提供了Libkvm模块,此模块包装了针对设备文件/dev/kvm的具体ioctl操作,同时还提供了关于KVM的相关初始化函数,这样就使Libkvm模块成为了一个可复用的用户空间的控制模块,供其他程序开发包所使用,比如Libvirt等。Libkvm模块是QEMU和KVM内核模块中间的通信模块,虽然KVM的应用程序编程接口比较稳定,同时也提供了/dev/kvm设备文件作为KVM的API接口。4.Virtio组件Virtio是半虚拟化Hypervisor中位于设备之上的抽象层。在开始学习Virtio组件的内容之前,需要先了解半虚拟化和模拟设备的相关内容。完全虚拟化环境下的设备模拟半虚拟化环境下的设备模拟4.Virtio组件1.Virtio的驱动程序抽象Virtio的驱动程序抽象4.Virtio组件2.Virtio架构除了前端驱动程序(Front-enddrivers,在客户操作系统中实现)和后端驱动程序(Back-enddrivers,在Hypervisor中实现)之外,Virtio还定义了两个层次来支持客户操作系统到Hypervisor的通信。上层(virtio层)是虚拟队列接口;下层是transport层,负责virtio层和后端驱动进而到Hypervisor的交互。Virtio框架架构4.Virtio组件Virtio前端的对象层次结构4.Virtio组件3.核心APIvirtio_device和virtqueue将客户机操作系统中的驱动程序与Hypervisor驱动程序链接起来。virtqueue支持自己独有的API集合,使用函数add_buf向Hypervisor提供请求。客户机操作系统通过get_buf函数触发来自Hypervisor的响应,并调用该函数或通过virtqueuecallback函数等待通知来实现轮询。virtqueueAPI的最后两个函数是enable_cb和disable_cb,分别用来启用或禁用回调进程(通过在virtqueue中初始化的callback函数实现)。QEMU内存模型03QEMU内存模型QEMU内存API仿真了QEMU的内存,I/O总线以及对应的控制器,主要包括以下部分的仿真:1.常规内存。2.I/O映射内存(MMIO)。3.内存控制器(将物理内存动态的映射到不同的虚拟地址空间)。QEMU内存模型主要包括以下功能:1.跟踪目标机内存的变化。2.为KVM建立共享内存(CoalescedMemory)。3.为KVM建立ioeventfdregions。QEMU内存模型QEMU中包含四种类型的MemoryRegions,通过C数据结构structMemoryRegion来表示。1.RAMRegion:目标机可用的主机上的一段虚拟地址空间。2.MMIORegion:注册了read和write回调函数(callbacksfunctions)的一段目标机地址空间,对这段空间的读写操作将会调用主机上的回调函数。3.Container:多个MemoryRegions的集合,每个MR(MemoryRegions)在Container中有不同的offset。4.Alias:某个MR的subsection,Alias类型的MR可以指向任何其他类型的MR。QEMU内存模型当目标系统访问某个地址空间时,QEMU内存管理系统按照如下规则选择一个MR:1.从根节点按照降序的优先级进行匹配。2.如果当前的MR是叶子节点,搜索过程终止。3.如果当前MR是Container,相同的算法在Container中搜索。4.如果当前MR是Alias,搜索从Alias指向的MR继续进行。QEMU的PCI总线与设备PCI结构简介QEMU的PCI总线QEMU的PCI-PCI桥QEMU的PCI设备041.PCI结构简介每一个PCI设备都对应一段内存空间,里面按照地址位置放置PCI设备的信息,包括厂家信息,bar信息,中断等等,也可以理解成一个数组,一些设备一出厂,相关的信息已经写在里面,模拟设备的所有信息都要进行动态的读和写。PCI设备信息表PCI设备内存低地址

PCI设备内存高地址0x000x040x080x0C0x00VendorIDDevIDcommand

0x10bar0addrbar1addrbar2addrbar3addr0x20bar4addrbar5addr

0x30

interruptline

2.QEMU的PCI总线QEMU在初始化硬件的时候,最开始的函数就是pc_init1。在这个函数里面会相继的初始化CPU,中断控制器,ISA总线,然后就要判断是否需要支持PCI,如果支持则需调用i440fx_init初始化PCI总线。i440fx_init函数的主要参数是初始化好的ISA总线以及中断控制器,返回值是PCI总线,初始化之后就可以将设备进行挂载。在Linux里面可以使用命令lspci-t来看PCI总线的结构图。3.QEMU的PCI-PCI桥在QEMU中,所有的设备包括总线、桥、一般设备等都对应一个设备结构,通过register函数将所有的设备链接起来。在QEMU启动的时候会初始化所有的QEMU设备,而对于PCI设备来说,QEMU在初始化以后还会进行一次RESET,将所有的PCIbar上的地址清空,然后进行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论