内存虚拟化原理很难懂,我要是搞清楚了就牛逼大发了!
首先要找到一个切入点,我觉得KVM_SET_USER_MEMORY_REGION这个ioctl就很好,这个是用来修改Guest的内存空间的,以这个为基点,往上看Qemu的代码,可以看到整个内存的刷新机制,往下可以看看kernel里面的内存虚拟化机制。
首先往上看Qemu的代码:
可以看到ioctl的触发函数:kvm_set_user_memory_region最终由结构体MemoryListener的回调函数触发,这个结构体的实例化是在函数:kvm_memory_listener_register中。
可以看到Qemu就虚拟了两个地址空间:address_space_memory,address_space_io。
下一步,Qemu是如何通知这个MemoryListener调用回调函数的呢?
memory.txt说了什么?
经过多天的代码阅读,现在对Qemu的Memory机制有了一个大体的框架认识,首先是几个关键的结构体:
AddressSpace,故名思议就是Qemu用来虚拟地址空间用的比较主要的就是上面提到的两个地址空间:address_space_memory,address_space_io。MemoryRegion都会映射在这个地址空间上,地址空间上的地址就是GPA(Guest Physic Address)。
MemoryRegion,是对地址空间上不同功能的内存块的抽象,有好几种不同类型的MemoryRegion,具体可以看memory.txt。
ioctl往下做了什么?