Как загрузчик получает команду после "перезапуска системы с командой"?

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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