2015-05-24 19 views
6

Poniżej przedstawiono opis odczytu kontekstowego przełącznika między procesem A i procesem B. Nie rozumiem, do czego służy stos jądra. Przypuszcza się, że ma to być jeden stos procesowy jądra. Opis, który czytam, mówi o zapisywaniu rejestrów A na stosie jądra A, a także zapisuje rejestry A do struktury procesu A. Jaki dokładnie jest punkt zapisywania rejestrów zarówno do stosu jądra, jak i struktury procesu i dlaczego potrzeba obu?Do czego służy stos kernela?

Przełącznik kontekst jest koncepcyjnie prosta: cały system operacyjny musi zrobić, to zapisać kilka wartości rejestrów dla procesu aktualnie wykonującego (na stosie jądra , na przykład) i przywrócić kilka dla wkrótce do wykonania (z jego stosu jądra). Robiąc tak, to OS gwarantuje w ten sposób, że gdy rozkaz powrotu z-pułapki jest wreszcie wykonany, zamiast zwrócić się do procesu, który został uruchomiony, System wznawia wykonanie innego procesu ...

Process A jest uruchomiony, a następnie przerywany przez przerwanie zegara. Sprzęt zapisuje swoje rejestry (na stosie kernela) i wchodzi do jądra (przełączanie do trybu jądra). W przerywniku obsługi zegara, , system operacyjny decyduje się na przejście z procesu A do procesu B. W tym punkcie wywołuje procedurę switch(), która ostrożnie zapisuje bieżące wartości rejestru (w strukturze procesowej A), przywraca rejestry procesu B (z jego wpisu struktury procesu), a następnie przełącza konteksty, w szczególności zmieniając wskaźnik stosu, aby użyć stosu jądra B (a nie A) na B. Ostatecznie system operacyjny zwraca-od-pułapki, , który przywraca rejestry B i uruchamia je.

+0

[więc] nie jest dobrą stroną do nauki wewnętrznych systemów operacyjnych. –

+1

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. –

Odpowiedz

4

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.

  1. 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).

  1. 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 
  1. obsługi przerwań robi, co chce zrobić.

  2. 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. 
  1. 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.

+0

Zgadzam się z tobą, ja też mam spór z drugim akapitem. W każdym razie +1. –

+0

Jeśli procedura obsługi przerwań zapisuje dodatkowe rejestry, których chce użyć, to gdzie je zapisuje? Czy umieszcza je w bloku kontrolnym procesu? A instrukcja return z instrukcji przerwania odtwarza te rejestry, w jaki sposób instrukcja return z instrukcji przerwania wie, jak przywrócić te rejestry? Czy rozumie format bloku sterowania procesem i przywraca z niego rejestry? – user782220

+0

zobacz moje zmiany powyżej. – user3344003

-1

Trudno mówić ogólnie o tym, jak OS działa "pod maską", ponieważ zależy to od działania sprzętu. Ponadto terminologia nie jest wysoce ustandaryzowana.

Zgaduję, że przez "Wpis struktury procesu" pisarz oznacza to, co jest powszechnie znane jako "kontekst" procesu i który zawiera kopię każdego rejestru. Kod przerwań nie pozwala na natychmiastowe zapisywanie rejestrów w tej strukturze, ponieważ musiałby w tym celu wykorzystywać (i modyfikować) rejestry. Dlatego musi zapisać kilka rejestrów na tyle, aby mógł wykonać pracę, gdzieś od razu dostępny, np. gdzie wskazuje wskaźnik stosu, który autor nazywa "stosem jądra".

W zależności od architektury może to być jeden stos lub oddzielne dla każdego procesu.

+1

Nie masz wyboru, aby zgadywać tutaj. Proszę poprosić o więcej wyjaśnień do OP, jeśli masz jakiekolwiek wątpliwości. Albo bądź pewny, albo nie odpowiadaj w ogóle. –