如何获得qemu机器的PERIPHBASE“virt”?

时间:2018-02-07 14:15:44

标签: qemu arm64 bare-metal

qemu-system-aarch64可用于模拟aarch64,具体命令如下:

qemu-system-aarch64 -M virt -cpu cortex-a53 ...(other options)

我们可以使用-M virt,dumpdtb=DTBFILE来获取内部设备树blob。

我的问题是,我们如何获得虚拟机PERIPHBASE的{​​{1}}?

我们可以使用virt工具从设备树blob文件中执行此操作吗?

3 个答案:

答案 0 :(得分:1)

dtc命令是:

dtc -I dtb -O dts virt.dtb > virt.dts

您要查找的节点应为/intc

intc {
    phandle = <0x8001>;
    reg = <0x0 0x8000000 0x0 0x10000 0x0 0x8010000 0x0 0x10000>;
    compatible = "arm,cortex-a15-gic";
    ranges;
    #size-cells = <0x2>;
    #address-cells = <0x2>;
    interrupt-controller;
    #interrupt-cells = <0x3>;

    v2m {
        phandle = <0x8002>;
        reg = <0x0 0x8020000 0x0 0x1000>;
        msi-controller;
        compatible = "arm,gic-v2m-frame";
    };
};

更直接的选择是使用fdtget:

fdtget -t i -t x virt.dtb /intc reg
0 8000000 0 10000 0 8010000 0 10000

我同意Peter Maydell的观点,如果您在QEMU中运行Linux,则最好在运行时使用DTB来检索GIC CPU和分配器接口的地址。
但是,在我的拙见中,非DTB方法仍然更容易在模拟的裸机环境中实现。

答案 1 :(得分:1)

也许这就是您想要的。 https://github.com/qemu/qemu/blob/master/hw/arm/virt.c

static const MemMapEntry a15memmap[] = {
/* 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 },
/* 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_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 },
[VIRT_MEM] =                { 0x40000000, RAMLIMIT_BYTES },
/* Additional 64 MB redist region (can contain up to 512 redistributors) */
[VIRT_GIC_REDIST2] =        { 0x4000000000ULL, 0x4000000 },
[VIRT_PCIE_ECAM_HIGH] =     { 0x4010000000ULL, 0x10000000 },
/* Second PCIe window, 512GB wide at the 512GB boundary */
[VIRT_PCIE_MMIO_HIGH] =   { 0x8000000000ULL, 0x8000000000ULL },
};

答案 2 :(得分:0)

PERIPHBASE将是设备树blob中GIC分配器寄存器库的地址。

那就是说,我不确定你为什么要知道这些信息。 'virt'板的访客代码应该只对RAM的基地址进行硬编码,并且应该在运行时从dtb获取所有其他信息。将来的某一天,我们可能会重新安排virt内存映射,如果你有硬编码的地址,那么你的访客将停止工作......