【发布时间】:2020-11-01 07:53:57
【问题描述】:
有没有关于qemu-arm64的内存和设备布局的文档。
我可以从 atf 和 linux 内核获取一些信息。
由于可以指定内存大小。内存的实际物理地址是什么。
例如: -m 2G
是来自[0~2G)的内存 在哪里可以找到io地址?例如 uart gic
【问题讨论】:
标签: memory-management qemu arm64 mmu
有没有关于qemu-arm64的内存和设备布局的文档。
我可以从 atf 和 linux 内核获取一些信息。
由于可以指定内存大小。内存的实际物理地址是什么。
例如: -m 2G
是来自[0~2G)的内存 在哪里可以找到io地址?例如 uart gic
【问题讨论】:
标签: memory-management qemu arm64 mmu
对于所有 QEMU 的系统仿真,内存和设备的布局取决于您要求它仿真的机器。很明显,这在架构之间是不同的,在架构中的机器类型之间也是如此。 (有些架构比其他架构更一致,因为现实世界的硬件就是这样:几乎所有 x86 机器“看起来像 PC”;但每个 32 位 arm 板在主要方面都与其他板不同。QEMU 的机器模型看起来像通常是真正的硬件。)
所以您的问题的答案取决于机器类型:
对于与真实硬件匹配的机器类型(例如“xlnx-zcu102”),您需要查找并阅读该硬件的文档和数据表。
对于与真实硬件不匹配且仅存在于 QEMU 中的机器类型(例如“sbsa-ref”或“virt”),此信息应记录在 QEMU 的文档中,但通常不是。
顺便说一句,“virt”板的答案是:
更新:我将“virt”板的文档添加到 QEMU,包括有关裸机编程的信息:https://www.qemu.org/docs/master/system/arm/virt.html#hardware-configuration-information-for-bare-metal-programming
【讨论】:
感谢@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 },
};
【讨论】: