Я чувствую, что не понимаю, как интерпретировать формат файлов 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>;
};
};
У меня есть несколько вопросов:
0x0 0x8000000
перезаписывает то, что было только что установлено в предыдущей паре, 0x0 0x80000000
.memory@80000000
, но затем reg-команды начинаются с 0x0
. Память начинается с 0x0
или 0x80000000
?По сути, я просто чувствую, что не понимаю, как это интерпретировать. Говоря простым языком, что здесь определяется?
В dts-спецификация р. 13 можно прочитать частично. Reg задается парами (адрес, длина). В вашем случае адрес и длина задаются в 64 байтах, что делается с использованием 32-битных значений 2!. Таким образом, адрес равен 0x80000000, а размер 0x8000000.
Редактировать: Переменные #address-cells и #size-cells указывают, сколько ячеек (32-битных значений) используется для адреса и размера. В исходном дтс он всегда указывается в материнском узле устройства. Может быть, вы можете найти его в своем декомпилированном dts
Я только что обновил свой вопрос, включив в него
#address-cells
и#size-cells
верхнего уровня после прочтения вашего ответа. Ваш ответ мне понятен, спасибо!