Печать диапазона адресов памяти в qemu

Я новичок в развитии qemu. Я хотел напечатать соответствующие адреса, когда память была назначена виртуальной машине.

Например, когда я вызываю следующую команду

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

Мне нужно иметь возможность печатать виртуальные адреса и физические адреса. Как и вышеприведенная память 1G:

Гость Виртуальный Addr = 0x12345678..to 0x87654321 ..

Guest Physical Addr = 0x23456781..to 0x74536733 .. (Это тот, который отображается для размещения виртуальной памяти, если мое понимание правильное).

Примечание. Выше номера просто для объяснения.

Когда я посмотрел исходный код qemu, я вижу, что этот размер, о котором мы упоминаем в команде здесь, назначается как часть | ram_addr_t | блок. Но я не могу найти, как приступить к тому, чтобы найти смещение для этого размера. Вначале помогите мне в этом отношении.

Исходя из вышесказанного, я думаю, что вы хотите сделать, это не виртуальный адрес карты для гостевого физического адреса (за сообщение), а гостевой физический адрес для размещения виртуального адреса.

Отображение между гостевым физическим и гостевым виртуальным (в основном) контролируется гостевой ОС. Если вы действительно пытаетесь взглянуть на гостевой физический на гостевой виртуальный, это будет целевым. Некоторые объекты 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; 

Наконец, я думаю, что вы можете получить дополнительную помощь по каналу IRC qemu, чем здесь.