影子页表简单来说就是,可以直接把客户端的虚拟地址映射成宿主端的物理地址。

2019年是崭新的一年,Linux kernel 5.0 低调发布了,给我的感觉就是,牛人不断在飞跃,我们也要策马奔腾赶紧追赶才有些许出路。

内核子系统众多,我发现KVM是个非常有意思的子系统,对cpu,内核,IO的虚拟化玩的太溜了,一些技巧真是令人折服,简直就是一个超级魔法师,也可以成为"骗术”,而且还是里因外和。话不多说,进入主题。

VM虚拟化,对虚拟cpu很好理解,cpu采用两种模式,一种是root模式下的0 – 3特权级,另一种是非root模式下的0 - 3特权级别。在root模式下,cpu有真实的寄存器,一切都是真实,但是在非root模式下,cpu要使用的寄存器都放在与cpu绑定的一块物理内存上,绑定的过程有cpu新增的指令支持,当cpu收到中断,或者访问pio、mmio等会陷入到vmm(虚拟机监控机,在宿主端内核态特权级),,陷入以后vmm可以选择自己处理或者交给应用层处理。(此篇文章针对的是x86平台)

但是对于内存的虚拟化就更麻烦了,一般的思路是,客户端虚拟地址经过客户端的页表转化为客户端的物理地址,然后把客户端的物理地址经过转换,变为宿主端的虚拟地址,kvm中有一个数据结构kvm_memory_slot记录了此映射关系,再经过页表的转换变为真实可用的物理地址。然而这样的转换路径也太长,影响了性能,kvm有了硬件的支持以后提出了影子页表的概念。

影子页表简单来说就是,可以直接把客户端的虚拟地址映射成宿主端的物理地址。客户端想把客户端的页表基地址写入cr3寄存器的时候,由于读写cr3寄存器的指令都是特权指令,在读写 cr3的过程中都会陷入到VMM,VMM会首先截获到此指令。在客户端写cr3寄存器的时候,vmm首先保存好写入的值,然后填入的是主机端针对客户端生成的一张页表(也就是影子页表)的基地址,当客户端读cr3值的时候,vmm会把之前保存的cr3的值返回给客户端。

这样做的目的是,在客户端内核态中虽然有一张页表,但是客户端在访问内存的时候,MMU不会走这张页表,MMU走的是以填入到cr3寄存器上的真实的值为基地址(这个值是vmm写的主机端的物理地址)的影子页表,经过影子页表找到真实的物理地址.影子页表时刻与客户端的页表保持同步。

影子页表也有缺陷,KVM需要对客户端的每一个进程维护一张表,后面又有了EPT页表.暂且不谈。

Linux虚拟化:KVM影子页表相关推荐

  1. KVM之EPT与影子页表(七)

    一.简述Linux内存映射 这部分其实是一个很庞大的话题,它包括分段.分页机制等,在不同架构.不同地址转换机制下,地址转换过程是不同的.本文的重点不在于这些复杂的分段分页保护机制.保护模式.实模式等内 ...

  2. Linux虚拟化: 探索 Linux 内核虚拟机 学习 KVM 架构及其优点

    M. Tim Jones, 顾问工程师, Emulex 简介: Linux® 既有良好的灵活性,在虚拟化方面同样出色.但是最近,随着内核虚拟机(KVM:Kernel Virtual Machine)的 ...

  3. Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)kvm_init

    Table of Contents 1. 概述 2. KVM初始化 2.1 kvm_arch_init 2.1.1 init_hyp_mode 2.1.2 init_subsystems 2.2 mi ...

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

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

  5. 腾讯云再登 KVM 开源贡献榜,Linux 虚拟化技术将走向何方?

    KVM (基于内核的虚拟机,全称 Kernel-based Virtual Machine), 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块 kvm.ko 和 ...

  6. Mastering KVM Virtualization:第一章 了解Linux虚拟化

    本章为读者提供了Linux虚拟化中流行技术的深刻见解,以及相较于其他同类技术的优势特点.本书共有14章,囊括了KVM虚拟化中的各个方面,从KVM的内部构造开始,并包括了诸如软件定义网络(SDN),性能 ...

  7. linux串口中断_5年匠心之作,深度探索Linux虚拟化

    01为什么写这本书 大约在2014年底,我参与了一个项目,使用Android模拟器在x86架构的机器上运行各种Android游戏.当时项目遇到的核心问题是游戏运行卡顿严重,印象中普通的小游戏每秒大约只 ...

  8. 虚拟化KVM技术详解

    KVM 介绍(1):简介及安装 http://www.cnblogs.com/sammyliu/p/4543110.html 学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 ...

  9. 5年匠心之作,深度探索Linux虚拟化

    01 为什么写这本书 大约在2014年底,我参与了一个项目,使用Android模拟器在x86架构的机器上运行各种Android游戏.当时项目遇到的核心问题是游戏运行卡顿严重,印象中普通的小游戏每秒大约 ...

最新文章

  1. 使用Keras进行迁移学习
  2. java 加减运算_JAVA日期加减运算 | 学步园
  3. 51 Nod 1670 打怪兽
  4. ensp安装对电脑配置要求高吗_直线导轨有哪些安装方法?为什么直线导轨安装精度要求高?...
  5. django2.0 自己入门记录一些基础url 模板等
  6. 剑指offer面试题53 - II. 0~n-1中缺失的数字(二分查找)
  7. 系统封装 如何为原生PE集成软件
  8. CodeForces 584 D.Dima and Lisa(数论)
  9. 套路得人心之我的运营之路!(文末有福利)
  10. 基于单片机的智能电风扇设计
  11. 深度学习与神经网络的异同
  12. minus用法c语言,Minus-C 一个最小化的C语言规范
  13. windows文件共享客户端的一些事——samba文件共享
  14. Word文档中实现:点击图片双击放大
  15. 5.3 闪电网络的设计
  16. 3d云html原理,云渲染是什么原理?
  17. html里高度的英文,高度是什么意思
  18. 2022年四川省安管人员报名即将结束!C证报名11月9日截止!
  19. 我想成为一名黑客,该如何开始?
  20. mysql的group语句_MySQL中distinct与group by语句的一些比较及用法讲解

热门文章

  1. Java多线程学习四十三:
  2. 字节流和字符流学习笔记:
  3. MySQL高级-MySQL应用优化
  4. Spring框架----Spring的bean的生命周期
  5. .Net Core项目 Encoding不全问题
  6. CentOS 7下彻底卸载MySQL数据库
  7. exif_imagetype() 函数在linux下的php中不存在
  8. Qt 程序访问 sqlite 权限错误
  9. linux 使用 byzanz 生成 gif 图片程序
  10. String str 与 String str=new String() 区别