当虚拟机访问内存或虚拟机访问寄存器时,由于并没有分配真实的物理地址,并没有建立stage2映射,因此这两种情况会产生stage2异常处理,其中第一种情况为真实的stage2缺页,第二种情况为MMIO处理。同时如果在stage2产生外部异常,也会产生stage2异常。

对于stage2异常处理,过程如下所示:

  1. 通过stage2异常寄存器包括ESR/FAR获取产生异常的ipa地址和状态等;
  2. 对于SEA处理,调用kvm_handle_guest_sea()处理,并调用kvm_inject_vabt()注入SEA异常;
  3. 通过产生异常的ipa地址获得memslot,并获得对应的hva;
  4. 调用io_mem_abort()处理MMIO;
  5. 调用handle_access_fault()处理访问异常情况;
  6. 对于真实stage2缺页情况,调用user_mem_abort()建立stage2映射;

1 MMIO处理

目前MMIO处理当前存在两种情况:在KVM中进行模拟,在QEMU中进行模拟。下图包含这两处情况。

对于在KVM中对访问的MMIO进行模拟时(如GIC KVM情况),它会通过io_mem_abort()处理。这种情况下会定义dev->ops->write/read(),对于写操作,将数据拷贝到临时buf中,然后通过dev->ops->write()将临时buf写入;对于读操作,通过dev->ops->read()读取数据到临时buf中,并将临时buf拷贝到run->mmio.data中。

对于QEMU中对访问MMIO进行模拟时,不会定义dev->ops->write/read()。这种情况下io_mem_abort()仅将要写的数据拷贝到run->mmio.data中,同时将run->exit_reason设置为KVM_EXIT_MMIO,由QEMU来作MMIO处理。对于写操作,address_space_rw()->address_space_write()->flatview_write()->memory_region_dispatch_write()最终通过MR定义的ops->write()作MMIO处理。对于读操作,address_space_rw()->address_space_read_full()->flatview_read()->memory_region_dispatch_read()最终通过MR定义的ops->read()作MMIO处理。

2 stage2真实缺页处理user_mem_abort()

当虚拟机访问内存时,由于没有真正物理内存,因此会产生stage2缺页异常,由函数user_mem_abort()建立起stage2的IPA到HPA之间的映射。

建立stage2映射过程如下:

  1. 检查hva是否存在vma中,若不存在则返回不处理;
  2. 根据异常返回的信息设置vma_pagesize即建立映射的页大小和prot属性;
  3. PIN住虚拟机地址,同时也获得其物理地址;
  4. 根据异常类型,若为访问权限异常,调用kvm_pgtable_stage2_relax_perms()更新stage2执行权限;否则,调用kvm_pgtable_stage2_map()建立起stage2的IPA到HPA之间的映射;
  5. 对于写情况将页脏,将页标为已访问

上述过程为建立起stage2映射过程,当完成该处理时,由QEMU进行读写访问。此过程由上述MMIO过程中QEMU处理中没有定义dev->ops->write/read()情况。对于RAM MR读过程,address_space_rw()->address_space_read_full()->flatview_read()->memcpy(),直接进行拷贝;对于RAM MR写过程,address_space_rw()->address_space_write()->flatview_write()->memcpy(),直接进行拷贝。

ARM64内存虚拟化分析(7)stage2异常处理相关推荐

  1. Linux虚拟化KVM-Qemu分析(五)之内存虚拟化

    <Linux虚拟化KVM-Qemu分析(一)> <Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化> <Linux虚拟化KVM-Qemu分析(三)之KVM源码 ...

  2. linux 内存查看 kvm,Linux虚拟化KVM-Qemu分析(五)之内存虚拟化

    原标题:Linux虚拟化KVM-Qemu分析(五)之内存虚拟化 背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousa ...

  3. 【KVM系列02】KVM的CPU 和内存虚拟化

    第二章 KVM的CPU 和内存虚拟化 1. 为什么需要 CPU 虚拟化 1.1 基于二进制翻译的全虚拟化(Full Virtualization with Binary Translation) 1. ...

  4. KVM 介绍之CPU和内存虚拟化

    学习 KVM 的系列文章:  (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接 ...

  5. ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)

    名词缩写 ASID:Address Space ID   地址空间标识符 CD:Context Descriptor:  上下文描述符: CTP:Context-table pointer   上下文 ...

  6. KVM之内存虚拟化(KVM MMU Virtualization)

    KVM之内存虚拟化(KVM MMU Virtualization) 作者:lee-action 时间:2016/07/22 09:57 内存虚拟化技术是虚拟化技术中的基石,今天和同事聊到了内存虚拟化的 ...

  7. 《深入浅出DPDK》读书笔记(十一):DPDK虚拟化技术篇(I/O虚拟化、CPU虚拟化、内存虚拟化、VT-d、I/O透传)

    Table of Contents DPDK虚拟化技术篇 X86平台上的I/O虚拟化 120.X86平台上的I/O虚拟化 121.X86平台虚拟化概述 122.CPU虚拟化 123.内存虚拟化 124 ...

  8. 《云计算与虚拟化分析》_2章:虚拟化技术

    <2章:虚拟化技术> 本章内容:讲解了如何将割裂的底层硬件或服务整合成逻辑上可以统一调度分配的资源 # 重写于,写于2021.06.22 # 本文为学习笔记,用的ppt是陈羽中教授版,侵删 ...

  9. qemu-kvm内存虚拟化的原理及其流程

    1.内存虚拟化技术实现原理        内存虚拟化其实就是关于如何做Guest虚机到host宿主机物理内存之间的各种地址转换,KVM经历了三代的内存虚拟化技术,大大加快了内存的访问速率. 先看看虚拟 ...

最新文章

  1. 大道至简,阿里巴巴敏捷教练的电子看板诞生记
  2. jquery 事件冒泡的介绍以及如何阻止事件冒泡
  3. 社区团购就是好啊,为何网上那多人去喷呢?
  4. 测试面试题,自动化测试与性能测试篇(附答案)
  5. include vector 编译出错VC++
  6. linux批量分区,Linux磁盘批量分区格式化和挂载脚本
  7. 大学群管机器人的建设畅想
  8. 详细讲解半加器、全加器、四位全加器,并使用FPGA实现半加器、全加器
  9. Leetcode 781. 森林中的兔子 C++
  10. html 播放amr ios,关于iOS设备以amr格式播放音频文件
  11. 数据防泄密-新时代公司发展的必须
  12. 发布苹果App有哪些步骤流程
  13. 如何切换电脑当前登录账户,独家讲解在这里,怎么在WIN10系统里切换电脑当前登录账户
  14. 【UNIX环境高级编程】
  15. 访问Servlet的几种方式
  16. k6新一代性能测试工具
  17. 贝叶斯概率综述和课堂思路整理.1
  18. 在电脑无法正常开机情况下如何重装系统
  19. 最小元素法求运输问题初始可行解
  20. 如何保持学习的持续性

热门文章

  1. PSPad v4.5.3.2298
  2. 高新技术企业有哪些隐形好处
  3. 2019HDU多校第七场 HDU6646 A + B = C 【模拟】
  4. word里deta怎么打
  5. ubuntu卸载微信
  6. sqlite3打开本地.db文件及增删改查语句
  7. ANSYS学习3——加载求解
  8. 面向程序员的精品开源字体:让代码更易读、更美观、更实用
  9. 堆栈_Terrible Sets_poj8082
  10. AI开发基本流程介绍