一 KVM内存管理机制
(在此先只讲qemu如何让KVM获取非root的客户机的内存分布:事实上还没有与物理上形成映射,只是在qemu进程的线性空间中开辟一块区域)
KVM不改变GUEST OS,而操作系统对内存的基本认识包括:
1. 物理地址从0开始;(eg, 0~4G)
2. 存在连续性;(4KB为一页,按页组织)
同一个host中,要满足多个guest os的对内存的需求,就需要内存的虚拟化。 如多台guest OS均分配的是4G内存,而所有VM的OS认为自己虚拟地址就是0~4G ,总页帧数为1024*1024,即客户机认为内存是独占的,而VMM则负责管理所有的物理内存,和VM对实际物理内存的占用。
OS分页机制中,利用页表来完成虚拟地址到物理的转换:
其中CR3记录了基地址,不同的进程基地址不同,因此,虽然不同进程可见的都是同样比如4GB的地址空间,同样的逻辑地址,但使用过程中映射到的是不同的物理地址,这个过程由CR3完成。
TLB位于页表的 cache中,如果CPU访问某个线性地址(byte级别)时,如果其所在页面映射存在于TLB中,则不用再查找页表,直接将PFN+偏移地址即可。
对客户机操作系统不作修改,意味着VM也有一套同样的分布的机制和MMU实现,有GVA和GPA的概念和自己的虚拟(机)页表。而GVA到实际host的HPA过程由影子列表来完成。
TLB是CPU相关的全局量,由当前的进程来更新,当进程来切换时,TLB失效,随着进程的访问来补充相应的buffer。
GUEST OS(VM)对内存相关的操作:
1. 修改GUEST页表;
2. 修改GUEST页表的TLB。
客户机要维护的只有自己的