內(nèi)存虛擬化原理很難懂干跛,我要是搞清楚了就牛逼大發(fā)了录肯!
首先要找到一個切入點永罚,我覺得KVM_SET_USER_MEMORY_REGION這個ioctl就很好悯森,這個是用來修改Guest的內(nèi)存空間的,以這個為基點巷怜,往上看Qemu的代碼葛超,可以看到整個內(nèi)存的刷新機制,往下可以看看kernel里面的內(nèi)存虛擬化機制延塑。
首先往上看Qemu的代碼:
可以看到ioctl的觸發(fā)函數(shù):kvm_set_user_memory_region最終由結(jié)構(gòu)體MemoryListener的回調(diào)函數(shù)觸發(fā)绣张,這個結(jié)構(gòu)體的實例化是在函數(shù):kvm_memory_listener_register中。
可以看到Qemu就虛擬了兩個地址空間:address_space_memory关带,address_space_io侥涵。
下一步,Qemu是如何通知這個MemoryListener調(diào)用回調(diào)函數(shù)的呢宋雏?
memory.txt說了什么芜飘?
經(jīng)過多天的代碼閱讀,現(xiàn)在對Qemu的Memory機制有了一個大體的框架認(rèn)識磨总,首先是幾個關(guān)鍵的結(jié)構(gòu)體:
AddressSpace燃箭,故名思議就是Qemu用來虛擬地址空間用的比較主要的就是上面提到的兩個地址空間:address_space_memory,address_space_io舍败。MemoryRegion都會映射在這個地址空間上,地址空間上的地址就是GPA(Guest Physic Address)。
MemoryRegion邻薯,是對地址空間上不同功能的內(nèi)存塊的抽象裙戏,有好幾種不同類型的MemoryRegion,具體可以看memory.txt厕诡。
ioctl往下做了什么累榜?