qemu-system-aarch64 расположение памяти и устройства - PullRequest
0 голосов
/ 11 июля 2020

Есть ли какой-нибудь документ о памяти и устройстве qemu-arm64.

Я могу получить некоторую информацию из atf и linux ядра.

Так как размер памяти можно указать . Какой на самом деле физический адрес памяти.

например: -m 2G

Это память из [0 ~ 2G) И где найти io-адрес? например, uart gi c

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Для всей эмуляции системы QEMU расположение памяти и устройств зависит от машины, которую вы просите эмулировать. Это, очевидно, различается для разных архитектур, а также для разных типов машин в архитектуре. (Некоторые архитектуры более согласованы, чем другие, потому что именно так устроено реальное оборудование: почти все машины x86 «выглядят как P C»; но каждая 32-битная плата Arm сильно отличается от других. Машина QEMU модели обычно выглядят как реальное оборудование.)

Таким образом, ответ на ваш вопрос зависит от типа машины:

  1. Для типов машин, которые соответствуют реальному оборудованию (например, " xlnx-zcu102 "), вам необходимо найти и прочитать документацию и спецификации этого оборудования.

  2. Для типов компьютеров, которые не соответствуют реальному оборудованию и существуют только в QEMU (например," sbsa-ref »или« virt »), эта информация должна быть задокументирована в документации QEMU, но часто это не так.

Ответ для платы« virt », кстати, следующий: 1015 *

  • fla sh память находится по адресу 0x0000_0000
  • RAM начинается с 0x4000_0000
  • , чтобы найти адреса всех других устройств, гость должен прочитать дерево устройств- капля (d tb), который QEMU создает и помещает в гостевую память. Для «голого» гостевого образа dtb можно найти в основании ОЗУ; для гостевого образа Linux -kernel-boot-protocol адрес dtb передается обычным образом для ядра Linux.

Обновление: я добавил документацию для платы 'virt' в QEMU, включая информацию о программировании на голом железе: https://www.qemu.org/docs/master/system/arm/virt.html#hardware -configuration-information-for-bare-metal-programming

0 голосов
/ 13 июля 2020

Спасибо @Peter Maydell за то, что сообщил мне, что "virt" - это доска. Взгляните на https://github.com/qemu/qemu/blob/master/hw/arm/virt.c Он показывает:

static const MemMapEntry base_memmap[] = {
    /* Space up to 0x8000000 is reserved for a boot ROM */
    [VIRT_FLASH] =              {          0, 0x08000000 },
    [VIRT_CPUPERIPHS] =         { 0x08000000, 0x00020000 },
    /* GIC distributor and CPU interfaces sit inside the CPU peripheral space */
    [VIRT_GIC_DIST] =           { 0x08000000, 0x00010000 },
    [VIRT_GIC_CPU] =            { 0x08010000, 0x00010000 },
    [VIRT_GIC_V2M] =            { 0x08020000, 0x00001000 },
    [VIRT_GIC_HYP] =            { 0x08030000, 0x00010000 },
    [VIRT_GIC_VCPU] =           { 0x08040000, 0x00010000 },
    /* The space in between here is reserved for GICv3 CPU/vCPU/HYP */
    [VIRT_GIC_ITS] =            { 0x08080000, 0x00020000 },
    /* This redistributor space allows up to 2*64kB*123 CPUs */
    [VIRT_GIC_REDIST] =         { 0x080A0000, 0x00F60000 },
    [VIRT_UART] =               { 0x09000000, 0x00001000 },
    [VIRT_RTC] =                { 0x09010000, 0x00001000 },
    [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
    [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
    [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
    [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
    [VIRT_PCDIMM_ACPI] =        { 0x09070000, MEMORY_HOTPLUG_IO_LEN },
    [VIRT_ACPI_GED] =           { 0x09080000, ACPI_GED_EVT_SEL_LEN },
    [VIRT_NVDIMM_ACPI] =        { 0x09090000, NVDIMM_ACPI_IO_LEN},
    [VIRT_MMIO] =               { 0x0a000000, 0x00000200 },
    /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
    [VIRT_PLATFORM_BUS] =       { 0x0c000000, 0x02000000 },
    [VIRT_SECURE_MEM] =         { 0x0e000000, 0x01000000 },
    [VIRT_PCIE_MMIO] =          { 0x10000000, 0x2eff0000 },
    [VIRT_PCIE_PIO] =           { 0x3eff0000, 0x00010000 },
    [VIRT_PCIE_ECAM] =          { 0x3f000000, 0x01000000 },
    /* Actual RAM size depends on initial RAM and device memory settings */
    [VIRT_MEM] =                { GiB, LEGACY_RAMLIMIT_BYTES },
};

...