首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取qemu机器的PERIPHBASE "virt"?

如何获取qemu机器的PERIPHBASE "virt"?
EN

Stack Overflow用户
提问于 2018-02-07 22:15:44
回答 3查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
qemu-system-aarch64 -M virt -cpu cortex-a53 ...(other options)

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2018-02-09 03:15:38

dtc命令为:

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

您要查找的节点应为/intc

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-06-29 10:02:49

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

代码语言:javascript
复制
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 },
};
票数 1
EN

Stack Overflow用户

发布于 2018-02-08 17:51:11

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48666046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档