我是qemu开发的新手。我想在将内存分配给虚拟机时打印相应的地址。
例如,当我调用以下命令时
qemu-system-i386 ubuntu.img -m 1G
我需要能够打印所涉及的虚拟地址和物理地址。像上面涉及的1G内存一样:
Guest Virtual Addr = 0x12345678..to 0x87654321 ..
Guest Physical Addr = 0x23456781..to 0x74536733 ..(如果我的理解是正确的话,这是映射到主机虚拟内存的那个。)
注意: 以上数字仅供参考。
当我查看qemu的源代码时,我看到这个大小,无论我们在命令中提到什么,都被指定为| ram_addr_t |的一部分。块。但我无法找到如何继续找到这个尺寸的偏移量。最早在这方面帮助我。
答案 0 :(得分:0)
基于以上所述,我认为你想要做的不是将访客虚拟地址映射到访客物理地址(按帖子),而是将访客物理地址映射到主机虚拟地址。
客户物理和客户虚拟之间的映射(主要)由客户操作系统控制。如果您真的想要将客户物理视为客户虚拟,那将是针对特定目标的。有些qemu目标甚至没有这样的映射(平面地址空间)。
首先,我会查看memory.c
和memory_mapping.c
的来源。
以下是exec.c
的摘录,它将目标(来宾)虚拟地址转换为目标物理地址,并在那里操纵内存。这就是你需要的吗?
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频道上获得比这里更多的帮助。