У меня есть какое-то приблизительное представление о том, как пользовательское пространство и init-система (будь то классическая init sysV / upstart / systemd) работают при выключении системы. (По сути, есть последовательность заказов: «Стоп!», «Пожалуйста, остановите сейчас действительно», «Процесс, который мне нужен, чтобы убить вас, чтобы остановить» и ожидание ... что-то происходит).
В любом случае, я не очень понимаю, как происходит отключение системы в ядре (где, конечно же, есть много чего сделать)?
Я попытался заглянуть в документацию ядра https://www.kernel.org/doc/htmldocs/ и даже использовал инструмент поиска АНБ, чтобы дать мне понять, как он работает.
Также я искал на SE U + L и ничего не нашел (я это пропустил?)
В любом случае, этот вопрос, хотя и может быть немного сложным, заслуживает ответа в этой сети вопросов и ответов, так как я предполагаю, что все больше людей заинтересованы в получении эскиза того, что происходит в ядре Linux при завершении работы.
Потенциально есть также изменение, чтобы ссылаться на некоторые более подробные объяснения.
Возможно, ответ будет включать какие системные вызовы и какие сигналы ядра используются?
https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel/reboot.c, похоже, используется x86-файл, связанный с перезагрузкой (уже близко к завершению работы, а?)
может быть, фрагмент, найденный здесь http://lxr.free-electrons.com/source/kernel/reboot.c#L176, можно использовать для объяснения
176 void kernel_power_off (void) 177 { 178 kernel_shutdown_prepare (SYSTEM_POWER_OFF); 179 if (pm_power_off_prepare) 180 pm_power_off_prepare (); 181 migrate_to_reboot_cpu (); 182 syscore_shutdown (); 183 pr_emerg («Выключить \ n»); 184 kmsg_dump (KMSG_DUMP_POWEROFF); 185 machine_power_off (); 186} 187 EXPORT_SYMBOL_GPL (kernel_power_off);
источник
shutdown(8)
то есть устаревшая,-n
которую я думаю в старой документации Unix, используемой для чтения « выключите систему самостоятельно - основной блок включен на пожаре! », Фактически запутанный переключатель блокировки системы, который оставил бы / мог бы разбросать биты по полу (или, по крайней мере, файловые системы в поврежденном состоянии) - можно представить, что это будет использоваться для системы типа основной рамы, где кто-то только что схватил их за руку в охлаждающий вентилятор. LyОтветы:
Основные ресурсы, чтобы понять, как работает ядро Linux:
В этом случае я не могу найти что-либо центрально релевантное в документации или на LWN, так что LXR это так.
Последнее, что делает код пользователя, - это вызывает
reboot
системный вызов . Требуется 4 аргумента, поэтому ищитеSYSCALL_DEFINE4(reboot
на LXR, что приводит кkernel/reboot.c
. После проверки привилегий вызывающего абонента и аргументов, точка входа системного вызова вызывает один из нескольких функций:kernel_restart
для перезагрузки,kernel_halt
чтобы остановить на тугую петле,kernel_poweroff
чтобы отключить питание системы,kernel_kexec
чтобы заменить ядро на новом (если скомпилированы в), илиhibernate
сохранить память на диск перед выключением.kernel_restart
,kernel_halt
Иkernel_power_off
довольно похожи:reboot_notifier_list
, это список хуков, которые компоненты ядра могут зарегистрировать для выполнения кода при отключении питания. На этом этапе для выполнения кода требуется всего несколько драйверов, в основном это сторожевые таймеры.system_state
переменную.device_shutdown
чтобы отключить или отключить все устройства в системе. Многие водители подключаются к этой стадии.Обратите внимание, что любые файловые системы, которые все еще смонтированы в этой точке, эффективно размонтированы принудительно. Вызывающий системный вызов несет ответственность за любую чистую размонтировку.
migrate_to_reboot_cpu
заботится о переключении на один конкретный процессор и не позволяет планировщику отправлять код на другие процессоры. После этого запускается только один процессор.syscore_shutdown
вызываетshutdown
метод зарегистрированных операций syscore . Я думаю, что это в основном отключение прерываний; У нескольких крючков естьshutdown
метод.machine_restart
,machine_halt
илиmachine_power_off
.Гибернации код проходит через следующие этапы:
kernel_restart
,kernel_halt
илиkernel_power_off
, или какой-либо специфичный для платформы метод гибернации.Другой способ выключить систему
machine_emergency_restart
. Это вызывается волшебным ключом SysRqB . OКлюч работает по- другому: он вызываетkernel_power_off
.Система также может отключиться от паники , то есть неисправимой ошибки. Паника пытается зарегистрировать сообщение, а затем перезагрузить систему (через аппаратный сторожевой таймер или аварийный перезапуск).
источник
syscore_shutdown
(то есть это решит мой другой вопрос unix.stackexchange.com/q/122540/24394 ) , Оба шага (1) и шаг (7) позволяют зарегистрировать материал, который будет выполняться при выключении, не стесняясь, что + У меня сложилось впечатление, что на порядок выполнения этих обратных вызовов в (1) и (7) нельзя повлиять! Я буду документы, которые вы упомянули, но если вы знаете! Благодарность!Это только частичный ответ, и я наверняка предлагаю другой ответ, который может быть более исчерпывающим и ясным.
Содержание этого ответа взято из
kernel/reboot.c
файла ядра Linux 3.13 (что может быть не первым предположением, поскольку имя не shutdown.c, а reboot.c)В любом случае, у нас есть три основные функции, которые определяют процесс выключения системы.
void kernel_halt(void)
// который заканчивается системой в состоянии остановкиvoid kernel_power_off(void)
// который заканчивается отключением системыvoid kernel_restart(char *cmd)
// который завершает систему, чтобы перезапустить ееЭти функции очень кратки и поэтому могут быть вставлены здесь полностью. Их код лучше всего показывает, какие шаги предпринимаются на пути к выключению в ядре. (комментарии сделаны мной и не могут быть на 100% идеальными и правильными, проверьте себя на предмет уверенности. Это просто попытка.
void kernel_halt(void)
все это инициируется
sys_reboot
системным вызовом, который, учитывая, что он не только перезагружается, но и завершает работу, не является прямой связью с процессом завершения работы в любом случае.источник