gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:26:45 31 4
gpt4 key购买 nike

我是 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com