Mam spór z akapitem drugim.
Proces A jest uruchomiony, a następnie przerywany przez przerwanie zegara. Sprzęt zapisuje swoje rejestry (na stosie kernela) i wchodzi do jądra (przejście do trybu jądra).
Nie jestem świadomy systemu, który zapisuje wszystkie rejestry na stosie jądra na przerwaniu. Licznik programu, status procesora i wskaźnik stosu (zakładając, że sprzęt nie ma osobnego wskaźnika stosu trybu jądra). Zwykle procesory zapisują minimum potrzebne na stosie jądra po przerwaniu. Program obsługi przerwań zapisze wszystkie dodatkowe rejestry, których chce użyć i przywróci je przed wyjściem. Instrukcja RETURN FROM INTERRUPT lub EXCEPTION procesora przywraca rejestry automatycznie zapisane przez przerwanie.
Ten opis nie zakłada żadnych zmian w procesie.
Jeśli uchwyt przerwań zdecyduje się na zmianę procesu, zapisuje bieżący stan rejestru ("kontekst procesu" - większość procesorów ma do tego jedną instrukcję: w firmie Intel może być konieczne użycie wielu instrukcji), a następnie wykonuje kolejna instrukcja ładowania kontekstu procesu nowego procesu.
Aby odpowiedzieć na pytanie dotyczące nagłówka "Do czego służy stos jądra?", Jest on używany, gdy procesor jest w trybie jądra. Jeśli jądro nie ma stosu chronionego przed dostępem użytkownika, integralność systemu może zostać naruszona. Stos jądra jest bardzo mały.
Aby odpowiedzieć Państwu na drugie pytanie: "Jaki dokładnie jest punkt zapisywania rejestrów zarówno do stosu jądra, jak i struktury procesu i dlaczego potrzeba ich obu?"
Służą w dwóch różnych celach. Zapisane rejestry na stosie jądra służą do opuszczenia trybu jądra. Blok procesu kontekstowego zapisuje cały zestaw rejestrów w celu zmiany procesów.
Myślę, że twoje nieporozumienie pochodzi od słowa źródła, które sugeruje, że wszystkie rejestry są przechowywane na stosie podczas wchodzenia w tryb jądra, a nie tylko minimalna liczba rejestrów potrzebnych do przełączenia trybu jądra. System zwykle zapisuje tylko to, czego potrzebuje, aby powrócić do trybu użytkownika (i może użyć tych samych informacji, aby powrócić do pierwotnego procesu w innym przełączniku kontekstu, w zależności od systemu). Zmiana w kontekście procesu zapisuje wszystkie rejestry.
edycje odpowiedzieć na dodatkowe pytania:
Jeśli obsługi przerwań musi użyć rejestrze nie zapisywane przez CPU automatycznie przez przerwanie, to wypycha je na stosie jądra na wejściu i wyskakuje je na wyjeździe. Program obsługi przerwań musi jawnie zapisywać i przywracać dowolne rejestry [ogólne], których używa. Blok kontekstu procesu nie jest do tego dotykany.
Blok kontekstu procesu zmienia się tylko jako część faktycznego przełącznika kontekstu.
Przykład:
Załóżmy mamy procesor z licznikiem rozkazów, wskaźnik stosu, stan procesora i 16 rejestrów ogólnych (znam taki system rzeczywiście istnieje) i że ten sam SP jest stosowany we wszystkich trybach.
- Przerwa występuje.
Sprzęt popycha PC, SP i PS na stos, ładuje SP z adresem stosu trybów jądra i komputer z obsługi przerwań (z tablicy wysyłkowej procesora).
- Zostaje wywołana obsługa przerwań.
Pisarz przewodnika decyduje, że idzie do nas R0-R3. Więc pierwsze linie obsługi mają:
Push R0 ; on to the kernel mode stack
Push R1
Push R2
Push R3
obsługi przerwań robi, co chce zrobić.
Cleanup
Pisarz z obsługi przerwań musi zrobić:
Pop R3
Pop R2
Pop R1
Pop R0
REI ; Whatever the system's return from interrupt or exception instruction is.
- Hardware Przejmuje
Przywraca PS, PC i SP ze stosu trybów jądra, a następnie wznawia wykonywanie tam, gdzie było przed przerwaniem.
Zrobiłem mój własny procesor dla uproszczenia. Niektóre procesory mają długie instrukcje, które są przerywane (np. Ruchy bloków). Takie instrukcje często wykorzystują rejestry do zachowania ich kontekstu. W takim systemie procesor musiałby automatycznie zapisywać wszystkie rejestry, aby zachować kontekst w instrukcji.
Obsługa przerwania nie fuck z bloku kontekstu procesu, chyba że zmienia procesy.
[więc] nie jest dobrą stroną do nauki wewnętrznych systemów operacyjnych. –
Concept! = Reality. Jądro przełącza się na własny stos, aby nie nakładać własnych wymagań dotyczących wewnętrznego stosu na stos każdego wątku, którym zarządza. Stos jądra w każdym razie nie jest miejscem do przechowywania danych kontekstu wątku, takich jak rejestry GP - musi istnieć osobna struktura przechowująca kontekst dla każdego wątku. Typowy kontekst stosu jest znacznie większy niż tylko rejestry GP i/lub wskaźnik stosu dla przerwanego wątku. –