收藏 分享(赏)

《云计算虚拟化技术基础与实践》课件第六章 QEMU虚拟化原理.pptx

上传人:bubibi 文档编号:21763087 上传时间:2024-04-23 格式:PPTX 页数:30 大小:2.55MB
下载 相关 举报
《云计算虚拟化技术基础与实践》课件第六章 QEMU虚拟化原理.pptx_第1页
第1页 / 共30页
《云计算虚拟化技术基础与实践》课件第六章 QEMU虚拟化原理.pptx_第2页
第2页 / 共30页
《云计算虚拟化技术基础与实践》课件第六章 QEMU虚拟化原理.pptx_第3页
第3页 / 共30页
《云计算虚拟化技术基础与实践》课件第六章 QEMU虚拟化原理.pptx_第4页
第4页 / 共30页
《云计算虚拟化技术基础与实践》课件第六章 QEMU虚拟化原理.pptx_第5页
第5页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、本章重点1.理解QEMU的运行模式。2.了解QEMU的软件构成。3.理解QEMU的内存模型。4.理解QEMU的PCI总线与设备。QEMU运行模式0 1QEMU运行模式QEMU作为一个开源的硬件模拟器项目,除了支持x86体系架构之外,还支持ARM、MIPS、PowerPC、IA64等多种CPU硬件架构。QEMU除了支持KVM之外,还支持全虚拟机和kqemu加速模块等方式QEMU的三种模块架构QEMU软件构成1.QEMU源码架构2.QEMU线程事件模型3.Libkvm模块4.Virtio组件0 2QEMU软件构成QEMU的软件架构QEMU主要由以下几个部分组成:Hypervisor控制仿真。Tin

2、y Code Generator(TCG)在虚拟机器代码和宿主机代码之间进行转换。软件内存管理单元(MMU)处理内存访问。磁盘子系统处理不同的磁盘映像格式。设备子系统处理网卡和其他硬件设备。1.QEMU源码架构QEMU源码的获取可以访问QEMU的官方网站:https:/www.qemu.org/download/。QEMU的源码总体上分为指令翻译(位于tcg目录下的文件)、硬件模拟(位于hw目录下的文件)、网络传输(位于slirp目录下的文件)和文件系统(block前缀文件)四个部分,其主程序涉及的相关文件有vl.c、cpu-exec.c、exec.c、translate-all.c、thun

3、k.c、disas.c。1.QEMU源码架构1.代码结构QEMU中有一个模块叫做微型代码生成器(TCG,Tiny Code Generator),它用来将客户机代码翻译成宿主机代码。QEMU指令动态翻译过程1.QEMU源码架构QEMU的主要功能就是不断提取客户机代码并且转化成宿主机指定架构的代码。整个翻译任务分为两个部分:第一个部分将客户机代码转化成TCG中间代码,然后再将中间代码转化成宿主机代码。1.开始执行:比较重要的C语言文件有:vl.c、cpus.c、exec-all.c、exec.c和cpu-exec.c。2.硬件模拟:所有的硬件设备都在/hw/目录下面,所有的设备都有独自的文件,包

4、括总线,串口,网卡,鼠标等等。3.目标机器:现在QEMU可以模拟的CPU架构有:Alpha,ARM,Cris,i386,Mips,MicroBlaze,S390X和SH4等。4.主机:使用TCG代码生成主机的代码,存放在/tcg/目录中。1.代码结构1.QEMU源码架构2.TCG动态翻译TCG代码转换过程1.QEMU源码架构3.TB链在QEMU中,从代码CACHE到静态代码再回到代码CACHE,这个过程比较耗时,所以在QEMU中涉及了一个TB链将所有TB连在一起,可以让一个TB执行完以后直接跳到下一个TB,而不用每次都返回到静态代码部分。TB链的执行流程1.QEMU源码架构4.QEMU的TCG

5、代码分析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的

6、代码转化成主机代码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的事件驱动核心一个事件驱动的架构是以派发一个事件到处理函数的循环为核心的。QEM

7、U的主事件循环是main_loop_wait(),它主要完成以下工作:1)等待文件描述符变成可读或可写。文件描述符是一个关键角色,因为files、sockets、pipes以及其他各种各样的资源都使用文件描述符(file descriptors)。文件描述符的增加使用qemu_set_fd_handler()函数。2)处理到期的定时器(timer)。定时器的添加使用qemu_mod_timer()函数。3)执行bottom-halves(BHs),它和定时器类似会立即过期。BHs用来放置回调函数的重入和溢出。2.QEMU线程事件模型2.QEMU的线程分类主线程执行循环,主要做三件事情:1)执行

8、select操作,查询文件描述符有无读写操作。2)执行定时器回调函数。3)执行下半部(BHs)回调函数。采用BHs的原因主要是避免可重入性和调用栈溢出。执行客户机代码的线程:只讨论KVM执行客户机代码情况(不考虑TCG,TCG采用动态翻译技术),如果有多个vCPU,就意味着存在多个线程。异步I/O文件操作线程:提交I/O操作请求到队列中,该线程从队列取请求,并进行处理。主线程与执行客户机代码同步线程:主线程与执行客户机代码线程不能同时运行,要通过一个全局互斥锁实现。3.Libkvm模块但是考虑到未来的扩展性,KVM开发小组提供了Libkvm模块,此模块包装了针对设备文件/dev/kvm的具体i

9、octl操作,同时还提供了关于KVM的相关初始化函数,这样就使Libkvm模块成为了一个可复用的用户空间的控制模块,供其他程序开发包所使用,比如Libvirt等。Libkvm模块是QEMU和KVM内核模块中间的通信模块,虽然KVM的应用程序编程接口比较稳定,同时也提供了/dev/kvm设备文件作为KVM的API接口。4.Virtio组件Virtio是半虚拟化Hypervisor中位于设备之上的抽象层。在开始学习Virtio组件的内容之前,需要先了解半虚拟化和模拟设备的相关内容。完全虚拟化环境下的设备模拟半虚拟化环境下的设备模拟4.Virtio组件1.Virtio的驱动程序抽象Virtio的驱动

10、程序抽象4.Virtio组件2.Virtio架构除了前端驱动程序(Front-end drivers,在客户操作系统中实现)和后端驱动程序(Back-end drivers,在Hypervisor中实现)之外,Virtio还定义了两个层次来支持客户操作系统到Hypervisor的通信。上层(virtio层)是虚拟队列接口;下层是transport层,负责virtio层和后端驱动进而到Hypervisor的交互。Virtio框架架构4.Virtio组件Virtio前端的对象层次结构4.Virtio组件3.核心APIvirtio_device和virtqueue将客户机操作系统中的驱动程序与Hyp

11、ervisor驱动程序链接起来。virtqueue支持自己独有的API集合,使用函数add_buf向Hypervisor提供请求。客户机操作系统通过get_buf函数触发来自Hypervisor的响应,并调用该函数或通过virtqueue callback函数等待通知来实现轮询。virtqueue API的最后两个函数是enable_cb和disable_cb,分别用来启用或禁用回调进程(通过在virtqueue中初始化的callback函数实现)。QEMU内存模型0 3QEMU内存模型QEMU内存API仿真了QEMU的内存,I/O总线以及对应的控制器,主要包括以下部分的仿真:1.常规内存。2

12、.I/O映射内存(MMIO)。3.内存控制器(将物理内存动态的映射到不同的虚拟地址空间)。QEMU内存模型主要包括以下功能:1.跟踪目标机内存的变化。2.为KVM建立共享内存(Coalesced Memory)。3.为KVM建立ioeventfd regions。QEMU内存模型QEMU中包含四种类型的Memory Regions,通过C数据结构struct MemoryRegion来表示。1.RAM Region:目标机可用的主机上的一段虚拟地址空间。2.MMIO Region:注册了read和write回调函数(callbacks functions)的一段目标机地址空间,对这段空间的读写

13、操作将会调用主机上的回调函数。3.Container:多 个 Memory Regions的 集 合,每 个MR(Memory Regions)在Container中有不同的offset。4.Alias:某个MR的subsection,Alias类型的MR可以指向任何其他类型的MR。QEMU内存模型当目标系统访问某个地址空间时,QEMU内存管理系统按照如下规则选择一个MR:1.从根节点按照降序的优先级进行匹配。2.如果当前的MR是叶子节点,搜索过程终止。3.如果当前MR是Container,相同的算法在Container中搜索。4.如果当前MR是Alias,搜索从Alias指向的MR继续进行。

14、QEMU的PCI总线与设备1.PCI结构简介2.QEMU的PCI总线3.QEMU的PCI-PCI桥4.QEMU的PCI设备0 41.PCI结构简介每一个PCI设备都对应一段内存空间,里面按照地址位置放置PCI设备的信息,包括厂家信息,bar信息,中断等等,也可以理解成一个数组,一些设备一出厂,相关的信息已经写在里面,模拟设备的所有信息都要进行动态的读和写。PCI设备信息表 PCI设备内存低地址内存低地址PCI设备内存高地址内存高地址0 x000 x040 x080 x0C0 x00Vendor ID Dev IDcommand0 x10bar0 addrbar1 addrbar2 addrba

15、r3 addr0 x20bar4 addrbar5 addr0 x30interrupt line2.QEMU的PCI总线QEMU在初始化硬件的时候,最开始的函数就是pc_init1。在这个函数里面会相继的初始化CPU,中断控制器,ISA总线,然后就要判断是否需要支持PCI,如果支持则需调用i440fx_init初始化PCI总线。i440fx_init函数的主要参数是初始化好的ISA总线以及中断控制器,返回值是PCI总线,初始化之后就可以将设备进行挂载。在Linux里面可以使用命令lspci-t来看PCI总线的结构图。3.QEMU的PCI-PCI桥在QEMU中,所有的设备包括总线、桥、一般设备

16、等都对应一个设备结构,通过register函数将所有的设备链接起来。在QEMU启动的时候会初始化所有的QEMU设备,而对于PCI设备来说,QEMU在初始化以后还会进行一次RESET,将所有的PCI bar上的地址清空,然后进行统一分配。QEMU的PCI默认设备都是挂载在主总线上,PCI-PCI桥的作用是连接两个总线,然后进行终端和I/O的映射。为了方便,QEMU把Power PC架构里面的DEC桥拿来使用,关键就是包含相关头文件,修改x86下面的配置文件,将DEC桥配置好,这种i440FX加DEC的组合在真实设备上并不常见。使用lspci-t能够看到QEMU自己初始化桥的结构图。4.QEMU的

17、PCI设备一般的PCI设备其实和桥很像,甚至更简单,区分桥和一般设备可以通过class属性和bar地址。下面给出一个标准的PCI设备结构。pci_fpga_init函数实现了fpga设备的相关初始化操作(申请地址空间、分配设备操作接口等),其中最重要的是给bar分配I/O地址static PCIDeviceInfo fpga_info=.qdev.name=fpga,.qdev.size=sizeof(FPGAState),.init=pci_fpga_init,;static void fpga_register_devices(void)pci_qdev_register(&fpga_info);device_init(fpga_register_devices);谢谢!

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 职业教育

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:文库网官方知乎号:文库网

经营许可证编号: 粤ICP备2021046453号世界地图

文库网官网©版权所有2025营业执照举报