我是qemu开发新手。 我想要打印内存分配给虚拟机时涉及到的相应地址。
例如,当我调用下面的命令
qemu-system-i386 ubuntu.img -m 1G
我需要能够打印涉及的虚拟地址和物理地址。 像上面涉及的1G内存一样:
访客虚拟地址= 0x12345678..to 0x87654321 ..
访客物理地址= 0x23456781 ..到0x74536733 ..(这是一个被映射到主机虚拟内存,如果我的理解是正确的)。
注:以上数字仅供解释。
当我查看qemu的源代码时,我看到这个大小,无论我们在这里命令中提到的是作为| ram_addr_t | 块。 但我无法find如何find这个大小的抵消。最早在这方面,请帮助我。
基于上面,我想你要做的就是不把guest虚拟机的虚拟地址映射到guest虚拟机的物理地址(每个post),而是guest虚拟机的物理地址来虚拟主机地址。
来宾物理和来宾虚拟之间的映射(大部分)由来宾操作系统控制。 如果你真的正在试图看客人物理虚拟,这将是具体的目标。 一些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频道上得到更多的帮助。