Mikroinformatyka Wielozadaniowość
Zadanie Tryb chroniony przynajmniej jedno zadanie (task). Segment stanu zadania TSS (Task State Segment). Przestrzeń zadania (Execution Space). - segment kodu, - segment danych (kilka), - segment stosu (dla każdego poziomu). Selektor segmentu TSS identyfikuje zadanie. Przy uruchamianiu lub zmianie zadania: - selektor TSS ładowany do TR, - jeśli włączone stronicowanie uaktualniany jest PDBR (CR3).
Stan rejestru zadania TR. Elementy dynamiczne w TSS: Stan zadania Przestrzeń zadania selektory CS, DS, ES, FS, GS, SS. Stan rejestrów ogólnego przeznaczenia. Stan rejestru znaczników. Stan wskaźnika rozkazów. Łącze do poprzedniego zadania jego selektor TSS. Elementy statyczne w TSS: Stan rejestru CR3. Stan rejestru LDTR. Adres bazowy mapy I/O. Mapa I/O. Wskaźnik stosu dla poziomów uprzywilejowania 0, 1 i 2. Pułapka uruchomieniowa bit T.
Segment Stanu Zadania TSS
Wywołanie zadania Wywołanie: Skok JMP. Wywołanie podprogramu CALL. Przerwanie INT. Wyjątek. Powrót z przerwania IRET (przy ustawionym znaczniku NT). Identyfikacja zadania selektor bramki zadania lub TSS. Przerwania i wyjątki bramka z selektorem zadania w IDT. Przełączanie zadań: Zachowanie stanu aktualnie wykonywanego zadania uaktualniane dynamiczne pola TSS. Zawieszenie zadania. Załadowanie kontekstu uruchamianego zadania z TSS. Zadania nie mogą być wywoływane rekursywnie.
Deskryptor segmentu TSS Przechowywane wyłącznie w GDT. Gdy G=0, rozmiar >= 67h. DPL powinien być < 3 (tylko system może przełączać zadania). Jedno zadanie jeden segment TSS i jeden deskryptor TSS. B znacznik zajętości zadania: - CALL lub INT pozostawia B, - JMP lub IRET zeruje B.
Selektor TSS Operacje na selektorze TSS Instrukcja LTR - ładowanie selektora TSS do TR (poziom 0). Instrukcja STR - zapisanie selektora TSS z TR do pamięci. TR ma część widoczną selektor i niewidoczną deskryptor. Deskryptor ładowany automatycznie. Błędy przy operacjach na selektorze i deskryptorze TSS: Próba załadowania selektora TSS do rejestru segmentowego - #GP. Wybór LDT przy JMP lub CALL - #GP. Wybór LDT przy IRET - #TS (Invalid TSS). Przełączenie do segmentu, którego LIMIT < 67h - #TS.
Deskryptor bramki zadania Może być umieszczony w GDT, LDT, IDT. Jedno zadanie może mieć wiele bramek na różnych poziomach. Zawiera selektor deskryptora segmentu TSS w tablicy GDT. CPL procesu wywołującego oraz RPL selektora wskazującego bramkę musi być mniejsze lub równe polu DPL deskryptora bramki. Nie jest brany pod uwagę DPL w deskryptorze segmentu TSS wywoływanego zadania.
Przełączanie zadań Pzełączanie zadań (Task Switching) zachodzi w następujących przypadkach: CALL lub JMP z selektorem TSS w tablicy GDT. CALL lub JMP z selektorem bramki w GDT lub LDT. Przerwanie lub wyjątek z selektorem bramki w IDT. Powrót z zagnieżdżonego zadania (NT=1) przez IRET.
Przełączanie zadań Kroki przy przełączaniu zadań: 1. Pobranie selektora segmentu TSS z: - argumentu instrukcji JMP lub CALL, - selektora w bramce wskazywanej przez JMP lub CALL, - pola poprzedniego zadania z aktualnego TSS przy IRET. 2. Sprawdzenie poprawności przełączenia: - JMP i CALL sprawdzenie przywilejów (jak dla danych aktualny CPL i RPL <= DPL nowego TSS lub bramki), - INT n sprawdzany jest DPL, - przerwania sprzętowe, wyjątki, IRET nie sprawdzane przywileje. 3. Sprawdzenie deskryptora TSS: - rozmiar TSS (LIMIT >=67h), - czy jest zaznaczony jako obecny (P).
Przełączanie zadań 4. Sprawdzenie znacznika BUSY: - 0 dla JMP lub CALL, przerwania i wyjątku, - 1 dla IRET. 5. Sprawdzenie czy aktualny TSS, nowy TSS i wszystkie deskryptory są w pamięci. 6. Znacznik B w aktualnym deskryptorze TSS: - jest zarowany przy JMP lub IRET, - ustawiany przy CALL, przerwaniu i wyjątku. 7. Znacznik NT w zachowywanym EFLAGS: - zerowany przy IRET, - nie zmieniany przy CALL, JMP, przerwaniu i wyjątku. 8. Zachowanie stanu zadania w jego segmencie TSS wskazywanym przez TR.
Przełączanie zadań 9. Jeśli przełączenie było wywołanie: - CALL, przerwaniem lub wyjątkiem znacznik NT zostaje ustawiony w EFLAGS załadowanym dla nowego zadania, - JMP lub IRET NT pozostaje niezmienione. 10. Jeśli przełączenie było wywołanie: - JMP, CALL, przerwaniem lub wyjątkiem znacznik B w deskryptorze TSS zostaje ustawiony, - IRET nie zmienia B. 11. Ładuje TR selektorem nowego segmentu TSS. 12. Stan z TSS nowego zadania jest ładowany do procesora. 13. Załadowanie deskryptorów segmentów nowego zadania. 14. Uruchomienie nowego zadania.
Przełączanie zadań Błędy na etapach 1 11: Pozostanie przy poprzednim zadaniu. Błędy na etapach 13 14: Wyjątek w kontekście nowego zadania. Błąd na etapie punktu 12 (przeładowanie rejestrów): Błąd krytyczny bez możliwości obsługi.