Mam niejasny pomysł na to, jak przestrzeń użytkownika i init-system (czy to klasyczny init sysV / upstart / systemd) działają podczas zamykania systemu. (Zasadniczo istnieje kolejność zamówień „Stop!”, „Proszę przestań teraz naprawdę”, „Proces muszę cię zabić, aby zatrzymać” i czekanie… rzeczy się dzieją).
W każdym razie jestem bardzo nieświadomy, jak działa zamknięcie systemu w jądrze (gdzie na pewno jest też wiele rzeczy do zrobienia)?
Próbowałem zajrzeć do dokumentacji jądra https://www.kernel.org/doc/htmldocs/, a nawet skorzystałem z narzędzia wyszukiwania PAL NSA, aby dać mi przewagę w odkrywaniu, jak to działa.
Przeszukałem również SE U + L i nic nie znalazłem (przeoczyłem?)
W każdym razie pytanie, choć potencjalnie nieco trudne, zasługuje na odpowiedź w tej sieci pytań i odpowiedzi, ponieważ zakładam, że więcej osób jest zainteresowanych otrzymaniem szkicu tego, co dzieje się w jądrze Linuksa podczas zamykania.
Potencjalnie nastąpiła również zmiana łącza do bardziej szczegółowych wyjaśnień.
Odpowiedź może zawierać pytanie, które wywołania systemowe i jakie sygnały jądra są używane?
https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel/reboot.c wydaje się być plikiem używanym w x86 związanym z ponownym uruchomieniem komputera (już blisko zamykania, co?)
może fragment kodu znaleziony tutaj http://lxr.free-electrons.com/source/kernel/reboot.c#L176 może zostać użyty do wyjaśnienia
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 („Wyłączanie \ n”); 184 kmsg_dump (KMSG_DUMP_POWEROFF); 185 machine_power_off (); 186} 187 EXPORT_SYMBOL_GPL (kernel_power_off);
źródło
shutdown(8)
np. Przestarzałej,-n
którą, jak sądzę, w starej dokumentacji uniksowej użyto do przeczytania „ sami zamknij system - rdzeń jest NA OGNIU! ”, Skutecznie zabłąkany przełącznik zabijania systemu, który pozostawiłby / mógłby zostawić kawałki rozrzucone na podłodze (a przynajmniej systemy plików w stanie uszkodzonym) - można sobie wyobrazić, że byłby on używany w systemie typu ramy głównej, w którym ktoś właśnie złapał rękę w wentylator. 🕱Odpowiedzi:
Główne zasoby pozwalające zrozumieć, jak działa jądro Linuksa:
W tym przypadku nie mogę znaleźć niczego istotnego centralnie w dokumentacji lub na LWN, więc LXR jest.
Ostatnią rzeczą, którą robi kod użytkownika, jest wywołanie wywołania
reboot
systemowego . Wymaga 4 argumentów, więc wyszukajSYSCALL_DEFINE4(reboot
na LXR, co prowadzi dokernel/reboot.c
. Po sprawdzeniu uprawnień osoby dzwoniącej oraz argumenty, punkt wejścia syscall nazywa jedną z kilku funkcji:kernel_restart
do restartu,kernel_halt
aby zatrzymał się na napięty pętli,kernel_poweroff
do wyłączenia zasilania systemu,kernel_kexec
aby zastąpić jądro na nową (jeśli jest skompilowany w), lubhibernate
aby zapisać pamięć na dysku przed wyłączeniem.kernel_restart
,kernel_halt
Ikernel_power_off
są dość podobne:reboot_notifier_list
, która jest listą haków, które komponenty jądra mogą zarejestrować, aby wykonać kod po wyłączeniu zasilania. Na tym etapie tylko kilku kierowców musi wykonać kod, głównie stróżów.system_state
zmienną.device_shutdown
aby zwolnić lub wyłączyć wszystkie urządzenia w systemie. Wielu kierowców dołącza do tego etapu.Należy zauważyć, że wszelkie systemy plików, które są nadal montowane w tym momencie, są skutecznie wymontowane. Osoba wywołująca wywołanie systemowe bierze odpowiedzialność za każde czyste odmontowanie.
migrate_to_reboot_cpu
dba o przełączenie na jeden konkretny procesor i zapobiega wysyłaniu kodu przez harmonogram do innych procesorów. Po tym punkcie działa tylko jeden procesor.syscore_shutdown
wywołujeshutdown
metodę zarejestrowanych operacji syscore . Myślę, że chodzi głównie o wyłączenie przerwań; kilka haczyków mashutdown
metodę.machine_restart
,machine_halt
lubmachine_power_off
.Hibernacji kod przechodzi przez następujące etapy:
kernel_restart
,kernel_halt
albokernel_power_off
, albo jakiś specyficzny sposób platforma hibernacji.Innym sposobem zamknięcia systemu jest
machine_emergency_restart
. Jest to wywoływane przez magiczny klucz SysRqB . OKlucz działa inaczej: to nazywakernel_power_off
.System może również zostać wyłączony z powodu paniki , czyli błędu nie do naprawienia. Panikowanie próbuje zarejestrować komunikat, a następnie zrestartować system (poprzez sprzętowy organ nadzorczy lub awaryjny restart).
źródło
syscore_shutdown
(tj. To rozwiązałoby moje inne pytanie unix.stackexchange.com/q/122540/24394 ) . Zarówno krok (1), jak i krok (7) pozwalają zarejestrować rzeczy do wykonania przy wyłączaniu, a nie wiedzieć, co + miałem wrażenie, że na kolejność wykonywania tych wywołań zwrotnych w (1) i (7) nie można wpłynąć! Będę doktorami, o których wspomniałeś, ale jeśli wiesz! dzięki!To tylko częściowa odpowiedź i na pewno zapraszam na inną odpowiedź, która może być bardziej wyczerpująca i jasna.
Treść tej odpowiedzi pochodzi z
kernel/reboot.c
pliku jądra linuksa 3.13 (co może nie być pierwszym przypuszczeniem, ponieważ nazwa nie jest zamknięta. C, ale uruchomiona ponownie. C)W każdym razie mamy w zasadzie trzy funkcje, które szkicują proces wyłączania systemu
void kernel_halt(void)
// która kończy się na systemie w stanie zatrzymaniavoid kernel_power_off(void)
// która kończy się wyłączeniem systemuvoid kernel_restart(char *cmd)
// co kończy system, aby go ponownie uruchomićFunkcje te są bardzo krótkie i dlatego można je tutaj wkleić w całości. Ich kod najlepiej pokazuje, jakie kroki są podejmowane na drodze do zamknięcia w jądrze. (komentarze są przeze mnie i mogą nie być w 100% idealne i poprawne, sprawdź się, aby się upewnić. To prosta próba.
void kernel_halt(void)
cała sprawa jest inicjowana przez
sys_reboot
wywołanie systemowe, które, biorąc pod uwagę, że nie tylko uruchamia się ponownie, ale także zamyka, nie jest bezpośrednią rzeczą do połączenia się z procesem zamykania.źródło