【问题标题】:Print range of memory addresses in qemu在 qemu 中打印内存地址范围
【发布时间】:2014-10-30 17:18:55
【问题描述】:

我是 qemu 开发的新手。当内存分配给虚拟机时,我想打印所涉及的相应地址。

例如,当我调用以下命令时

qemu-system-i386 ubuntu.img -m 1G

我需要能够打印所涉及的虚拟地址和物理地址。如上面涉及的1G内存:

访客虚拟地址 = 0x12345678..to 0x87654321..

Guest Physical Addr = 0x23456781..to 0x74536733..(如果我的理解正确,这是映射到主机虚拟内存的地址)。

注意: 以上数字仅供说明。

当我查看 qemu 的源代码时,我看到我们在命令中提到的这个大小被分配为 |ram_addr_t| 的一部分。堵塞。但我无法找到如何继续找到此尺寸的偏移量。请尽早在这方面帮助我。

【问题讨论】:

  • 我认为您对 QEMU 的工作方式有误解。每个 QEMU VM 都作为主机系统上的一个进程存在,就像任何其他进程(如 shell 或桌面窗口管理器)一样。因此,它的虚拟地址范围是 0 到 2^N-1(其中 N 是 32 或 64)。将其映射到物理内存与任何其他进程的工作方式相同,并且不太可能是静态的或连续的。另外,这不是编程问题...
  • 我知道host把qemu vm当作一个进程。这个问题与主机系统无关。我想加密 qemu 分配给 vm 的某些内存部分的内容。 qemu 分配的内存来自它维护的池(当然它被映射到主机上的虚拟内存),但与主机内存管理系统无关。我想知道 qemu 分配给 vm 并由 qemu 维护的地址范围,而不是主机。所以,你需要修改它的 qemu 源代码。如果你有任何想法,请告诉我。

标签: c linux memory qemu


【解决方案1】:

基于上述,我认为您想要做的不是将客户虚拟地址映射到客户物理地址(根据帖子),而是将客户物理地址映射到主机虚拟地址。

来宾物理和来宾虚拟之间的映射(大部分)由来宾操作系统控制。如果您真的想查看客户物理到客户虚拟,那将是特定于目标的。一些 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 频道上得到比这里更多的帮助。

【讨论】:

  • 是的。我需要从来宾物理映射到主机虚拟。我需要研究什么功能?即我需要保留分配给目标或访客图像的总页面中的某些页面,然后在某些条件下释放它们。请帮助。
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多