首页 > 解决方案 > 这个 .dtb 文件中指定的内存部分有多长?

问题描述

我觉得我不明白如何解释dtb/dts文件的格式,希望你能提供帮助。运行这些命令后:

qemu-system-riscv64 -machine virt -machine dumpdtb=riscv64-virt.dtb
dtc -I dtb -O dts -o riscv-virt.dts riscv-virt.dtb

结果riscv-virt.dts包含memory机器的定义:

/dts-v1/;

/ {
    #address-cells = <0x02>;
    #size-cells = <0x02>;
    compatible = "riscv-virtio";
    model = "riscv-virtio,qemu";

    ...other memory definitions...

    memory@80000000 {
        device_type = "memory";
        reg = <0x0 0x80000000 0x0 0x8000000>;
    };
};

我有几个问题:

  1. 为什么会有多对 reg 定义?基于此链接,似乎第二个0x0 0x8000000覆盖了前一对中刚刚设置的内容0x0 0x80000000
  2. 这个记忆库有多长?哪个值告诉我这个?
  3. 第一行说memory@80000000,但随后 reg 命令开始于0x0。内存是否从0x0或开始0x80000000

基本上,我只是觉得我不明白如何解释这一点。用简单的英语,这里定义了什么?

标签: qemuriscvdevice-tree

解决方案


dts 规范p. 13 你可以部分阅读。Reg 以 (address,length) 对的形式给出。在您的情况下,地址和长度以 64 字节给出,这是通过使用2! 32 位值。因此地址为0x80000000,大小为0x8000000

编辑:变量#address-cells 和#size-cells 指定有多少单元格(32 位值)用于地址和大小。在原始dts中,它总是在设备的母节点中指定。也许您可以在反编译的 dts 中找到它


推荐阅读