在qemu中打印内存地址范围

时间:2014-10-30 17:18:55

标签: c linux memory qemu

我是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 |的一部分。块。但我无法找到如何继续找到这个尺寸的偏移量。最早在这方面帮助我。

1 个答案:

答案 0 :(得分:0)

基于以上所述,我认为你想要做的不是将访客虚拟地址映射到访客物理地址(按帖子),而是将访客物理地址映射到主机虚拟地址。

客户物理和客户虚拟之间的映射(主要)由客户操作系统控制。如果您真的想要将客户物理视为客户虚拟,那将是针对特定目标的。有些qemu目标甚至没有这样的映射(平面地址空间)。

首先,我会查看memory.cmemory_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频道上获得比这里更多的帮助。