Plage d’impression d’adresses mémoire dans qemu

Je suis nouveau dans le développement de qemu. Je voulais imprimer les adresses correspondantes impliquées lorsqu’une mémoire a été affectée à une machine virtuelle.

Par exemple, quand j’appelle la commande suivante

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

Je dois pouvoir imprimer les adresses virtuelles et les adresses physiques impliquées. Comme ci-dessus 1G mémoire impliquée:

Guest Virtual Addr = 0x12345678..à 0x87654321 ..

Guest Physical Addr = 0x23456781..à 0x74536733 .. (Il s’agit de celui qui est mappé sur la mémoire virtuelle de l’hôte si ma compréhension est bonne).

Remarque: Les chiffres ci-dessus sont juste pour une explication.

Quand j’ai regardé dans le code source de qemu, je constate que cette taille, quelle que soit ce que nous mentionnons dans la commande, est assignée en tant que partie de | ram_addr_t | bloc. Mais je ne suis pas en mesure de trouver comment procéder pour trouver le décalage pour cette taille. Aidez-moi à cet égard au plus tôt.

    Sur la base de ce qui précède, je pense que ce que vous voulez faire n’est pas de mapper une adresse virtuelle d’invité sur une adresse physique d’invité (par la poste), mais une adresse physique d’invité pour héberger une adresse virtuelle.

    Le mappage entre l’invité physique et virtuel invité est (principalement) contrôlé par le système d’exploitation invité. Si vous essayez vraiment de regarder un invité physique à un invité virtuel, cela dépend de la cible. Certaines cibles qemu ne disposent même pas d’un tel mappage (espace d’adressage plat).

    Je commencerais par regarder la source pour memory.c et memory_mapping.c .

    Vous trouverez ci-dessous un extrait de exec.c qui convertit une adresse virtuelle cible (invité) cible en une adresse physique cible et y manipule la mémoire. Est-ce ce dont vous aviez besoin?

     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; 

    Enfin, je pense que vous obtiendrez peut-être plus d’aide sur le canal IRC qemu qu’ici.