TV бокс T95Z Plus


  Обзор     Корпус     Элементы     Порты       ENV       FDT  

Переменные окружения (Environment)

Для хранения переменных окружения ENV в Android 12, использующем систему A и B слотов, предназначены два раздела env_A и env_B. В исходном состоянии стоковой прошивки в раздел env_A записан файл env.fex из imagewty-образа прошивки, а раздел env_B оставлен пустым.

После OTA-обновления в обоих разделах env_A и env_B записана одинаковая информация, представляющая собой слегка модифицированный исходный блоб ENV.

Для получения списка переменных в читабельном виде есть несколько способов:
1) скопировать раздел env_a в файл и конвертировать его в обычный текст
2) сделать дамп переменных env в оболочке U-Boot командой printenv и сохранить терминальный вывод в файл.


Внимание ! Нужно учитывать, что printenv показывает состояние переменных в оперативной памяти, где они могут отличаться от переменных, хранящихся в разделе ENV, если подвергаются модификации в поцессе загрузки. Поэтому списки переменных в текстовом виде, полученные бекапом из раздела и из дампа, будут отличаться. Об отличиях подробнее - в конце.


Приведенный ниже текст (список переменных ENV) представляет собой переформатированный для наглядности дамп выполнения команды printenv U-Boot. То есть это переменные в оперативной памяти после загрузки в U-Boot. Имена переменных выделены жирно и для удобства условно пронумерованы. Зеленым курсивом помечены команды U-Boot, использованные в переменных.


Список переменных ENV


Комментарии и пояснения
Две переменных, которые желательно модифицировать руками:

  • bootdelay = 5 - время (в секундах) ожидания нажатия кнопки на клавиатуре UART-терминала для прерывания процесса загрузки и входа в оболочку U-Boot, в стоковых прошивках = 0 (запрет прерывания)
  • loglevel = 2 - уровень важности отображаемых в логе сообщений (max 8), в стоковой версии это значение равно 4, из-за чего лишние сообщения мешают нормально пользоваться консолью.


  • ab_partition_list - это список разделов, образующих слоты A и B ( т.е. имеющие суффиксы _A и _B), видимо, используется при обновлениях

  • partitions - список всех разделов (в соответствии с таблицей GPT) с их системными именами, которые указаны справа от '@' mmc_root - активный раздел с переменными (/dev/mmcblk0p4 соответствует env_b) slot_suffix = _b - указание загрузчику о том, что активным является слот B, поэтому нужно работать с разделами, имеющими в имени суффикс '_B'

  • rotpk_status = 0,
    ROTPK (root of trust public key register - регистре корневого открытого ключа доверия) 0 - означает, видимо, что доверенная загрузка не используется snum = 3c00144c180609521d0 - уникальный серийный номер, который хранится в памяти SoC и используется для формирования MAC-адреса

  • trace_enable - включить трассировку событий (=0 - выключена)
  • trace_buf_size - размер буфера трассировки (= 64M)
  • trace_event - список событий (event) для трассировки, если она разрешена
    sched_wakeup
    sched_switch
    sched_blocked_reason
    sched_cpu_hotplug
    block
    ext4


    Команды и переменные для загрузки системы

  • bootcmd - эта переменная представляет собой команду run, которая запускается при продолжении загрузки (без входа в оболочку U-Boot) или при вводе в оболочке команды boot содержит два аргумента: setargs_mmc и boot_normal

  • setargs_mmc - это тоже сложная переменная, сама являющаяся командой setenv bootargs, которая инициализирует массив bootargs целой группой переменных, записывая в него значения уже установленных одиночных переменных (earlycon,console и т.д.)

    Примечание. Знак $ означает значение переменной, которая следует за ним в фигурных скобках.

  • boot_normal - это вторая часть, выполняемая bootcmd, и она также состоит из двух команд U-Boot: sunxi_flash read 45000000 boot и bootm 45000000
    Здесь sunxi_flash читает содержимое раздела boot и записывает его в память по адресу 0x45000000, после чего команда bootm запускает на выполнение программу, лежащую с адреса 0x45000000.

  • boot_recovery - эта переменная должна иметь аналогичный смысл и механизм функционирования, но с загрузкой не ядра boot, а recovery. Но раздел recovery в таблице GPT отсутствует, поэтому команда run boot_recovery не выполняется и, скорее всего присутствие этой переменной - атавизм, доставшийся в наследство от однослотовых систем.

  • boot_fastboot = fastboot Это команда перевода устройства в режим fastboot, например, из оболочки:
     => run boot_fastboot
    sunxi_fastboot_init
    recv addr 0x41000000
    send addr 0xbbf02568
    start to display fastbootlogo.bmp
    54 bytes read in 1 ms (52.7 KiB/s)
    [36.412]bmp_name=fastbootlogo.bmp size 190236
    190236 bytes read in 9 ms (20.2 MiB/s)
    delay time 0
    weak:otg_phy_config
    usb init ok
    sunxi_usb_fastboot_status=0
    exit usb
    sunxi_fastboot_exit
    next work 0
    SUNXI_UPDATE_NEXT_ACTION_NULL
    

    Что происходит при сохранении переменных

    Если исправить какую-либо переменную командой ENV SET (это происходит в памяти), а затем сохранить командой ENV SAVE, то переменные из памяти записываются в раздел ENV_B.

    При этом происходят следующие изменения:

  • 1) список переменных становится отсортированным по имени переменной
  • 2) пустые переменные (с пустым значением), например, 'mac= ' удаляются
  • 3) удаляется переменная ab_partition_list
  • 4) изменяется значение переменной bootcmd
    run setargs_nand boot_normal --> run setargs_mmc boot_normal
  • 5) добавляются переменные: bootreason=unknow fdtcontroladdr=bbe83e58 fileaddr=bc2a9040 filesize=2a307a rotpk_status=0 snum=хххх

    Ниже показано сравнение списков переменных, условные обозначения:
    + - добавлены, * - удалены, # - измененны

    Левый столбец - раздел ENV_A, правый столбец - раздел ENV_B

    Внимание. Бекап раздела B сделан после сохранения переменных из памяти, поэтому изменения в переменных внесены в момент загрузки системы.

        Раздел A        Раздел B
    * ab_partition_list  -
      boot_fastboot      boot_fastboot
      boot_normal        boot_normal
      boot_recovery      boot_recovery
    # bootcmd          # bootcmd
      bootdelay          bootdelay
    * bt_mac             -
      -                + bootreason
      cma=8M             cma=8M
      console            console
      earlycon           earlycon
    + fdtcontroladdr     -
    + fileaddr           -
    + filesize           -
      force_normal_boot  force_normal_boot
      init               init
      initcall_debug     initcall_debug
      keybox_list        keybox_list
      loglevel           loglevel
    * mac                -
      mmc_root           mmc_root
      nand_root          nand_root
      -                + partitions
      -                + rotpk_status
      setargs_mmc        setargs_mmc
      setargs_nand       setargs_nand
      slot_suffix        slot_suffix
    * specialstr         -
      -                + snum
      trace_buf_size     trace_buf_size
      trace_enable       trace_enable
      trace_event        trace_event
    * wifi_mac           -
     



  •   Обзор     Корпус     Элементы     Порты       ENV       FDT