可以使用qemu-system-aarch64来模拟aarch64,具体命令如下:
qemu-system-aarch64 -M virt -cpu cortex-a53 ...(other options)我们可以使用-M virt,dumpdtb=DTBFILE来获取内部设备树blob。
我的问题是,我们如何获得虚拟机virt的PERIPHBASE?
我们可以使用dtc工具从设备树blob文件中执行此操作吗?
发布于 2018-02-09 03:15:38
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方法仍然更容易实现-以我的浅见。
发布于 2018-06-29 10:02:49
也许这就是你想要的。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 },
};发布于 2018-02-08 17:51:11
PERIPHBASE将是设备树blob中的GIC分配器寄存器库的地址。
也就是说,我不知道你为什么想知道这些信息。'virt‘板的来宾代码应该只硬编码RAM的基地址,并且应该在运行时从dtb获取所有其他信息。在未来的某一天,我们可能会重新安排virt内存映射,如果您有硬编码的地址,那么您的客户将停止工作……
https://stackoverflow.com/questions/48666046
复制相似问题