Дерево устройств OrangePi Zero2


  clocks   |   soc@03000000   |   aliases   |   chosen   |   firmware   |   cpus   |   opp_l_table   |   psci   |   n_brom   |   s_brom   |   sram_ctrl   |   sram_a1   |   sram_a2   |   prcm   |   s_cpuscfg   |   ion   |   dram   |   memory@40000000   |   interrupt-controller@03020000   |   interrupt-controller@0   |   intc-nmi@07010320   |   sunxi-sid@03006000   |   sunxi-sid-ng@03006000   |   sunxi-chipid@03006200   |   timer_arch   |   pmu   |   dramfreq   |   uboot   |   iommu@030f0000   |   gpu@0x01800000   |   box_start_os0   |   __symbols__   |     Все узлы

Узел: memory@40000000 - комментарии

memory - узел устройства memory требуется для всех деревьев устройств и описывает структуру физической памяти для системы. Если в системе имеется несколько диапазонов памяти, можно создать несколько узлов памяти или указать диапазоны в свойстве reg одного узла памяти.

Свойства узла memory :
  • device_type = \"memory\"
  • reg - массив, состоящий из произвольного количества пар адреса и размера, которые определяют физический адрес и размер диапазонов памяти.

    В примере ниже (из мануала) свойство reg используется для определения адреса и размера двух диапазонов памяти. Диапазон адресов области ввода-вывода 2 Гб пропускается. Обратите внимание, что свойства #address-cells и #size-cells корневого узла задают значение 2, что означает, что для определения адреса и длины свойства reg узла memory требуются две 32-битные ячейки.


    memory@0 { device_type = \"memory\"; reg = <0x000000000 0x00000000 0x00000000 0x80000000>; }; memory@100000000 { device_type = \"memory\"; reg = <0x00000001 0x00000000 0x00000001 0x00000000>; };

    Примечание.
    <0x00000000 80000000> = 2147483648 (2048 Mb = 2 Gb)
    <0x00000001 00000000> = 4294967296 (4096 Mb = 4 Gb)

    В первом примере ОЗУ имеет размер 2 Gb, начиная с нулевого адреса, во втором примере ОЗУ имеет размер 4 Gb, начиная с адреса 4 Gb ,

    А теперь два реальных примера:

  • 1) В дереве устройств OpiZero2 (сохраненном с загруженной системой) имеется узел memory@40000000 со свойством reg, имеющем начение <0x00000000 40000000 0x00000000 40000000>, что соответствует размеру ОЗУ = 1 Gb, начинающегося с адреса 1 Gb, т.к. <0x00000000 40000000> = 1073741824 (1024 Mb)

    При этом в файле, сохраненном командой U-Boot fdtprint, reg = <0x00000000 40000000 0x00000000 20000000>, что соответствует размеру памяти 512 Mb. Видимо, в процессе загрузки ядра происходит определение реального размера памяти и модификация значения reg в дереве устройств

  • 2) В дереве устройств ТВ-бокса на H616, прочитанном в его файловой системе, есть узел memory@40000000, свойство reg которого имеет начение <0x00000000 40000000 0x00000000 80000000>, что соответствует размеру ОЗУ 2 Gb, начинающегося с адреса 1 Gb, т.к.<0x00000000 80000000> = 2147483648 (2048 Mb = 2 Gb)

    Отметим, что 2 Gb - это истинный суммарный объем микросхем памяти, имеющихся в устройстве.

    Однако, в файле sunxi.fex, имеющемся в образе прошивки,
    reg = <0x00000000 40000000 0x00000000 20000000>,
    что соответствует размеру памяти 512 Mb

    А самый неприятный парадокс заключается в том, что meminfo показывает целых 4 Gb (!??)