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?

questionAnswers(3)

yourAnswerToTheQuestion