c - 在 qemu 中打印内存地址范围

标签 c linux memory qemu

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

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

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

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

guest 虚拟地址 = 0x12345678..至 0x87654321..

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

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

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

最佳答案

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

guest 物理和 guest 虚拟之间的映射(大部分)由 guest 操作系统控制。如果您确实想查看物理客户到虚拟客户,那么这将是特定于目标的。一些 qemu 目标甚至没有这样的映射(平面地址空间)。

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

关于c - 在 qemu 中打印内存地址范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26659379/

相关文章:

linux - 如何从linux系统中恢复已删除的文件?

c - 应该将任何 C 文件作为二进制文件打开

java - 寻找类似于 Hyperic SIGAR 的商业或免费库

c - 最大函数 c 树高

c - 返回里面 if 和外面还是 in else?

linux - 如何计算进程中可用的 "Max Contiguous Free Space"?

linux - 将多个 bash 脚本作为单独的作业启动

.net - 如何将非托管结构转换为托管结构并返回?

c - 如何交换命令行中指定文件(文件名和字符)中的字符?

java - 是否可以读取正在运行的 java 应用程序的内存?