Guest Physical Address, GPA 客户机物理地址
Guest Virtual Address, GVA 客户机虚拟地址
Host Physical Address, HPA 宿主机物理地址
Host Virtual Address, HVA 宿主机虚拟地址
kvm 内存虚拟化结构:(有点类似 vmalloc 原理)客户机里面使用的物理地址(从0开始连续的一段地址),在宿主机里面看来却不是连续的,而是有各个地址空间映射为连续的;
客户机物理地址(pb 表示 物理地址区间)
pb0 | pb1 | pb2 | .... | pbn
vb0 | vb1 | vb2 | .... | vbn
宿主机虚拟机地址(vb 表示 虚拟机地址区间)
上面的映射一定不是 pb0 == vb0 , pb1 == vb1 ..... pbn == vbn;他们之间有些是错开映射的;
kvm 内存虚拟化的重点就是:GVA->HPA,客户机虚拟机地址到宿主机物理地址的转换;
由于在访问内存地址时,要进过MMU的映射,物理地址映射为总线上的地址(可以理解为内存卡上地址);客户机里的物理地址不能直接进行MMU映射使用,所以就必须把客户机的物理地址映射为宿主机的物理地址,然后MMU访问总线内存地址;
KVM 用一个 kvm_memory_slot 数据结构来记录每一个地址区间的映射关系,此数据结构包含了对应此映射区间的起始客户机页帧号 (Guest Frame Number, GFN
Guest Virtual Address, GVA 客户机虚拟地址
Host Physical Address, HPA 宿主机物理地址
Host Virtual Address, HVA 宿主机虚拟地址
kvm 内存虚拟化结构:(有点类似 vmalloc 原理)客户机里面使用的物理地址(从0开始连续的一段地址),在宿主机里面看来却不是连续的,而是有各个地址空间映射为连续的;
客户机物理地址(pb 表示 物理地址区间)
pb0 | pb1 | pb2 | .... | pbn
vb0 | vb1 | vb2 | .... | vbn
宿主机虚拟机地址(vb 表示 虚拟机地址区间)
上面的映射一定不是 pb0 == vb0 , pb1 == vb1 ..... pbn == vbn;他们之间有些是错开映射的;
kvm 内存虚拟化的重点就是:GVA->HPA,客户机虚拟机地址到宿主机物理地址的转换;
由于在访问内存地址时,要进过MMU的映射,物理地址映射为总线上的地址(可以理解为内存卡上地址);客户机里的物理地址不能直接进行MMU映射使用,所以就必须把客户机的物理地址映射为宿主机的物理地址,然后MMU访问总线内存地址;
KVM 用一个 kvm_memory_slot 数据结构来记录每一个地址区间的映射关系,此数据结构包含了对应此映射区间的起始客户机页帧号 (Guest Frame Number, GFN