Kernel Exploring
  • 前言
  • 支持
  • 老司机带你探索内核编译系统
    • 编译出你的第一个内核
    • 内核编译中的小目标
    • 可能是kbuild中最直接的小目标 – help
    • 使用了一个kbuild函数的目标 – cscope
    • 内核中单个.o文件的编译过程
    • 根目录vmlinux的编译过程
    • 启动镜像bzImage的前世今生
    • setup.bin的诞生记
    • 真假vmlinux–由vmlinux.bin揭开的秘密
    • bzImage的全貌
    • kbuild系统浅析
  • 启动时的小秘密
    • INIT_CALLS的秘密
    • 内核参数
  • 内核加载全流程
    • bootloader如何加载bzImage
    • 内核压缩与解压
    • 内核加载的几个阶段
    • 保护模式内核代码赏析
  • 内存管理
    • 内核页表成长记
      • 未解压时的内核页表
      • 内核早期的页表
      • cleanup_highmap之后的页表
      • 映射完整物理地址
      • 启用init_level4_pgt
    • 自底而上话内存
      • e820从硬件获取内存分布
      • 原始内存分配器--memblock
      • 页分配器
        • 寻找页结构体的位置
        • 眼花的页结构体
        • Node-Zone-Page
        • 传说的伙伴系统
        • Compound Page
        • GFP的功效
        • 页分配器的用户们
      • slub分配器
        • slub的理念
        • 图解slub
      • 内存管理的不同粒度
      • 挑战和进化
        • 扩展性的设计和实现
        • 减少竞争 per_cpu_pageset
        • 海量内存
        • 延迟初始化
        • 内存热插拔
        • 连续内存分配器
    • 虚拟内存空间
      • 页表和缺页中断
      • 虚拟地址空间的管家--vma
      • 匿名反向映射的前世今生
      • 图解匿名反向映射
      • THP和mapcount之间的恩恩怨怨
      • 透明大页的玄机
      • NUMA策略
      • numa balance
      • 老版vma
    • 内存的回收再利用
      • 水线
      • Big Picture
      • 手动触发回收
      • Page Fram Reclaim Algorithm
      • swapfile原理使用和演进
    • 内存隔离
      • memcg初始化
      • 限制memcg大小
      • 对memcg记账
    • 通用
      • 常用全局变量
      • 常用转换
    • 测试
      • 功能测试
      • 性能测试
  • 中断和异常
    • 从IDT开始
    • 中断?异常?有什么区别
    • 系统调用的实现
    • 异常向量表的设置
    • 中断向量和中断函数
    • APIC
    • 时钟中断
    • 软中断
    • 中断、软中断、抢占和多处理器
  • 设备模型
    • 总线
    • 驱动
    • 设备
    • 绑定
  • nvdimm初探
    • 使用手册
    • 上帝视角
    • nvdimm_bus
    • nvdimm
    • nd_region
    • nd_namespace_X
    • nd_dax
      • dev_dax
  • KVM
    • 内存虚拟化
      • Qemu内存模型
      • KVM内存管理
  • cgroup
    • 使用cgroup控制进程cpu和内存
    • cgroup文件系统
    • cgroup层次结构
    • cgroup和进程的关联
    • cgroup数据统计
  • 同步机制
    • 内存屏障
    • RCU
  • Trace/Profie/Debug
    • ftrace的使用
    • 探秘ftrace
    • 内核热补丁的黑科技
    • eBPF初探
    • TraceEvent
    • Drgn
  • 内核中的数据结构
    • 双链表
    • 优先级队列
    • 哈希表
    • xarray
    • B树
    • Maple Tree
    • Interval Tree
  • Tools
  • Good To Read
    • 内核自带文档
    • 内存相关
    • 下载社区邮件
Powered by GitBook
On this page
  • 从Qemu获得的信息
  • 逆向盗梦空间
  • EPT树

Was this helpful?

  1. KVM
  2. 内存虚拟化

KVM内存管理

书接上回,看过了Qemu中的内存模型,这下该来看看KVM中的工作了。

从Qemu获得的信息

上文中我们停在了Qemu和KVM之间的握手上,那我们就先来看看这次交流之后KVM那头发生了什么。

说简单也简单,那就是把Qemu传递过来的信息记录了起来,保存在了一个叫kvm_memory_slot的结构体中。

struct kvm_memory_slot {
	gfn_t base_gfn;
	unsigned long npages;
	unsigned long *dirty_bitmap;
	struct kvm_arch_memory_slot arch;
	unsigned long userspace_addr;
	u32 flags;
	short id;
};

起始也就是记录下来了虚拟机中对应GPA的HVA。那记录下来是要干啥呢?

对了,构造EPT表。

逆向盗梦空间

先来看一张图

这张图描述了EPT的作用,GPA->HPA的转换。

当虚拟机中的系统访问虚拟机内的物理地址GPA时,系统就可以通过EPT找到真实的内存地址HPA。

是不是有点像盗梦空间中从梦中回到现实的感觉?

EPT树

刚才看了EPT的原理图,接着我们看看在代码中是如何表示的。

在代码中,用kvm_mmu_page结构体来表示EPT结构中的一个节点。如果大家有过页表的概念,那么可以 将EPT想象为一个树形结构,而其中的每个节点就是用kvm_mmu_page结构来描述。

截取这棵树上的一个分叉,就像下图一样。

                                                          kvm_mmu_page     <---------+
                                                          +--------------------------|---+
                                              +-----------|parent_ptes               |   |
                                              |           |                          |   |
                                              |           |                          |   |
                                              |           |spt--+   one page         |   |
                                              v           |     |   page->private ---+   |
                                              +-----------|-->  +-->+--------------------+
                                              |           |         |                    |
                                              |           |         |                    |
                                              |           |         |                    |
    kvm_mmu_page     <---------+              |           |   512   |                    |
    +--------------------------|---+          |           | entries |                    |
    |                          |   |          |           |         |                    |
    |                          |   |          |           |         |                    |
    |                          |   |          |           |         |                    |
    |spt--+   one page         |   |          |           +---------+--------------------+
    |     |   page->private ---+   |          |
    |     +-->+--------------------+          |
    |         |                    |          |
    |         |                 ---|----------+
    |         |                    |
    |   512   |                    |
    | entries |                    |
    |         |                    |
    |         |                    |
    |         |                 ---|----------+
    +---------+--------------------+          |
                                              |
                                              |
                                              |
                                              |           kvm_mmu_page     <---------+
                                              |           +--------------------------|---+
                                              |<----------|parent_ptes               |   |
                                              |           |                          |   |
                                              |           |                          |   |
                                              |           |spt--+   one page         |   |
                                              |           |     |   page->private ---+   |
                                              +-----------|-->  +-->+--------------------+
                                                          |         |                    |
                                                          |         |                    |
                                                          |         |                    |
                                                          |   512   |                    |
                                                          | entries |                    |
                                                          |         |                    |
                                                          |         |                    |
                                                          |         |                    |
                                                          +---------+--------------------+

好了,简单的看内存虚拟化在KVM中就是这样的。

而真正复杂的内容隐藏于细节之中,待我悟到之后再来详述。

PreviousQemu内存模型Nextcgroup

Last updated 3 years ago

Was this helpful?

ept