我是qemu开发的新手。当将内存分配给虚拟机时,我想打印相应的地址。
例如,当我调用以下命令时
qemu-system-i 386 ubuntu.img -m 1G
我需要能够打印虚拟地址和物理地址。就像上面提到的1G内存:
客户虚拟地址= 0x12345678..to 0x87654321
来宾物理Addr = 0x23456781..to 0x74536733.(如果我的理解正确的话,这是映射到主机虚拟内存的那个)。
注:以上数字仅供解释。
当我查看qemu的源代码时,我发现这个大小--不管我们在这里命令中提到的是什么--都是作为|ram_addr_t|块的一部分分配的。但我无法找到,因为如何继续找到这个size.Kindly的抵消,帮助我在这方面的最早。
发布于 2014-10-30 12:06:56
基于以上所述,我认为您要做的不是将来宾虚拟地址映射到来宾物理地址(按帖子),而是将来宾物理地址映射到主机虚拟地址。
客户物理和客户虚拟之间的映射(主要是由客户操作系统控制)。如果您真的在尝试查看来宾物理到客户虚拟,这将是特定的目标。一些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频道上得到比这里更多的帮助。
https://stackoverflow.com/questions/26659379
复制相似问题