Последовательность выключения ядра Android Linux
Я работаю с ядром Linux Android и у меня есть проблема. Я пытаюсь создать блок-схему последовательности кодов выключения ядра моего телефона Android.
Если я нажимаю кнопку питания на телефоне и выбираю "Выключить", чтобы выключить устройство. Интересно, что происходит внутри системы. Какой модуль ядра будет исходным модулем последовательности отключения питания? Какие модули ядра вызывают какие системные вызовы в течение всего процесса отключения питания?
Я получил файл журнала моего устройства, как показано ниже..
...
ghost[362]: [Ghost] Now, 50th boot.
[ 119.307156] msm_hsl_power: Unknown PM state 1
[ 129.966017] pil-q6v5-mss fc880000.qcom,mss: PBL returned unexpected status -284491765
[ 129.972866] pil-q6v5-mss fc880000.qcom,mss: mba: Failed to bring out of reset
[ 129.992102] modem_notifier_cb: sysmon_send_event error -19
[ 129.996628] M-Notify: General: 5
[ 129.999825] msm_ipc_load_default_node: Failed to load modem
[ 131.336799] pil-q6v5-mss fc880000.qcom,mss: PBL returned unexpected status -284491765
[ 131.343844] pil-q6v5-mss fc880000.qcom,mss: mba: Failed to bring out of reset
[ 131.351708] modem_notifier_cb: sysmon_send_event error -19
[ 131.356216] M-Notify: General: 5
[ 131.359430] smd_pkt_open failed on smd_pkt_dev id:0 - subsystem_get failed for modem
[ 132.385289] param_sec_operation FAIL LLSEEK
[ 132.388448] sec_open_param PARAM OPEN FAIL
[ 132.392715] set_dload_mode <0> ( c01882a0 )
[ 132.397069] (sec_debug_set_upload_magic) 0
[ 132.496318] Power down.
[ 132.497733] Powering off the SoC
[ 132.500972] set_dload_mode <0> ( c0188348 )
[ 132.505717] Calling SCM to disable SPMI PMIC
Интересно, является ли restart.c в "arch\arm\mach-msm" первым модулем, который запускает последовательность выключения после нажатия программной кнопки "Выключение"?
Я новичок в Linux. Буду очень признателен за вашу помощь!
2 ответа
Я предполагаю, что это телефон Android?
Существует разница между последовательностью выключения для Linux и для Android, хотя Android основан на ядре Linux. Последовательность выключения Linux должна начинаться с установки уровня запуска на 0; это приведет к отключению любых служб, прежде чем будет произведена полная остановка и отключение питания.
Но у Android нет уровней запуска, потому что они не являются частью ядра Linux, а являются initd.
Надеюсь, это даст вам возможность начать с последовательности выключения Linux. Вы должны начать с изучения уровней запуска.
Подробности последовательности выключения ядра находятся в этом вопросе.
Когда вы нажимаете кнопку питания в системе Linux, вызывается сценарий оболочки, который обычно присутствует в /etc/acpi/actions/power.sh
, Этот скрипт внутренне ищет идентификатор первого активного сеанса X11. Затем он проверяет, есть ли диспетчер питания, в противном случае он вызывает команду выключения. Я предлагаю вам заглянуть в исходный код команды shutdown и убедиться в том, какие все функции / системные вызовы она вызывает внутри. Надеюсь, поможет.