IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 第三章 虚拟化概述(I/O虚拟化) -> 正文阅读

[嵌入式]第三章 虚拟化概述(I/O虚拟化)

??????? 外设资源是有限的,为了满足多个客户机操作系统的需求,VMM必须通过I/O虚拟化的方式来复用有限的外部资源。VMM截获客户机操作系统对设备的访问请求,然后通过软件的方式来模拟真实设备的效果。从处理器角度看,外设是通过一组I/O资源(端口I/O或者是MMIO)来进行访问的,对设备相关的虚拟化又被称为I/O虚拟化。

一、概述

??????? 首先分析一下没有虚拟化的情况。给定一个外设,定义有自己的一套供软件访问的接口,这些接口的属性可能是单向的,也可能是双向的。操作系统含有外设的驱动程序,它们接收来自其他模块(如用户进程)的请求,然后按照外设规定好的方式驱动外设完成特定的任务。由于处理器在计算机中的核心地位,因此外设的访问接口最终也会被映射到处理器所能认识的地址空间或者其他资源中。当驱动程序通过指令的方式访问外设接口时,处理器才能正确识别目标对象,然后将相关请求发送到系统总线上,最终由芯片组转发给目标外设。

??????? 1、I/O端口寄存器。映射到I/O地址空间,通过in/out指令访问。当指令处于非最高特权级,只有通过I/O位图中的允许端口才可以访问。

??????? 2、MMIO寄存器。映射到物理地址空间,通过页表的方式控制访问权限。

??????? 3、中断。中断模块发出中断消息,通过芯片组中的中断控制器通知给处理器,最后处理器会中断当前指令流,跳到中断描述符表IDT中对应该向量的中断服务程序执行。

??????? I/O端口,MMIO与中断模块组成一个典型外设呈现给软件的基本资源。还有一个特殊模块DMA,它被映射到I/O端口或MMIO中。在虚拟环境中,I/O面临的问题是:现实中外设资源是有限的,为了满足多个客户机操作系统对外设访问的需求,VMM必须通过I/O虚拟化的方式复用有限的外设资源。在这种情况下,VMM所要做的还是模拟,即截获客户机操作系统对设备的访问请求,然后通过软件的方式模拟真实物理设备的效果。

??????? I/O虚拟化并不需要完整的虚拟化出所有外设的所有接口,究竟怎样做完全取决于设备与VMM的策略以及客户机操作系统的需求。

??????? 1、虚拟芯片组。

? ? ? ? 2、虚拟PCI总线布局。

? ? ? ? 3、虚拟系统设备:PIC、IO-APIC、PIT、RTC

? ? ? ? 4、虚拟基本输入输出设备:显卡、网卡、硬盘

? ? ? ? 虚拟完毕后,只要客户操作系统中有驱动程序遵守该虚拟设备的接口定义,它就可以被客户操作系统所使用。

二、设备发现

? ? ? ? I/O虚拟化第一步,就是VMM提供一种方式,让客户机操作系统能够发现设备,这样客户机操作系统才能加载相关的驱动程序。设备被发现,取决于被虚拟的设备类型。

? ? ? ? 模拟一个物理总线上的设备

? ? ? ? 1、所处物理总线类型是不可枚举,而且设备本身所属的资源是硬编码固定下来的。例如:ISA设备、PS/2设备、鼠标、RTC、IDE控制器。这类设备,驱动程序可能会通过设备特定的方式来检测设备是否存在(读取特定端口状态信息)。所以,只要VMM在给定端口进行了正确的模拟,客户机操作系统就能成功的检测到虚拟设备的存在。

? ? ? ? 2、所处总线类型是可枚举的,而且设备相关资源是软件可配置的。这类设备典型例子就是PIC设备。PIC总线通过PIC配置空间定义了一套完备的设备发现方式,并允许系统软件通过PCI配置空间的一些字段对给定PIC设备进行资源配置(允许或禁止I/O端口和MMIO、设置I/O和MMIO的起始地址)。所以,VMM仅仅模拟设备自身逻辑是不够的,它必须进一步模拟PCI总线的行为,包括拓扑关系和设备特定配置空间内容,以便让客户机操作系统发现这类虚拟设备。(当时读Fiasco时候,对chip数据结构一直不理解,认为是多余的,是自己乱弹琴了)

? ? ? ? 模拟一个完全虚拟的设备

? ? ? ? 在这种情况下,因为没有一个现实中的规范与之对应,这种虚拟设备所处的总线类型完全由VMM自行决定。VMM可以选择把设备挂在PIC总线上,也可以完全自定义一套新的虚拟总线协议。因此,当遇到复杂的总线需要模拟时,VMM完全可以自定义并使用一套简化的、适用于该类型虚拟设备的总线,避免模拟的复杂性。当然,客户机操作系统也必须加载一个特殊的总线驱动程序才行。因此,使用原来的PIC总线的好处是兼容性,客户机操作系统可以重用已有的总线驱动来发现设备,而引入新的总线协议带来的问题就是维护性。(使用VM或者VirtualBox安装Windows的时候,为了拖拽为了上网,总会提示安装驱动,就是这个原因)

三、访问截获

? ? ? ? 现在、虚拟设备已经被客户机操作系统发现了,客户机操作系统中的驱动程序就会按照接口定义访问这个虚拟设备。VMM不仅需要知道那个虚拟设备相关的接口资源,还得找到有效的方法来截获客户机操作系统对虚拟设备的访问,并进行模拟。其关键点,就在于处理器虚拟化。

? ? ? ? I/O访问拦截

? ? ? ? 对于非直接分配给客户机操作系统使用的设备。假如该设备可以具有端口I/O资源,那么我们知道处理器对于端口I/O资源的控制在于指令流所处的特权级别和相关I/O位图。客户机操作系统运行在非特权级环境中,能否访问给定I/O端口完全由I/O位图决定。所以,VMM可以把设备所有端口I/O从I/O位图中关闭,这样,当客户机操作系统访问I/O端口时,物理处理器就会及时的抛出一个异常,VMM就可以获得异常的原因,然后将请求发送给设备模拟器进行模拟。

? ? ? ? 对于直接分配给客户机操作系统使用的设备。VMM可以把该设备所属端口I/O从I/O位图中打开,这样处理器就会把访问送到系统总线,最终到达目标物理设备而不被模拟。

? ? ? ? MMIO访问拦截

????????对于非直接分配给客户机操作系统使用的设备。假设该设备可以提供MMIO资源,那么我们知道MMIO本身也是物理地址空间的一部分,而物理地址空间的访问控制是通过页表来控制的。因此,VMM只要在真实页表里把映射到该MMIO的页表项设为无效,当客户机操作系统再访问目标地址时,物理处理器就会抛出一个缺页异常,接着VMM遍历客户机页表,就可以发现设备所属的MMIO资源,然后将请求发送给设备模拟器进行模拟。

????????对于直接分配给客户机操作系统使用的设备。VMM只需要按照客户机页表的设置打开真实页表的映射即可,这样客户机操作系统对该设备的访问也不再被模拟。

? ? ? ? DMA访问拦截

? ? ? ? 假设某设备可以提供DMA或类似的共享内存机制,那么我们知道DMA允许设备绕过处理器直接访问目标内存,而若客户机驱动程序是未经过修改的,则设备模拟器接收到的DMA目标地址时客户机物理地址。因此,VMM只需要提供一种机制,让设备模拟器可以了解各种地址之间的转换关系,从而把客户机物理地址映射成自己的虚拟地址,就能真正做到对DMA目标地址访问了。

? ? ? ? 中断拦截

????????对于非直接分配给客户机操作系统使用的设备。假设该设备可以产生中断,那么VMM只要提供一种机制,供设备模拟器在接收到物理中断并需要触发中断时,可以通知到虚拟中断逻辑,然后由虚拟中断逻辑模拟一个虚拟中断的注入。

????????对于直接分配给客户机操作系统使用的设备。VMM物理中断处理函数在接收到物理中断后,辨认出中断源属于某个客户机,然后通知该客户机的虚拟中断逻辑。

四、设备模拟

? ? ? ? 虚拟现在可以与现实设备具有完全一样的接口定义,从而允许客户机操作系统中的原有驱动程序无须修改就能驱动这个虚拟设备。这时,VMM的设备模拟器往往需要仔细研究现实设备的接口定义和内部设计规范,然后以软件的方式模拟真实的逻辑电路来满足每个接口定义和效果。

? ? ? ? 设备驱动程序为了完成一次操作要涉及到多个寄存器的操作,使得VMM要拦截每个寄存器访问并进行相应的模拟,也就导致多次上下文切换。

????????既然无论如何VMM需要在客户机操作系统中提供一个特定的驱动程序,那么还可以把这个驱动程序进一步简化,并称客户机操作系统中的驱动程序为前端(Front-End,FE)设备驱动,而VMM中的驱动程序为后端(Back-End,BE)。简化就是,FE将来自其他模块的请求通过客户机之间的特殊通信机制直接发送给BE,而BE在处理完请求后再发回通知给前者。这种方式基于请求/事务,能在很大程度上减少上下文切换的频率,提供更大的优化空间。

? ? ? ? 如果直接将物理设备分配给某个客户机操作系统,由客户机操作系统直接访问目标设备,VMM不需要为这种方式提供模拟,客户机操作系统原有的驱动程序也可以无缝的操作目标设备,这种I/O虚拟化的方式从性能上来说是最优的。但这种虚拟化方式仍然会受到最大可用资源的限制。目前与此相关的技术又IOMMU,Intel VT-d,PCI-SIG SR-IOV。

I/O虚拟化方式兼容性性能成本扩展性
完全模拟重用已有驱动太多上下文切换没有额外硬件开销设备模拟器是瓶颈
FE/BE加载特定驱动FE/BE开销没有额外硬件开销BE是瓶颈

直接分配

VT-d

重用已有驱动减少虚拟化开销需要购买较多额外硬件有局限性,扩展槽一般是有限的

直接分配

SR-IOV

重用已有驱动减少虚拟化开销需要购买较少额外硬件扩展性较好,SR-IOV设备本身支持多个虚拟机同时访问

? ? ? ? IOMMU

????????IOMMU则是把设备访问的虚拟地址转化成物理地址。为了防止设备错误地访问内存,有些IOMMU还提供了访问内存保护机制。客户机操作系统通常不知道它所访问的物理内存地址,如果要进行DMA操作,就有可能破坏内存。因为实际的硬件不知道内存地址之间的映射关系。IOMMU根据内存地址之间的转换表重映射硬件访问的地址,就可以解决这个问题。(IOMMU是设备访问内存,MMU是CPU访问内存

????????Intel VT-d

????????VT-d是一个位于CPU、内存和I/O设备之间的硬件设备,通常位于PCI设备树的根部,或者类似的位于I/O子系统的根部,当VT-d重定向硬件设备启用的时候,它会拦截位于它下面的所有I/O设备产生的中断请求和通过DMA方式对虚拟机内存访问的请求,然后通过查找中断重定向表或者I/O页表的方式(类似分页机制)来重新定位中断转发的目标LAPIC或者是I/O设备访问的目标主机物理内存地址。VMM软件负责I/O设备的分配,即将指定I/O设备和相应的VM对应起来,并且负责建立中断重定向关系表和I/O地址转换页表,并将这些转换关系的配置设置到VT-d硬件设备上,而I/O设备发起的中断请求或者DMA内存访问请求中带有相应设备的ID,这样VT-d硬件单元就可以通过硬件查找的方式将不同的I/O设备中断和内存访问请求重定向到相应的VM上,从而达到隔离不同VM的I/O设备的目的。

????????PCI-SIG SR-IOV

????????每个 SR-IOV 设备都可有一个物理功能 (Physical Function, PF),并且每个 PF 最多可有 64,000 个与其关联的虚拟功能 (Virtual Function, VF)。PF 可以通过寄存器创建 VF,这些寄存器设计有专用于此目的的属性。一旦在 PF 中启用了 SR-IOV,就可以通过 PF 的总线、设备和功能编号(路由 ID)访问各个 VF 的 PCI 配置空间。每个 VF 都具有一个 PCI 内存空间,用于映射其寄存器集。VF 设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的 PCI 设备。创建 VF 后,可以直接将其指定给 IO 来宾域或各个应用程序(如裸机平台上的 Oracle Solaris Zones)。此功能使得虚拟功能可以共享物理设备,并在没有 CPU 和虚拟机管理程序软件开销的情况下执行 I/O。记住,SR-IOV只是提供了一种共享PCIe设备的方法——SR-IOV并没有增加现有设备的能力——所以如果一个网卡共享过渡,SR-IOV会超负荷工作。举个例子,一个1Gb网卡实际上能支持达8个VF,而一个10Gb网卡实际上能支持达64个VF。SR-IOV需要高负载的环境可能会让这个数字减少,所以在把SR-IOV部署到生产环境中前测试共享和评估负载通信的性能是非常重要的。

五、设备共享

? ? ? ? VMM可以选择性虚拟化一些不同设备,其中有些设备可以被设备模拟器用软件的方式完全模拟而不用接触实际物理设备,如CMOS。有些设备可能需要设备模拟器进一步请求物理驱动程序(VMM中的物理驱动)帮助。如鼠标、键盘、显卡、硬盘、网卡。

? ? ? ? 设备模拟器通常运行在I/O特权环境中,这样的I/O特权环境中有驱动物理外设的物理驱动程序。在这种情况下,相关的设备模拟器本身是作为物理驱动程序的客户存在的,类似一个用户进程。I/O特权环境中的大多数物理驱动程序都是可以同时接收多个客户或是进程的请求,从而达到物理资源的复用。

? ? ? ? 同样,每个虚拟机都有自己专属的设备模拟逻辑,也就是在I/O特权环境中存在一个对应的用户进程。通过这种方式,I/O虚拟化就有效的将物理资源在多个虚拟环境中复用起来。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:19:00  更:2021-09-06 11:21:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 9:14:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计