基於上面,我想想你想要做的是不是將來賓虛擬地址映射到來賓物理地址(每個帖子),而是來賓物理地址到主機虛擬地址。
來賓物理和來賓虛擬之間的映射(大部分)由來賓操作系統控制。如果你真的想試圖從客體虛擬客體,那將是特定目標。一些qemu目標甚至沒有這樣的映射(平坦的地址空間)。
我會先看memory.c
和memory_mapping.c
的來源。
下面是從exec.c
的摘錄,它將目標(guest)虛擬地址轉換爲目標物理地址,並在那裏操作內存。那是你需要的嗎?
int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
uint8_t *buf, int len, int is_write)
{
int l;
hwaddr phys_addr;
target_ulong page;
while (len > 0) {
page = addr & TARGET_PAGE_MASK;
phys_addr = cpu_get_phys_page_debug(cpu, page);
/* if no physical page mapped, return an error */
if (phys_addr == -1)
return -1;
l = (page + TARGET_PAGE_SIZE) - addr;
if (l > len)
l = len;
phys_addr += (addr & ~TARGET_PAGE_MASK);
if (is_write) {
cpu_physical_memory_write_rom(cpu->as, phys_addr, buf, l);
} else {
address_space_rw(cpu->as, phys_addr, buf, l, 0);
}
len -= l;
buf += l;
addr += l;
}
return 0;
最後,我想你可能會在qemu IRC頻道上獲得比這裏更多的幫助。
我想你對QEMU的工作原理有誤解。每個QEMU虛擬機都像主機系統上的進程一樣存在,就像任何其他進程(如shell或桌面窗口管理器)一樣。因此,它的虛擬地址範圍是0到2^N-1(其中N是32或64)。將其映射到物理內存與任何其他進程的作用相同,並且不可能是靜態或連續的。此外,這不是一個編程問題... – twalberg 2014-10-30 18:12:46
我知道主機將qemu虛擬機視爲一個進程。問題不在於託管系統。我想加密qemu分配給虛擬機的某些內存部分的內容。 qemu分配的內存來自其維護的池(當然,它被映射到主機上的虛擬內存),但與主機內存管理系統無關。我想知道qemu分配給虛擬機的這個地址範圍,由qemu維護,而不是主機。所以,你需要修改它的qemu源代碼。如果你有任何想法,請讓我知道。 – SRKV 2014-10-30 18:36:48