Как загрузчик воспринимает команду после «перезапуска системы с помощью команды»? - PullRequest
11 голосов
/ 29 марта 2011

При поиске в источнике Android для команды перезагрузки мы находим следующую строку:

__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, \
         LINUX_REBOOT_CMD_RESTART2, argv[optind]);

. Это стандартный системный вызов Linux для перезагрузки системы с помощью определенной команды, см. Unix System Call Reboot .

В Android эта команда используется для указания загрузчику запустить ядро ​​в режиме восстановления или перейти в режим быстрой загрузки в загрузчике.

Мой вопрос: Как загрузчик принимает команду?И реализована ли эта функциональность в U-Boot? (я не могу найти ее в поиске ни через Google, ни в источнике U-Boot.)

Кроме того, похоже, что это не относится к Android, ноLinux выполняет «перезагрузку с помощью команды».Любая информация о том, как это «нормально» обрабатывается / используется в Linux?

Ответы [ 4 ]

7 голосов
/ 01 апреля 2011

Когда система перезагружается с использованием LINUX_REBOOT_CMD_RESTART2, предоставленная командная строка передается всем уведомителям, зарегистрированным с register_reboot_notifer(), и, наконец, machine_restart() - функция, зависящая от архитектуры, которая фактически выполняет перезагрузку системы.

Большинство архитектур полностью игнорируют переданную команду - для примера того, который не делает, см. SPARC. Реализация SPARC machine_restart() передает предоставленную строку в команду boot PROM.

Реализация ARM machine_restart() заканчивается передачей предоставленной команды arch_reset(), которая реализуется отдельно на каждой платформе ARM - из того, что я вижу, большинство, если не все эти реализации игнорируют передал команду, по крайней мере, в ядре апстрима. Это может быть не тот дроид, которого вы ищете.

2 голосов
/ 27 февраля 2012

Запишите команду «boot-recovery» в разделе MSC. Загрузчик считывает строку из раздела MSC и загружает ядро ​​восстановления. Так ядро ​​восстановления загружалось во Froyo и ранее. Тот же подход можно использовать в GB / HC / ICS.

Другой метод - выделить немного памяти и передать флаг, который читается из загрузчика. Единственная проблема заключается в том, что содержимое DRAM может быть потеряно во время перезагрузки, если вы не переведите SDRAM в режим самообновления. Поэтому во время перезапуска об этом нужно позаботиться.

Первый метод полезен, когда питание отключается во время процесса обновления. В этом случае устройству необходимо снова зайти в ядро ​​восстановления. В этом случае раздел MSC должен быть очищен только после успешного завершения всего процесса обновления.

1 голос
/ 30 марта 2011

Понятия не имею, как они это делают в Android, но в наших системах, где мы также используем u-boot, у нас аналогичный механизм.

Мы оставляем за собой очень небольшую часть памяти, которая предназначена для "связь "от загрузчика до ядра и в обратном направлении.Если эта память может пережить перезагрузку (перевести ОЗУ в режим самообновления перед перезагрузкой или во Flash), тогда легко прочитать значение в начале загрузчика и определить, нужно ли вам запускать ядро, а затем вашу систему обычноили вы хотите перейти в специальный режим загрузчика.

0 голосов
/ 09 октября 2014

На некоторых процессорах ARM работающее ядро ​​устанавливает флаг в одном из регистров ЦП, который затем читается UBOOT, помните об этом, если это сильно зависит от оборудования.

...