• x86的内存虚拟化支持
x86 的 内存虚拟化支持1. 第一代GVA->GPA  利用 MMU  访问 guest OS 中的 页表(GPT)GPA->HVA  利用 host os 中的 软件代码 访问 host OS 中的 kvm_memory_slotHVA->HPA  利用 MMU  访问 hostOS中虚拟机进程的 页表(HPT) 2. 第二代 : 影子页表(SPT)GVA->HPA  利用 host OS 中的软件代码 访问 host OS 中的影子页表(SPT)3. 第三代GVA->GPA  利用 MMU  访问 guest OS 中的 页表(GPT)GPA->HPA  利用 MMU  访问 hostOS中的专门为虚拟机做的 页表(EPT)
ARMv7 的 内存虚拟化支持1. 第一代GVA->GPA  利用 MMU  访问 guest OS 中的 页表AGPA->HPA  利用 Second-stage of translation 机制  访问 hostOS中的专门为虚拟机做的 页表B// 页表格式 和 GVA->GPA 页表不同// GPA 在 ARM 中被称为 IPA// 建立的过程 是 在 user_mem_fault 中// 建立 是 解析了 memslot 找到了 IPA 与 HVA的关系 , 并通过 host 中的页表C 找到了 HVA 与 HPA 的关系 , 从而建立了 IPA 与 HPA 的关系(页表B)

ARM内存地址转换

为什么需要内存地址转换实体机是这样子跑的host_VA          -> host_PA虚拟机是这样跑guest_VA            -> guest_PA //guest_PA 在 arm 手册中被称为 IPA ,在 kvm 代码中也被称为fault_ipa //  guest_PA 与 host_VA  一一对应guest_PA             -> host_PAARM提供了对虚拟物理内存的硬件支持。通过 二级地址转换(遍历二级页表) 提供的 // 二级转换可以在HYP模式中被禁止或使能。二级地址机制 的原理 (以虚拟机运行时为例)虚拟机管理的物理地址实际是中间物理地址(IPA),也被称作客户物理地址。// 客户物理地址 需要被转换成实际物理地址,即主机物理地址。ARM提供了 二级页表,根据客户物理地址将IPA转换成PA二级页表机制的限制与特点二级页表使用ARM的新的LPAE页表格式,与内核模式使用的页表格式略有不同二级地址转换只能在HYP模式下进行配置,它的使用对虚拟机时透明的。二级地址机制 的应用当实体机运行时二级地址转换  是关闭的 // vm exit 时 关闭当虚拟机运行时二级地址转换 是开启的 // vm entry 时 开启二级页表的地址被写入 基寄存器(VTTBR) // vm entry 时 写入highvisor管理二级转换页表,只允许访问专门为一个虚拟机配置的内存;其他的访问操作将导致二级页错误,该错误将被hypervisor捕获。这种机制确保一个虚拟机不能访问属于hypervisor或其他虚拟机的内存和任何敏感数据。

内存异常

TODO
缺页异常
MMU异常
内存不够怎么向host索取
虚拟机是一个进程,那么虚拟机内存的物理内存也是 malloc 申请出来的, 用到了 才会分配给虚拟机

内存分配

KVM/ARM 利用现有的内核内存分配、页引用计数和页表操作的代码。KVM/ARM通过判定IPA的错误来处理二级页错误,如果出错的地址属于虚拟机内存映射中的正常内存,KVM/ARM只需调用现有的内核函数,如get_user_pages来为虚拟机分配一页,同时将该分配的页映射到虚拟机的二级页表中。

ARMv7 手册

DDI0406C_D_armv7_AR_architecture_reference_manual.pdf 中 P1346
Stage 1 translationsNon-secure PL1&0 stage 1 translation // host linux 用户态和 内核态(不包括hyp mode) 下的内存访问// guest linux 用户态 和 内核态的内存访问(不包括hyp mode) // 现在不考虑嵌套虚拟化The stage 1 translation for memory accesses from Non-secure modes other than Hypmode. In an implementation that includes the Virtualization Extensions, this translatesa VA to an IPA, otherwise it translates a VA to a PA. For this translation:• Non-secure TTBR0 or TTBR1 holds the translation table base address.• Non-secure TTBCR determines which TTBR is used.• The input address range is up to 32 bits, as determined by either:— TTBCR.T0SZ or TTBCR.T1SZ, for a PL1&0 stage 1 translation.— HTCR.T0SZ, for a PL2 stage 1 translation.• The output address range is 40 bits.Non-secure PL2 stage 1 translation// host linux hyp mode 下的内存访问The stage 1 translation for memory accesses from Hyp mode. Supported only if theimplementation includes the Virtualization Extensions, and translates a VA to a PA. Forthis translation, HTTBR holds the translation table base address.• The input address range is up to 32 bits, as determined by either:— TTBCR.T0SZ or TTBCR.T1SZ, for a PL1&0 stage 1 translation.— HTCR.T0SZ, for a PL2 stage 1 translation.• The output address range is 40 bits.Stage 2 translationNon-secure PL1&0 stage 2 translation // guest linux 用户态 和 内核态的内存访问The stage 2 translation for memory accesses from Non-secure modes other than Hypmode. Supported only if the implementation includes the Virtualization Extensions, andtranslates an IPA to a PA. For this translation:• The input address range is 40 bits, as determined by VTCR.T0SZ.• The output address range depends on the implemented memory system, and is upto 40 bits.• VTTBR holds the translation table base address.• VTCR specifies the required input address range, and whether the first lookup isat the first level or at the second level.
综上host 下的内存访问 有两个页表基址TTBR0或TTBR1 用于 内核态与用户态下的内存访问第一步,共一步 , 里面有 HVA -> HPA 的 映射关系HTTBR         用于 hyp mode 下的 内存访问guest 下的内存访问 有 2个 页表基址TTBR0或TTBR1 用于 内核态与用户态下的内存访问第一步,共两步 , 里面有 GVA -> GPA 的 映射关系VTTBR        用于 内核态与用户态下的内存访问第二步,共两步 , 里面有 GPA -> HPA 的 映射关系---host linux 本身要维护TTBR0或TTBR1 及 内核 及各个进程的页目录表(页表)如果添上虚拟机,则需要添加1. host 设置 虚拟机进程的 TTBR0或TTBR1 及   其中的 页目录表基址 和 相应的页表   // 对应B2. host 设置 HTTBR 及  HTTBR  中的页目录表基址 和 相应的页表                   // 对应A3. host 设置 虚拟机进程所需要的 VTTBR  及   其中的 页目录表基址 和 相应的页表    // 对应D4. guest 设置 自身用到 的 TTBR0或TTBR1 及   其中的 页目录表基址 和 相应的页表    // 对应C
  • 内存访存流程伪代码
if (in host hyp mode){search table base addr in HTTBR      & Start MMU memory access process // A
}else if (in host other mode){search table base addr in TTBR0/TTBR1 & Start MMU memory access process   // B
}else if (in guest hyp mode){... // TODO
}else if (in guest other mode){search table base addr in TTBR0/TTBR1 & Start MMU memory access process // Csearch table base addr in VTTBR        & Start MMU memory access process // D
}

ARMv7 KVM 在 linux中的实现 3 内存角度相关推荐

  1. linux的swap与memory,【Linux】Linux中Swap与Memory内存简单介绍

    背景介绍 对于Linux来说,其在服务器市场的使用已经占据了绝对的霸主地位,不可动摇.Linux的各种设计思想和使用也被传承(当然不乏各种黑Linux,而且黑的漂亮).Linux的很多独特的设计,对性 ...

  2. linux内存使用统计,Linux 中free命令检查内存使用情况

    我们都知道, IT 基础设施方面的大多数服务器(包括世界顶级的超级计算机)都运行在 Linux 平台上,因为和其他操作系统相比, Linux 更加灵活.有的操作系统对于一些微乎其微的改动和补丁更新都需 ...

  3. linux系统限制内存使用率,linux中限制CPU和内存占用率方法

    在linux中CPU与内存占用率限制的方法有几种我这里整理常用的两种,希望文章对各位同学会有所帮助哦. 查看cpu占用 在命令行中输入 "top" 即可启动 top top 的全屏 ...

  4. linux 动态内存分配,具体来说,fork()如何处理Linux中malloc()动态分配的内存?

    我有一个父级和子女过程的程序.在fork()之前,父进程调用malloc()并用一些数据填充数组.在fork()之后,子元素需要这些数据.我知道我可以使用管道,但下面的代码看起来可以工作: #incl ...

  5. linux中查看cpu和内存的命令,Linux系统如何查看cpu和内存信息

    Linux系统,其实并不是很多人都在使用,所以很多人第一次接触这个系统,很多操作都不会,下面就让学习啦小编教大家Linux系统如何查看cpu和内存信息吧. Linux系统查看cpu和内存信息的方法 右 ...

  6. linux中dd命令增加内存使用率,Linux 下使用 dd 命令进行硬盘 I/O 性能检测

    如何使用dd命令测试我的硬盘性能?如何在linux操作系统下检测硬盘的读写速度? 你可以使用以下命令在一个Linux或类Unix操作系统上进行简单的I/O性能测试. dd命令 :它被用来在Linux和 ...

  7. Linux中的buff/cache内存

    我们用free.top等相关能够查询到当前内存的使用情况的命令时,总会有一个buff/cache让我们很困惑. buffer 即写如磁盘时,先保存到磁盘缓冲区(buffer),然后再写入到磁盘. ca ...

  8. 手机linux脚本处理器,linux中监控CPU、内存和磁盘状态的shell脚本。(centos7)详解...

    这篇博客中所写的脚本,在实际工作中并没有什么卵用,工作中并不会用到这种脚本去监控.不过自己写一遍,可以让初学者对CPU.内存.磁盘等一些基础知识和基础命令更加了解. 1.利用vmstat工具监控CPU ...

  9. linux 用户使用率的限制,linux中限制CPU和内存占用率方法

    查看cpu占用 在命令行中输入 "top" 即可启动 top top 的全屏对话模式可分为3部分:系统信息栏.命令输入栏.进程列表栏. 使用top查看系统负荷 top命令可以动态监 ...

最新文章

  1. Linux命令(2):free
  2. cobaltstrike安装_Cobalt Strike发送钓鱼邮件
  3. 为什么let在php中报错,PHPlet在Windows下的安装
  4. hibernate关系映射(一对一)
  5. css字体自定义,bootstrap自定义字体
  6. c++ opencv实现区域填充_Python+OpenCV基础教程2:平滑图像
  7. linux 线程 waitforsingleobject,用Sleep或WaitForSingleObject实现线程的休眠 | 求索阁
  8. VK Cup 2016 - Round 1 (Div. 2 Edition) A. Bear and Reverse Radewoosh 水题
  9. WebSocket 对象简介
  10. gdb 调试打印完整字符串
  11. 生成26个大小写字母和0-9的六位随机验证码(python3.X)
  12. eclipse安装插件速度很慢的解决方案
  13. js三种消息框总结-警告框、确认框、提示框
  14. fi sap 凭证冲销 稅_SAP FI 系列 (019) - 会计凭证的冲销和反记账
  15. 阿里云oos对象存储 上手快速入门
  16. ggsurvplot_combine R语言 一张图内画多条生存曲线
  17. 64位操作系统支持的最大内存
  18. Origin作向下柱状图
  19. Android NFC开发详解 总结和NFC读卡实例解析
  20. 北京BGP机房的发展历程

热门文章

  1. 夜宿祝国寺(文:元哲)
  2. 3D Point Cloud Descriptors in Hand-crafted and Deep Learning Age: State-of-the-Art
  3. Horizon client PcoIP连接桌面后黑屏断开,报:与远程计算机的连接终止
  4. 添加虚拟机镜像centso 8的步骤
  5. 微信小程序web-view 外部引用h5页面调用摄像头录制视频 配有提示音
  6. 【POJ P3311】【状压DP】Hie with the Pie
  7. 还在为 520 发愁吗?教你用 Python 写个表白神器
  8. Android .9图
  9. #ifndef #define #endif的作用
  10. 《孩子,你慢慢来》的读书笔记与读后感2600字