精华内容
下载资源
问答
  • 内存虚拟化

    2020-12-07 10:37:10
    内存虚拟化

    内存虚拟化

    展开全文
  • 虚拟化-内存虚拟化

    千次阅读 2017-10-27 18:08:33
    内存虚拟化相关概念

    缩写说明:

    * pfn: host page frame number,宿主机中某个物理页的帧数
    * hpa: host physical address,宿主机的物理地址
    * hva: host virtual address,宿主机的虚拟地址
    * gfn: guest page frame number,虚拟机中某个物理页的帧数
    * gpa: guest physical address,虚拟机的物理地址
    * gva: guest virtual address,虚拟机的虚拟地址
    * pte: page table entry,指向下一级页表或者页的物理地址,以及相应的权限位
    * gpte: guest pte,指向GPT中下一级页表或者页的gpa,以及相应的权限位
    * spte: shadow pte,指向EPT中下一级页表或者页的hpa,以及相应的权限位
    * tdp: two dimentional paging,也就是我们所说的EPT机制
    

    问题:

    1.什么是MMU?

    Memory manage unit
    ,也就是内存管理单元,一般封装于cpu的内部,主要职责为将虚拟地址翻译为物理地址,相当于一个cpu和内存之前的一个中间转换层,对软件来说是不可见的,对上层软件的开发者来说并不需要关心他,但是对于OS移植或底层驱动开发者来说,则必须清楚如何辅助MMU完成地址转换。

    2,页/页帧/页表/页表项

    MMU值负责把虚拟地址映射为物理地址,但凡涉及到映射都需要解决两个问题:映射的最小单位,映射的规则。

    • 页(Page):

    MMU中映射的最小单位为页(Page),也就是说映射的最小粒度为单个徐你也到单个物理页,大小通常为4K, 即从0开始以4K对齐划分页块,页内便宜不变。
    页是最小单位,不能把VA中的某一页划分成几小块分别映射到不同的PA,也不能把VA中属于不同页的碎块PA的某一页的不同部分,必须是整页对整页的映射。

    • 页帧(Page Frame):

    页帧指的是物理内存中的一页内存,MMU虚拟地址映射就是寻找寻找物理页帧的过程。

    • 页表(Page Table):

    MMU软件配置的核心是页表,它描述MMU的映射规则,即描述虚拟内存的那个页到物理内存的那个页,页表由一条条代表映射规则的记录组成,每一条称为一个页表条目(Page
    Table Entry),整个页表保存在片外内存,MMU通过查找页表确定映射关系,以及是否有权限映射。

    • TLB(Transslation Lookaside Buffers)转换块表,简称块表

    如果MMU每次地址转换都去片外内存上的页表上查找对应的页表条目,那么转换速度会大大降低,于是就有了TLB。
    TLB,简称块表,可以理解为MMU内部专用的存放页表的cache,保存着最近使用的页表条目,或者全部页表。当MMU接收到虚拟地址后首先在TLB中查找,如果找到该VA对应的转换条目则可以直接转换,当找不到时在去外部页表查找,并置换进TLB。由于TLB访问速度快,通过TLB缓存的页表可以为MMU的地址转换加速。

    3.什么是内存虚拟化,内存虚拟化的目的?

    内存虚拟化是将真实的物理内存,通过虚拟化技术,虚拟出一个虚拟的内存区间,这个虚拟机的内存则用来作为客户虚拟机的物理内存(这里是针对客户机开说),也就是说,
    为了让客户机使用一个隔离的、从零开始且具有连续的内存空间,KVM 引入一层新的地址空间,即客户机物理地址空间 (Guest Physical
    Address, GPA),而这个地址空间并不是真正的物理地址空间,它只是宿主机虚拟地址空间在客户机地址空间的一个映射。
    GVA –> GPA –> HVA –> HPA
    GVA到GPA的转化是由客户机的页表实现的

    4.影子页表是什么?

    由于宿主机 MMU
    不能直接装载客户机的页表来进行内存访问,所以当客户机访问宿主机物理内存时,需要经过多次地址转换。也即首先根据客户机页表把客户机虚拟地址转传成客户机物理地址,然后再通过客户机物理地址到宿主机虚拟地址之间的映射转换成宿主机虚拟地址,最后再根据宿主机页表把宿主机虚拟地址转换成宿主机物理地址。而通过影子页表,则可以实现客户机虚拟地址到宿主机物理地址的直接转换。
    影子页表实质上是一个客户机虚拟地址到宿主机物理地址的映射关系
    VMM维护影子页表,影子页表是虚拟机正真使用的页表
    VFN-虚拟页框号,PFN-物理页框号,MFN-机器页框号
    客户OS创建之后,VMM创建其对应影子页表。刚开始影子页表是空的,此时任何客户OS的访存操作都会发生缺页中断,然后VMM捕获缺页异常,根据VFN在客户机页表中得到PFN,然后在P2M表中得到MFN,写入影子页表。这样逐步完成客户机所有虚拟地址到宿主机机器地址的映射。
    影子页表与客户机页表的同步。基本原理是对客户机页表进行写保护,VMM就会捕获到客户机页表项的修改,然后陷入到VMM中对影子页表进行相应修改以保持同步。

    > 5.EPT是什么?

    EPT 技术是在原有客户机页表对客户机虚拟地址到客户机物理地址映射的基础上,又引入了 EPT
    页表利用硬件来实现客户机物理地址到宿主机物理地址的另一次映射,这两次地址映射都是由硬件自动完成。在客户机物理地址到宿主机物理地址转换的过程中,由于缺页、写权限不足等原因也会导致客户机退出,产生
    EPT 异常,对于 EPT 缺页异常,KVM
    首先根据引起异常的客户机物理地址,映射到对应的宿主机虚拟地址,然后为此虚拟地址分配新的物理页,最后 KVM 再更新 EPT
    页表,建立起引起异常的客户机物理地址到宿主机物理地址之间的映射。对 EPT 写权限引起的异常,KVM 则通过更新相应的 EPT 页表来解决。

    在KVM最新的内存虚拟化技术中,采用的是两级页表映射,客户端采用的是传统操作系统的页表,被称作guest page
    table(GPT),记录的是客户机虚拟地址到客户机物理地址的映射,而KVM维护的是第二级页表extended page table
    (EPT)(注:在AMD架构中被称为NPT ,nested page table),该表记录的是客户机的物理地址到宿主机的物理地址的映射
    KVM在还没有EPT硬件支持时,采用的是影子页表机制,为了和之前代码兼容,在当前的实现中。EPT机制是在影子页表的基础之上实现
    和传统的页表一样,EPT的页表结构也是分为四层(PML4,PDPT,PD,PT)

    展开全文
  • 文章目录目录前文列表虚拟存储器Linux 虚拟存储器内存虚拟化KVM 的内存虚拟化 前文列表 《虚拟化技术实现 — 虚拟化技术发展编年史》 《虚拟化技术实现 — QEMU-KVM》 《虚拟化技术实现 — KVM 的 CPU 虚拟化》 虚拟...

    目录

    前文列表

    虚拟化技术实现 — 虚拟化技术发展编年史
    虚拟化技术实现 — QEMU-KVM
    虚拟化技术实现 — KVM 的 CPU 虚拟化

    内存虚拟化

    虚拟化分为软件虚拟化和硬件虚拟化,而且遵循 intercept 和 virtualize 的规律。

    内存虚拟化也分为基于软件的内存虚拟化和硬件辅助的内存虚拟化,其中,常用的基于软件的内存虚拟化技术为「影子页表」技术,硬件辅助内存虚拟化技术为 Intel 的 EPT(Extend Page Table,扩展页表)技术。

    常规软件内存虚拟化

    虚拟机本质上是 Host 机上的一个进程,按理说应该可以使用 Host 机的虚拟地址空间,但由于在虚拟化模式下,虚拟机处于非 Root 模式,无法直接访问 Root 模式下的 Host 机上的内存。

    这个时候就需要 VMM 的介入,VMM 需要 intercept (截获)虚拟机的内存访问指令,然后 virtualize(模拟)Host 上的内存,相当于 VMM 在虚拟机的虚拟地址空间和 Host 机的虚拟地址空间中间增加了一层,即虚拟机的物理地址空间,也可以看作是 Qemu 的虚拟地址空间(虚拟机是由 Qemu 模拟生成的)。

    所以,内存软件虚拟化的目标就是要将虚拟机的虚拟地址(Guest Virtual Address, GVA)转化为 Host 的物理地址(Host Physical Address, HPA),中间要经过虚拟机的物理地址(Guest Physical Address, GPA)和 Host 虚拟地址(Host Virtual Address)的转化,即:

    GVA -> GPA -> HVA -> HPA
    

    其中前两步由虚拟机的系统页表完成,中间两步由 VMM 定义的映射表(由数据结构 kvm_memory_slot 记录)完成,它可以将连续的虚拟机物理地址映射成非连续的 Host 机虚拟地址,后面两步则由 Host 机的系统页表完成。如下图所示:

    在这里插入图片描述
    这样做得目的有两个:

    1. 提供给虚拟机一个从零开始的连续的物理内存空间。
    2. 在各虚拟机之间有效隔离、调度以及共享内存资源。

    影子页表技术

    接上图,我们可以看到,传统的内存虚拟化方式,虚拟机的每次内存访问都需要 VMM 介入,并由软件进行多次地址转换,其效率是非常低的。因此才有了影子页表技术和 EPT 技术。

    影子页表简化了地址转换的过程,实现了 Guest 虚拟地址空间到 Host 物理地址空间的直接映射。

    要实现这样的映射,必须为 Guest 的系统页表设计一套对应的影子页表,然后将影子页表装入 Host 的 MMU 中,这样当 Guest 访问 Host 内存时,就可以根据 MMU 中的影子页表映射关系,完成 GVA 到 HPA 的直接映射。而维护这套影子页表的工作则由 VMM 来完成。

    由于 Guest 中的每个进程都有自己的虚拟地址空间,这就意味着 VMM 要为 Guest 中的每个进程页表都维护一套对应的影子页表,当 Guest 进程访问内存时,才将该进程的影子页表装入 Host 的 MMU 中,完成地址转换。

    我们也看到,这种方式虽然减少了地址转换的次数,但本质上还是纯软件实现的,效率还是不高,而且 VMM 承担了太多影子页表的维护工作,设计不好。

    为了改善这个问题,就提出了基于硬件的内存虚拟化方式,将这些繁琐的工作都交给硬件来完成,从而大大提高了效率。

    EPT 技术

    这方面 Intel 和 AMD 走在了最前面,Intel 的 EPT 和 AMD 的 NPT 是硬件辅助内存虚拟化的代表,两者在原理上类似,本文重点介绍一下 EPT 技术。

    如下图是 EPT 的基本原理图示,EPT 在原有 CR3 页表地址映射的基础上,引入了 EPT 页表来实现另一层映射,这样,GVA->GPA->HPA 的两次地址转换都由硬件来完成。

    在这里插入图片描述

    这里举一个小例子来说明整个地址转换的过程。假设现在 Guest 中某个进程需要访问内存,CPU 首先会访问 Guest 中的 CR3 页表来完成 GVA 到 GPA 的转换,如果 GPA 不为空,则 CPU 接着通过 EPT 页表来实现 GPA 到 HPA 的转换(实际上,CPU 会首先查看硬件 EPT TLB 或者缓存,如果没有对应的转换,才会进一步查看 EPT 页表),如果 HPA 为空呢,则 CPU 会抛出 EPT Violation 异常由 VMM 来处理。

    如果 GPA 地址为空,即缺页,则 CPU 产生缺页异常,注意,这里,如果是软件实现的方式,则会产生 VM-exit,但是硬件实现方式,并不会发生 VM-exit,而是按照一般的缺页中断处理,这种情况下,也就是交给 Guest 内核的中断处理程序处理。

    在中断处理程序中会产生 EXIT_REASON_EPT_VIOLATION,Guest 退出,VMM 截获到该异常后,分配物理地址并建立 GVA 到 HPA 的映射,并保存到 EPT 中,这样在下次访问的时候就可以完成从 GVA 到 HPA 的转换了。

    参考文章

    https://mp.weixin.qq.com/s/t7Skw0B8bamJrSNcubT6jQ

    展开全文
  • 虚拟机虚拟化原理,CPU硬件虚拟化,内存虚拟化,I/O虚拟化,以及虚拟化的分类。
  • 内存虚拟化 影子页表 Intel EPT技术 总结 内存虚拟化 现代多任务操作系统设计,一般进程之间使用不同的虚拟地址空间相互隔离, 在实现上: 操作系统负责维护进程页表,映射虚拟地址到物理地址的关系; CPU的...

    目录

    内存虚拟化

    影子页表

    Intel EPT技术

    总结


    内存虚拟化

    现代多任务操作系统设计,一般进程之间使用不同的虚拟地址空间相互隔离, 在实现上:

    • 操作系统负责维护进程页表,映射虚拟地址到物理地址的关系;
    • CPU的内存管理单元(MMU)负责执行地址转换;
    • CPU提供TLB(Translation lookaside buffer)缓存最近用到的转换结果,加速转换效率;

    虚拟化技术引入后,内存地址空间更加复杂了,客户机(Guest)和宿主机(Host)都有自己的地址空间:

    • GVA: Guest虚拟地址
    • GPA: Guest物理地址
    • HVA: Host虚拟地址
    • HPA: Host物理地址

    显而易见,Guest负责GVA和GPA之间的转换;Host负责HVA和HPA之间的转换;而GPA和HPA之间的转换,就需要虚拟化层(Hypervisor)辅助了,这个过程一般被称为内存虚拟化。

    影子页表

    早期的X86 CPU硬件辅助虚拟化能力很不完善,所以Hypervisor需要通过软件实现内存虚拟化。因此,Hypervisor为每个客户机每套页表额外再维护一套页表,通常也称为影子页表。

    同时, Hypervisor截获客户机里面任何试图修改客户机页表或者刷新TLB的操作,将GVA到GPA的的修改,转变成GVA到GPA的修改。这些操作包括:

    • 写gCR3(Guest CR3)寄存器和原来一样的内容,一般用作刷新TLB;
    • 写gCR3(Guest CR3)寄存器不同的物理地址,一般是发生了进程切换;
    • 修改部分页表,这时候必须调用INVLPG指令失效对应的TLB;

    这样,Guest中的页表实际变成了虚拟页表,Hypervisor截获了Guest相关的修改操作并更新到影子页表,而真正装入物理MMU是影子页表; Guest中GVA和GPA之间的转换实际上变成了GVA与HPA的转换,TLB中缓存的也是GVA和HPA的映射,Guest内存访问没有额外的地址转换开销。

    当然,影子页表也带来了下面的主要缺点:

    1. Hypervisor 需要为每个客户机的每个进程的页表都要维护一套相应的影子页表,这会带来较大内存上的额外开销;
    2. 客户在读写CR3、执行INVLPG指令或客户页表不完整等情况下均会导致VM exit,这导致了内存虚拟化效率很低;
    3. 客户机页表和和影子页表的同步也比较复杂;

    Intel EPT技术

    为了简化内存虚拟化的实现,以及提升内存虚拟化的性能,Intel推出了EPT(Enhanced Page Table)技术,即在原有的页表基础上新增了EPT页表实现另一次映射。这样,GVA-GPA-HPA两次地址转换都由CPU硬件自动完成。

    AMD类似技术为nPT(AMD NPT Nested Page Table),称呼不同原理相同。

     

     

    通过EPT的GVA和HPA大概翻译的过程:

    1. 处于非根模式的CPU加载guest进程的gCR3;
    2. gCR3是GPA,cpu需要通过查询EPT页表来实现GPA->HPA;
    3. 如果没有,CPU触发EPT Violation, 由Hypervisor截获处理;
    4. 假设客户机有m级页表,宿主机EPT有n级,在TLB均miss的最坏情况下,会产生MxN次内存访问,完成一次客户机的地址翻译;

     

     

    总结

    为了解决GVA-GPA-HPA的转换关系,在没有硬件辅助的时代,Hypervisor通过影子页表,很巧妙的将GVA-GPA映射到GVA-HPA, 功能虽然达成,但是在很多实际场景下,如进程频繁切换,内存频繁分配释放等,性能损耗会非常大;

    EPT在硬件的帮助下,实现内存虚拟化简单直接,传统页表继续负责GVA-GPA, 而EPT负责GPA-HPA; 虽然内存访问延时可能会增加一些,但是大幅减少了因为页表更新带来的vmexit, 综合性价比提升巨大, 所以现代内存虚拟化,基本都被EPT统一了。

     

    转自:

    https://zhuanlan.zhihu.com/p/41467047

     

    参考:

    https://www.cnblogs.com/ck1020/p/6043054.html

    展开全文
  • 大型操作系统(比如Linux)的内存管理的内容是很丰富的,而内存的虚拟化技术在OS内存管理的基础上又叠加了一层复杂性,...本文将仅从“内存地址转换”和“内存回收”两个方面探讨内存虚拟化技术。【虚拟机内存地址...
  • KVM 内存虚拟化

    2018-02-27 14:55:22
    内存虚拟化的概念 除了 CPU 虚拟化,另一个关键是内存虚拟化,通过内存虚拟化共享物理系统内存,动态分配给虚拟机。虚拟机的内存虚拟化很象现在的操作系统支持的虚拟内存方式,应用程序看到邻近的内存地址空间,这...
  • 虚拟化ABC - 内存虚拟化

    千次阅读 2013-05-31 14:37:55
    内存虚拟化的目标: 1)给虚拟机一个从零地址开始的连续物理内存空间。 2)在各虚拟机之间有效隔离、调度以及共享内存资源。   第一代Intel-VT技术没有提供硬件支持的内存虚拟化技术,内存虚拟化采用影子也表;...
  • 《Linux虚拟化KVM-Qemu分析(五)之内存虚拟化》 《在CentOS上进行虚拟化:QEMU、Xen、KVM、LibVirt、oVirt》 《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》 《OpenV
  • 内存虚拟化是一个很大的话题,最近安全部门发现了一个qemu内存虚拟化的安全漏洞,反馈给云平台让解决,感觉很棘手,引起了我对内存虚拟化的思考,想到什么问题就把思考记录下来。x86虚拟内存问题是由学习qemu ...
  • 内存虚拟化技术

    2016-12-12 15:06:00
    在虚拟化的道路上,内存虚拟化与计算虚拟化是同期进行的。 在内存越来越便宜的今天,物理机多配置一些内存,似乎没有必要再“斤斤计较”那么一点内存优化的技术和方法; 但是优化的思路和思想是有必要理解其精髓的...
  • Xen虚拟机的内存虚拟化 从网上找到的关于Xen的内存虚拟化方向的技术讲解,比较详细。
  • 原标题:【科普】CPU和内存虚拟化计算虚拟化计算虚拟化就是在虚拟系统和底层硬件之间抽象出CPU和内存等,以供虚拟机使用。计算虚拟化技术需要模拟出一套操作系统的运行环境,在这个环境你可以安装Windows,也可以...
  • kvm内存虚拟化

    2018-12-24 10:34:37
    内存虚拟化,qemu这块需要理解pc_memory_init(在这里会调用kvm_region_add ---> kvm_set_user_memory_region)和memory_listener_register(这里只是注册)   先注册memory listener,然后如果其他设备添加了...
  • 文章目录内存虚拟化1.经典的内存管理技术2.影子页表法3.页表写入法 内存虚拟化 把物理机的真实物理内存统一管理,包装成多个虚拟的物理内存分别供若干个虚拟机使用,使得每个虚拟机拥有各自独立的内存空间。 物理机...
  • 服务器虚拟化的实现有三个部分的实现,包括CPU虚拟化,内存虚拟化和IO虚拟化。 一、CPU虚拟化: CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间...
  • 1. 内存虚拟化 现代多任务操作系统设计,一般进程之间使用不同的虚拟地址空间相互隔离, 在实现上: 操作系统负责维护进程页表,映射虚拟地址到物理地址的关系 CPU的内存管理单元(MMU)负责执行地址转换 CPU提供TLB...
  • IPAD1 内存虚拟化工具

    2013-01-16 13:12:55
    IPAD1 内存虚拟化工具 ,内包两个软件工具。
  • 内存虚拟化-shadow实现

    2020-01-17 23:54:05
    内存虚拟化 1. 虚拟化目的 提供给虚机从 零地址开始的连续物理内存空间视图 虚机之间隔离及共享内存资源 2. 概念阐述 地址空间和物理内存空间:地址空间可以理解为地址域,比如32bit CPU,能访问的地址空间是2 ^ ...
  • KVM 虚拟化原理探究(4)— 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理。可以说内存是除了CPU外最重要的组件,Guest最终使用的还是宿主机...
  • 概述 KVM(Kernel Virtual Machine) , 作为开源的内核虚拟机,越来越受到 IBM,Redhat,HP,Intel 等各大公司的大力支持,基于 ...为了实现内存虚拟化,让客户机使用一个隔离的、从零开始且具有连续的内存空间,KV...
  • 描述了虚拟化技术的概括,主要介绍内存虚拟化的方法和AMD的硬件支持:NPT

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,524
精华内容 3,009
关键字:

内存虚拟化