Как загрузчик получает команду после "перезапуска системы с командой"?
Глядя в источник 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, имея в виду этот материал, если он специфичен для конкретного оборудования.