Wewnętrzne przełączniki kontekstowe
Chcę się nauczyć i wypełnić luki w mojej wiedzy za pomocą tego pytania.
Użytkownik uruchamia wątek (poziom jądra) i teraz dzwoniyield
(zakładam, że wywołanie systemowe). Program planujący musi teraz zapisać kontekst bieżącego wątku w TCB (który jest gdzieś przechowywany w jądrze) i wybrać inny wątek do uruchomienia oraz wczytać jego kontekst i przejść do jegoCS:EIP
. Aby zawęzić sprawę, pracuję nad Linuksem działającym na architekturze x86. Teraz chcę poznać szczegóły:
Więc najpierw mamy wywołanie systemowe:
1) Funkcja owijania dlayield
wypchnie argumenty wywołania systemowego na stos. Naciśnij adres zwrotny i podnieś przerwanie, naciskając numer wywołania systemowego na jakiś rejestr (powiedzmyEAX
).
2) Przerwanie zmienia tryb CPU z użytkownika na jądro i przeskakuje do tabeli wektorów przerwań, a stamtąd do rzeczywistego wywołania systemowego w jądrze.
3) Domyślam się, że program planujący zostanie wywołany teraz i teraz musi zapisać bieżący stan w TCB. Oto mój dylemat. Ponieważ program planujący użyje stosu jądra, a nie stosu użytkownika do wykonania swojej operacji (co oznaczaSS
iSP
należy zmienić) w jaki sposób przechowuje stan użytkownika bez modyfikowania jakichkolwiek rejestrów w procesie. Przeczytałem na forach, że istnieją specjalne instrukcje sprzętowe do zapisywania stanu, ale w jaki sposób program planujący uzyskuje dostęp do nich i kto uruchamia te instrukcje i kiedy?
4) Program planujący zapisuje stan do TCB i ładuje inny TCB.
5) Gdy program planujący uruchamia oryginalny wątek, formant powraca do funkcji opakowywania, która czyści stos i wątek wznawia działanie.
Pytania dodatkowe: Czy program planujący działa jako wątek tylko jądra (tzn. Wątek, który może uruchamiać tylko kod jądra)? Czy istnieje osobny stos jądra dla każdego wątku jądra lub każdego procesu?