趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

52 | 计算虚拟化之内存:如何建立独立的办公室?

通过KVM_SET_USER_MEMORY_REGION消息添加内存区域
指向虚拟机的物理内存空间
指向mmap分配的虚拟内存
有KVMMemoryListener用于通知内核
包含多个内存区域MemoryRegion,组成树形结构
struct kvm表示虚拟机的多个内存条
KVMState结构表示虚拟机的多个内存条
AddressSpace address_space_memory
页面分配和映射通过try_async_pf和__direct_map实现
EPT技术用于加速内存映射
虚拟机的内存管理需要用户态的qemu和内核态的KVM共同完成
__direct_map函数用于关联客户机物理页号和宿主机物理页号
try_async_pf函数用于得到宿主机的物理地址对应的页号
通过EPT技术实现客户机物理地址到宿主机物理地址的映射
EPT页表结构分为四层,EPT Pointer指向PML4的首地址
内核态的KVM
用户态的qemu
总结
页面分配和映射
EPT技术用于加速内存映射
虚拟化技术的内存管理需要用户态的qemu和内核态的KVM共同完成
虚拟化技术的内存管理

该思维导图由 AI 生成,仅供参考

上一节,我们解析了计算虚拟化之 CPU。可以看到,CPU 的虚拟化是用户态的 qemu 和内核态的 KVM 共同配合完成的。它们二者通过 ioctl 进行通信。对于内存管理来讲,也是需要这两者配合完成的。
咱们在内存管理的时候讲过,操作系统给每个进程分配的内存都是虚拟内存,需要通过页表映射,变成物理内存进行访问。当有了虚拟机之后,情况会变得更加复杂。因为虚拟机对于物理机来讲是一个进程,但是虚拟机里面也有内核,也有虚拟机里面跑的进程。所以有了虚拟机,内存就变成了四类:
虚拟机里面的虚拟内存(Guest OS Virtual Memory,GVA),这是虚拟机里面的进程看到的内存空间;
虚拟机里面的物理内存(Guest OS Physical Memory,GPA),这是虚拟机里面的操作系统看到的内存,它认为这是物理内存;
物理机的虚拟内存(Host Virtual Memory,HVA),这是物理机上的 qemu 进程看到的内存空间;
物理机的物理内存(Host Physical Memory,HPA),这是物理机上的操作系统看到的内存。
咱们内存管理那一章讲的两大内容,一个是内存管理,它变得非常复杂;另一个是内存映射,具体来说就是,从 GVA 到 GPA,到 HVA,再到 HPA,这样几经转手,计算机的性能就会变得很差。当然,虚拟化技术成熟的今天,有了一些优化的手段,具体怎么优化呢?我们这一节就来一一解析。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了qemu和KVM在CPU虚拟化过程中的协作,以及内存管理的复杂性和优化方法。在CPU虚拟化方面,qemu和KVM通过ioctl进行通信,共同完成CPU虚拟化。而在内存管理方面,涉及虚拟机内部的虚拟内存、虚拟机内部的物理内存、物理机上的虚拟内存和物理机上的物理内存,这种复杂性对内存管理和内存映射提出了挑战,可能导致性能下降。然而,随着虚拟化技术的成熟,出现了一些优化手段来解决这些问题。 在CPU虚拟化初始化过程中的内存相关操作中,包括地址空间的初始化、内存区域的注册和内存结构的转换。此外,文章还解析了内存的虚拟化过程,包括内存的申请、初始化和映射等操作。为了解决内存映射的性能问题,介绍了影子页表的软件方式,通过维护一套相应的影子页表实现了从客户机虚拟地址到宿主机物理地址的直接转换,提高了缓存的效率。然而,引入影子页表也带来了内存占用较大和实时同步的问题。 通过本文的阐述,读者可以更好地理解虚拟化技术的特点和优化方法,以及影子页表在内存管理中的应用,为读者提供了深入了解虚拟化技术的重要参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • ClassCastException
    别管看不看的懂,能坚持到这的也是神级人物了

    作者回复: 加油

    2019-07-30
    3
    22
  • 没心没肺
    快要被劝退了,硬着头皮看。

    作者回复: 加油,多看几遍就好了

    2019-07-28
    8
  • 小龙的城堡
    把c语言写出面相对象,确实有意思!

    作者回复: 是的,很惊艳

    2019-07-26
    2
    4
  • LDxy
    真难

    作者回复: 其实还好,多看几遍

    2019-07-27
    2
  • 起飞的鸭子
    这配图是网易吗

    作者回复: 不是的

    2019-07-26
    2
  • 浪子
    超哥会讲overcommit吗

    作者回复: 没有分析内存overcommit的部分。

    2019-07-27
    1
  • Spring
    总结下来就是:虚拟机用户态qemu中的KVMSlot结构维护虚拟机进程的虚拟地址,虚拟机内核态kvm_memory_slot结构维护虚拟机的物理页面,二者通过普通页表建立映射关系。当访问虚拟机虚拟页面发生缺页异常时,切换到宿主机中分配真正的物理页面,然后通过EPT(扩展页表)建立虚拟机物理地址到宿主机物理地址的映射关系。
    2019-10-04
    14
  • zKerry
    感觉怼到了一堵墙上,请问刘老师,你当初是怎么整明白的?
    2019-10-31
    6
  • Ascend
    我感觉这章没有先讲qemu的宏观架构,直接引入qemu细节代码,有点吃力
    2020-10-26
    4
  • why
    是不是 qemu 维护的 slot 相当于 gpa,KVM 维护的 slot 相当于 hva。
    2020-02-26
    1
    2
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部