【问题标题】:How to get PERIPHBASE of qemu machine "virt"?如何获取 qemu 机器“virt”的 PERIPHBASE?
【发布时间】:2018-02-07 14:15:43
【问题描述】:

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

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

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

我的问题是,我们如何才能获得虚拟机virtPERIPHBASE

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

【问题讨论】:

    标签: qemu arm64 bare-metal


    【解决方案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 方法在模拟的裸机环境中仍然更容易实施。

    【讨论】:

      【解决方案2】:

      也许这就是你想要的。 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 },
      };
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-05-18
          • 2021-10-31
          • 2017-08-10
          • 1970-01-01
          • 2015-09-04
          • 2016-11-14
          • 2011-06-16
          • 1970-01-01
          • 2022-01-15
          相关资源
          最近更新 更多