文章目錄
- QEMU 內存管理(QEMU 如何管理某個特定 VM 的內存)
- MemoryRegion gpa->hpa
- FlatView:表示MR 樹對應的地址空間
- FlatRange:存儲不同MR對應的地址信息
- AddressSpace:不同類型的 MemoryRegion樹
- RAMBlock
- 總體簡化圖
- QEMU 設備模擬 (QEMU的模擬IO設備如何與VM交互)
- QEMU 設備 IO 處理
QEMU 內存管理(QEMU 如何管理某個特定 VM 的內存)
QEMU:能夠完成gva-gpa=hva-hpa地址的轉換
MemoryRegion gpa->hpa
QEMU通過MemoryRegion管理虛擬機內存,每個MemoryRegion對應虛擬機一部分內存,同時還有相關對應Host的虛擬內存相關信息。不同MemoryRegion通過樹狀組織連接起來,連接到根MemoryRegion下,不同MemoyRegion樹代表不同作用的內存,如系統內存空間(system_memorry)或IO內存空間(system_io)
MemoryRegion可以分為以下三種類型
- 根級MemoryRegion:通過memory_region_init初始化,只是個管理用的(如system_memory),沒有自已對應的部分內存
- 實體MemoryRegion:通過memory_region_init_ram初始化,有對應的內存,大小為size
- 別名 MemoryRegion:通過 memory_region_init_alias 初始化,沒有自己對應的內存,作為一個實體的別名存在,通過alias成員指向對應的實體,alias_offset代表該別名MemoryRegion所代表內存起始GPA相對于實體 MemoryRegion 所代表內存起始GPA的偏移量
FlatView:表示MR 樹對應的地址空間
struct FlatView {struct rcu_head rcu;unsigned ref;FlatRange *ranges;unsigned nr;unsigned nr_allocated;struct AddressSpaceDispatch *dispatch;MemoryRegion *root;
};
FlatRange:存儲不同MR對應的地址信息
struct FlatRange {MemoryRegion *mr;hwaddr offset_in_region;AddrRange addr;uint8_t dirty_log_mask;bool romd_mode;bool readonly;bool nonvolatile;
};
AddressSpace:不同類型的 MemoryRegion樹
兩種,為address_space_memory 與 address_space_io
/*** struct AddressSpace: describes a mapping of addresses to #MemoryRegion objects*/
struct AddressSpace {/* private: */struct rcu_head rcu;char *name;MemoryRegion *root; //是對應樹的根/* Accessed via RCU. */struct FlatView *current_map; //對對應樹的地址空間表示int ioeventfd_nb;struct MemoryRegionIoeventfd *ioeventfds;QTAILQ_HEAD(, MemoryListener) listeners;QTAILQ_ENTRY(AddressSpace) address_spaces_link;
};
RAMBlock
MR 對應的 Host 虛擬內存,每個RAMBlock表示單個實體MemoryRegion所占的Host虛擬內存信息,多個RAMBlock構成RAMList
每個RAMBlock都有一個唯一的MemoryRegion對應
總體簡化圖
大佬勿噴,后續學的更深會完善
QEMU 設備模擬 (QEMU的模擬IO設備如何與VM交互)
QEMU 在用戶空間中獨立進行設備模擬,虛擬設備被其他的 VM 通過 VMM 提供的接口進行調用。并且設備的模擬是獨立于VMM
QEMU 設備 IO 處理
當VM訪問某虛擬設備的物理內存/端口時候,控制權由VM轉交到VMM,此時QEMU會根據觸發VM-exit的事件類型進行不同的處理,即MMIO還是PMIO。
MMIO:對address_space_memory類的地址空間讀寫
PMIO: 對address_space_io類的地址空間進行讀寫