gva -> gpa和hva -> hpa转化较为简单,分别去查guest和host页表即可。

gpa -> hva:

由于我所接触的虚拟化方式是采用qemu-kvm的方式。kvm负责cpu和内存的虚拟化,qemu负责io的虚拟化,且gpa->hva都是由qemu维护的,提供给kvm管理借口。具体代码实现见:

kvm_pfn_t __gfn_to_pfn_memslot(struct kvm_memory_slot *slot, gfn_t gfn, bool atomic, bool *async, bool write_fault,bool *writable)
{unsigned long addr = __gfn_to_hva_many(slot, gfn, NULL, write_fault);if (addr == KVM_HVA_ERR_RO_BAD)return KVM_PFN_ERR_RO_FAULT;if (kvm_is_error_hva(addr))return KVM_PFN_NOSLOT;/* Do not map writable pfn in the readonly memslot. */if (writable && memslot_is_readonly(slot)) {*writable = false;writable = NULL;}    return hva_to_pfn(addr, atomic, async, write_fault,writable);
}

里面的第一句话就是完成gpa->hva的转化:__gfn_to_hva_many

static unsigned long __gfn_to_hva_many(struct kvm_memory_slot *slot, gfn_t gfn,gfn_t *nr_pages, bool write)
{if (!slot || slot->flags & KVM_MEMSLOT_INVALID)return KVM_HVA_ERR_BAD;if (memslot_is_readonly(slot) && write)return KVM_HVA_ERR_RO_BAD;if (nr_pages)*nr_pages = slot->npages - (gfn - slot->base_gfn);return __gfn_to_hva_memslot(slot, gfn);
}

三个if是进行条件判断,最核心的就是return语句:__gfn_to_hva_memslot

static inline unsigned long
__gfn_to_hva_memslot(struct kvm_memory_slot *slot, gfn_t gfn)
{return slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE;
}

这里有必要讲一下kvm_memory_slot结构体:

struct kvm_memory_slot {gfn_t base_gfn;    //当前slot的起始地址对应的gpaunsigned long npages;unsigned long *dirty_bitmap;struct kvm_arch_memory_slot arch;unsigned long userspace_addr;     //hva   u32 flags;short id;
};

所以(gfn - slot->base_gfn) * PAGE_SIZE就是gpa在当前slot中的地址偏移,加上其实地址对应的hva,既得当前gpa对应的hva。(当前gpa与起始gpa的差  等于  当前hva与起始hva的差   /*每个slot地址连续*/)

注:关于qemu内存管理的详细解释请参考下面的网址:

http://oenhan.com/qemu-memory-struct

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

虚拟化:gva、gpa、hva、hpa转化相关推荐

  1. VIRTIO 前后端驱动中 GPA,HVA 转换原理

    先说几个英文缩写: GVA - Guest Virtual Address,虚拟机的虚拟地址 GPA - Guest Physical Address,虚拟机的物理地址 HVA - Host Virt ...

  2. [ kvm ] 学习笔记 1:Linux 操作系统及虚拟化

    1. 前言 一台计算机是由一堆硬件设备组合而成,在硬件之上是操作系统,操作系统与计算机硬件密不可分,操作系统用来管理所有的硬件资源提供服务,各个硬件设备是通过 总线 进行连接起来的: 在操作系统之上, ...

  3. 理解(计算、网络,存储)虚拟化,只需一篇文章

    计算虚拟化 1.什么是 虚拟化 什么是虚拟化:虚拟化是一种技术,将物理设备进行逻辑化,转化成文件夹或文件,实现软硬件解耦 好处: 提高资源利用率 软硬件解耦(具备其他高级特性:HA,DRS,DPM) ...

  4. 内存位置访问无效 midas.dll_内存虚拟化介绍

    本文以Intel开源的ACRN项目(Homepage - Project ACRN™)介绍的内存虚拟化技术为基础,介绍一下在虚拟系统中内存管理的一些基本知识.另外不同虚拟化公司提供的技术大多基于开源项 ...

  5. 致敬 hacker |盘点内存虚拟化探索之路

    简介: 内存虚拟化相比裸机,仍然存在较大差异,是当下值得关注的问题! 云与虚拟化 云计算是通过 Internet 服务的方式提供动态可伸缩资源的计算模式,经过多年的发展已成为企业 IT 技术的重要支撑 ...

  6. 【重识云原生】计算第2.4节——主流虚拟化技术之KVM

    <重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...

  7. DPDK系统学习—DPDK的虚拟交换机框架 OvS

    目录: 多队列网卡 多队列网卡硬件实现 内核对多队列网卡的支持 多队列网卡的结构 DPDK 与多队列网卡 虚拟化 CPU 虚拟化 内存虚拟化 I/O 虚拟化 Virtio 为什么是 virtio? 多 ...

  8. 云计算与大数据技术应用 第三章

    虚拟化技术 虚拟化技术简介 虚拟化技术的概念 虚拟化bai是指计算元件在虚du拟的基础上zhi而不是真实的基础上运行.虚dao拟zhuan化技术可以扩大硬shu件的容量,简化软件的重新配置过程.CPU ...

  9. 华为HCIE云计算培训笔记第4天

    CPU虚拟化 首先,在传统计算机当中,如何使用CPU:1.操作系统独占CPU 2.操作系统拥有对CPU的最高权限 (ring0) ring0 操作系统内核使用 特权指令 ring1 2 驱动程序使用 ...

最新文章

  1. 高盛:人工智能生态报告 最全AI产业盘点
  2. 如何看待程序媛们的职场焦虑和未来职业规划?
  3. 双击jar运行main主函数实现-fatJAR
  4. Leetcode剑指 Offer II 024. 反转链表
  5. Python ML环境搭建与学习资料推荐
  6. PXE大批量安装Linux系统
  7. 4.录屏软件录屏端和接收端程序
  8. 横河川仪压力变送器故障代码_YOKOGAWA/重庆横河川仪EJA变送器三大优秀性能!
  9. charles都踩过哪些坑_野路子14年 不如“缠论”1年 收益翻20倍
  10. NeHe OpenGL第三十二课:拾取游戏
  11. Linux c学习--进程基础学习
  12. autoware中pure_pursuit控制和MPC控制解析
  13. 创建多线程(8种方式)
  14. 工资3000,靠“视频剪辑”月入40000:会赚钱的人,从不靠拼命!
  15. android系统垃圾广告,做精致的少数派!教你两分钟关闭Flyme8全部广告
  16. 找一找马里奥-第14届蓝桥杯STEMA测评Scratch真题精选
  17. Microsoft Visio 2010 - 编辑属性值
  18. 控制类(Controller)
  19. 【Accumulation】The definition of SISR
  20. 工艺库astro_使用Astro Pi航空箱为Raspberry Pi做好太空准备

热门文章

  1. [雪峰磁针石博客]python3标准库-中文版2:内置函数
  2. revit二次开发 IdlingExternalEvent 空闲事件与外部事件
  3. 安装两个虚拟机只为验证一个猜测,结果不出所料(Unity | deviceUniqueIdentifier | 设备ID相同)
  4. HTML+JavaScript简单搜索功能实现
  5. 网络攻防技术——XSS实验
  6. 数据结构第四章字符串MOOC整理
  7. STM32------>第三天,spi补充,uart-dma,NB-loT介绍,At指令,串口透传
  8. 安卓调用系统相机拍照并且显示在ImageView上
  9. 【Proteus仿真】按键设置+数码管显示
  10. 【Mysql】1366 - Incorrect string value: ‘\xE9\x92\xB1\xE7\x94\xB5‘