Найти в Дзене
mamaich

Раздел misc на Яндекс Станции Макс

Ранее я описал, как Яндекс Станция первого поколения определяет, что ей надо загрузиться в режим обновления. В Станции Макс проверка отличается - более не используется раздел misc, а устанавливаются флаги, которые очищаются при отключении питания. Но всё же содержимое раздела misc на Максе по прежнему используется при загрузке на стадии preboot: preboot=run true;
run bcb_cmd;
run factory_reset_poweroff_protect;
run start_boot_animation;
run init_display;
run sysrecovery_check;
run upgrade_check;
run storeargs;
bcb uboot-command;
run switch_bootmode; см строку "bcb uboot-command". Так что можно использовать эту возможность для изменения хода загрузки устройства, например, для загрузки своего кастомного ядра. В исходниках u-boot для amlogic (я чаще всего смотрю в khadas, файл common/cmd_bcb.c) находим функцию do_RunBcbCommand, которая исполняет команду "bcb". Определения: Код: То есть, мы видим, что читается MISCBUF_SIZE (1088 байт) в miscbuf, в котором первые COMMANDBUF_SIZE (32 байта)

Ранее я описал, как Яндекс Станция первого поколения определяет, что ей надо загрузиться в режим обновления. В Станции Макс проверка отличается - более не используется раздел misc, а устанавливаются флаги, которые очищаются при отключении питания. Но всё же содержимое раздела misc на Максе по прежнему используется при загрузке на стадии preboot:

preboot=run true;
run bcb_cmd;
run factory_reset_poweroff_protect;
run start_boot_animation;
run init_display;
run sysrecovery_check;
run upgrade_check;
run storeargs;
bcb uboot-command;
run switch_bootmode;

см строку "bcb uboot-command". Так что можно использовать эту возможность для изменения хода загрузки устройства, например, для загрузки своего кастомного ядра.

В исходниках u-boot для amlogic (я чаще всего смотрю в khadas, файл common/cmd_bcb.c) находим функцию do_RunBcbCommand, которая исполняет команду "bcb".

Определения:

Код:

-2

То есть, мы видим, что читается MISCBUF_SIZE (1088 байт) в miscbuf, в котором первые COMMANDBUF_SIZE (32 байта) сравниваются со строкой, переданной в качестве аргумента команде bcb (в нашем случае это "uboot-command"), и далее строка recovery, начинающаяся со смещения 64, длиной 768 байт, передаётся в run_command на исполнение.

Также мы видим, что данный раздел очищается только после успешного исполнения команды - то есть, его содержимое сохранится если мы это захотим.

Попробуем выполнить команду "go 077E83140" при загрузке.

Обычное предупреждение: я не несу никакой ответственности за последствия для вас, Станции, аккаунта Яндекс или чего-то ещё, а так же за то, что описание ниже приведет к какому-либо эффекту, кроме потери времени.

Я опишу самый простой способ запуска - для Станций Макс, у которых разрешен режим загрузки по USB без пароля.

Сперва переключаем Станцию Макс в режим загрузки с USB.

Далее читаем старое содержимое раздела update:

update mread store misc normal 0x100000 misc.img

Достаточно прочитать только начало раздела, а не все 8 мб - под Windows чтение/запись больших блоков у меня работает нестабильно.

Удостоверяемся, что в первых 32 байтах стоят нули:

-3

Меняем начало раздела на "uboot-command" и со смещения 0x40 пишем нужную нам команду.

-4

Обратите внимание, что по смещению 0x800 находятся двоичные данные, описывающие раздел, использующийся при загрузке. Их не трогаем, иначе u-boot очистит раздел misc и не выполнит нашу команду.

-5

Записываем раздел назад:

update mwrite misc.img store misc normal

Иногда команда завершается ошибкой, но по факту данные будут записаны.

-6

При желании можно прочитать его снова для контроля.

И перезагружаемся по питанию или командой:

update.exe bulkcmd "reboot"

Видим, что команда выполнилась успешно и мы попали в интерактивный u-boot:

-7

И так будет происходить при каждой перезагрузке. Довольно удобно для дальнейших исследований Станции Макс.

Чтобы восстановить прежний режим загрузки - достаточно очистить раздел misc командой "amlmmc erase misc", либо восстановить его прежнее содержимое.