【问题标题】:qemu-system-aarch64 memory and device layoutqemu-system-aarch64 内存和设备布局
【发布时间】:2020-11-01 07:53:57
【问题描述】:

有没有关于qemu-arm64的内存和设备布局的文档。

我可以从 atf 和 linux 内核获取一些信息。

由于可以指定内存大小。内存的实际物理地址是什么。

例如: -m 2G

是来自[0~2G)的内存 在哪里可以找到io地址?例如 uart gic

【问题讨论】:

    标签: memory-management qemu arm64 mmu


    【解决方案1】:

    对于所有 QEMU 的系统仿真,内存和设备的布局取决于您要求它仿真的机器。很明显,这在架构之间是不同的,在架构中的机器类型之间也是如此。 (有些架构比其他架构更一致,因为现实世界的硬件就是这样:几乎所有 x86 机器“看起来像 PC”;但每个 32 位 arm 板在主要方面都与其他板不同。QEMU 的机器模型看起来像通常是真正的硬件。)

    所以您的问题的答案取决于机器类型:

    1. 对于与真实硬件匹配的机器类型(例如“xlnx-zcu102”),您需要查找并阅读该硬件的文档和数据表。

    2. 对于与真实硬件不匹配且仅存在于 QEMU 中的机器类型(例如“sbsa-ref”或“virt”),此信息应记录在 QEMU 的文档中,但通常不是。

    顺便说一句,“virt”板的答案是:

    • 闪存位于 0x0000_0000
    • RAM 从 0x4000_0000 开始
    • 要查找所有其他设备的地址,客户应读取 QEMU 创建并放入客户内存的设备树 blob (dtb)。对于裸机客户映像,可以在 RAM 的底部找到 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

    【讨论】:

    【解决方案2】:

    感谢@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 },
    };
    
    

    【讨论】:

    • 这确实是 QEMU 内部定义该板各种设备所在位置的数据结构。然而来宾代码不应该依赖这个内部实现信息——它可能会在未来的 QEMU 版本中改变。设备树 blob 是访客代码应读取的内容以找出这些地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2021-06-24
    • 2021-06-23
    • 2016-01-26
    • 2023-03-09
    • 2021-09-28
    相关资源
    最近更新 更多