Segment stanu zadania - Task state segment
Segment stan zadanie ( TSS ) jest strukturą na x86 komputerów opartych o który posiada informacje o zadaniu . Jest używany przez jądro systemu operacyjnego do zarządzania zadaniami. W szczególności w TSS przechowywane są następujące informacje:
- Stan rejestru procesora
- Uprawnienia do portów we / wy
- Wskaźniki stosu na poziomie wewnętrznym
- Poprzedni link do TSS
Wszystkie te informacje powinny być przechowywane w określonych miejscach w TSS, zgodnie z instrukcją IA-32 .
Lokalizacja TSS
TSS może znajdować się w dowolnym miejscu pamięci . Rejestr segmentowy zwany rejestrem zadań (TR) zawiera selektor segmentu, który wskazuje prawidłowy deskryptor segmentu TSS, który znajduje się w GDT ( deskryptor TSS nie może znajdować się w LDT ). Dlatego, aby skorzystać z TSS, jądro systemu operacyjnego musi wykonać następujące czynności:
- Utwórz wpis deskryptora TSS w GDT
- Załaduj TR z selektorem segmentu dla tego segmentu
- W razie potrzeby dodaj informacje do TSS w pamięci
Ze względów bezpieczeństwa TSS powinien być umieszczony w pamięci dostępnej tylko dla jądra .
Rejestr zadań
Rejestr TR jest 16-bitowym rejestrem, który zawiera selektor segmentu dla TSS. Można go załadować za pomocą instrukcji LTR . LTR jest uprzywilejowaną instrukcją i działa w sposób podobny do innych ładowań rejestrów segmentowych. Rejestr zadań składa się z dwóch części: części widocznej i dostępnej dla programisty oraz niewidocznej, która jest automatycznie ładowana z deskryptora TSS.
Zarejestruj stany
TSS może zawierać zapisane wartości wszystkich rejestrów x86 . Służy do przełączania zadań . System operacyjny może załadować TSS wartościami rejestrów, których potrzebuje nowe zadanie i po wykonaniu sprzętowego przełącznika zadań (np. Instrukcją IRET ) CPU x86 załaduje zapisane wartości z TSS do odpowiednich rejestrów. Należy zauważyć, że niektóre nowoczesne systemy operacyjne, takie jak Windows i Linux , nie używają tych pól w TSS, ponieważ implementują przełączanie zadań oprogramowania.
Należy zauważyć, że podczas przełączania zadań sprzętowych, niektóre pola starego TSS są aktualizowane z aktualną zawartością rejestru CPU przed odczytaniem wartości z nowego TSS. Dlatego niektóre pola TSS są przeznaczone do odczytu / zapisu, podczas gdy inne są tylko do odczytu:
-
Pola do odczytu / zapisu : odczyt i zapis podczas przełączania zadań sprzętowych.
- Wszystkie rejestry ogólnego przeznaczenia (
EAX
,EBX
,ECX
,EDX
,ESI
,EDI
,EBP
,ESP
); - Wszystkie rejestry segmentu (
CS
,DS
,ES
,FS
,GS
,SS
); - Bieżący stan wykonania (
EIP
,EFlags
); Link
Pola w nowym TSS, jeśli przełącznik zadaniem było spowodowaneCALL
lubINT
zamiastJMP
.
- Wszystkie rejestry ogólnego przeznaczenia (
-
Pola tylko do odczytu: do odczytu tylko wtedy, gdy jest to wymagane, jak wskazano.
- Rejestr kontrolny 3 (
CR3
), znany również jako rejestr podstawowy katalogu stron (PDBR
).- Odczyt podczas przełączania zadań sprzętowych.
- Tablica deskryptorów lokalnych register (
LDTR
);- Odczyt podczas przełączania zadań sprzętowych.
- Te trzy pary przywileje poziomu stosu (
SS0:ESP0
,SS1:ESP1
,SS2:ESP2
);- Przeczytaj podczas międzypoziomowego
CALL
lub wINT
celu ustanowienia nowego stosu.
- Przeczytaj podczas międzypoziomowego
- Wskaźnik mapy bitowej portu
IOPB
we / wy ( ) i sama mapa bitowa portu we / wy;- Czytaj podczas
IN
,OUT
,INS
lubOUTS
instrukcji jeśliCPL > IOPL
by potwierdzić instrukcja jest legalne (patrz I / O uprawnienia portów poniżej).
- Czytaj podczas
- Rejestr kontrolny 3 (
To PDBR
pole jest w rzeczywistości pierwszym odczytem z nowego TSS: ponieważ przełącznik zadań sprzętowych może również przełączyć się na zupełnie inne mapowanie tabeli stron, wszystkie inne pola (zwłaszcza LDTR
) odnoszą się do nowego mapowania.
Uprawnienia do portów we / wy
TSS zawiera 16-bitowy wskaźnik do mapy bitowej uprawnień portu we / wy dla bieżącego zadania . Ta mapa bitowa, zwykle ustawiana przez system operacyjny podczas uruchamiania zadania, określa poszczególne porty, do których program powinien mieć dostęp. Mapa bitowa I / O to tablica bitowa uprawnień dostępu do portów; jeśli program ma pozwolenie na dostęp do portu, „0” jest przechowywane w odpowiednim indeksie bitowym, a jeśli program nie ma pozwolenia, „1” jest tam zapisywane. Jeśli limit segmentu TSS jest mniejszy niż pełna bitmapa, przyjmuje się, że wszystkie brakujące bity mają wartość „1”.
Funkcja działa w następujący sposób: kiedy program wydaje instrukcję portu we / wy x86, taką jak IN lub OUT (zobacz listę instrukcji x86 - i zauważ, że istnieją wersje o długości bajtów, słów i dwordów), sprzęt wykona Poziom uprawnień we / wy (IOPL) sprawdź, czy program ma dostęp do wszystkich portów we / wy. Jeśli bieżący poziom uprawnień (CPL) programu jest liczbowo większy niż poziom uprawnień we / wy (IOPL) (program jest mniej uprzywilejowany niż ten określony w IOPL), program nie ma dostępu do wszystkich portów we / wy porty. Sprzęt sprawdzi następnie mapę bitową uprawnień we / wy w TSS, aby sprawdzić, czy program ten może uzyskać dostęp do określonego portu (portów) w instrukcji IN lub OUT. Jeśli (wszystkie) odpowiednie bity w mapie bitowej uprawnień portu we / wy są czyste, program ma dostęp do portu (portów) i zezwala się na wykonanie instrukcji. Jeśli (którykolwiek z) odpowiednich bitów jest / są ustawione - lub jeśli (którykolwiek z) bitów przekracza limit segmentu TSS - program nie ma dostępu, a procesor generuje ogólne zabezpieczenie wina . Ta funkcja umożliwia systemom operacyjnym przyznawanie selektywnego dostępu do portów programom użytkownika.
Wskaźniki stosu na poziomie wewnętrznym
TSS zawiera 6 pól do określenia nowego wskaźnika stosu, gdy nastąpi zmiana poziomu uprawnień. Pole SS0 zawiera selektor segmentu stosu dla CPL = 0, a pole ESP0 / RSP0 zawiera nową wartość ESP / RSP dla CPL = 0. Kiedy przerwanie występuje w trybie chronionym (32-bitowym), procesor x86 będzie szukał w TSS SS0 i ESP0 i załaduje ich wartości odpowiednio do SS i ESP. Dzięki temu jądro może używać innego stosu niż program użytkownika, a także ten stos jest unikalny dla każdego programu użytkownika.
Nowa funkcja wprowadzona w rozszerzeniach AMD64 nosi nazwę Interrupt Stack Table (IST), która również znajduje się w TSS i zawiera logiczne (segment + przesunięcie) wskaźniki stosu. Jeśli tablica deskryptorów przerwań określa wpis IST do użycia (jest ich 8), procesor zamiast tego załaduje nowy stos z IST. Pozwala to na użycie znanych dobrych stosów w przypadku poważnych błędów ( na przykład NMI lub podwójny błąd ). Wcześniej wpis dotyczący wyjątku lub przerwania w IDT wskazywał na bramę zadań, powodując przełączenie procesora do zadania wskazywanego przez bramę zadań. Oryginalne wartości rejestrów zostały zapisane w prądzie TSS w momencie wystąpienia przerwania lub wyjątku. Procesor następnie ustawił rejestry, w tym SS: ESP, na znaną wartość określoną w TSS i zapisał selektor do poprzedniego TSS. Problem polega na tym, że przełączanie zadań sprzętowych nie jest obsługiwane na AMD64.
Poprzedni link do TSS
Jest to selektor 16-bitowy, który umożliwia połączenie tego TSS z poprzednim. Służy tylko do przełączania zadań sprzętowych. Szczegółowe informacje można znaleźć w podręcznikach IA-32 .
Zastosowanie TSS w systemie Linux
Chociaż TSS można utworzyć dla każdego zadania uruchomionego na komputerze, jądro Linuksa tworzy tylko jeden TSS dla każdego procesora i używa ich do wszystkich zadań. Wybrano to podejście, ponieważ zapewnia łatwiejszą przenośność na inne architektury (na przykład architektura AMD64 nie obsługuje sprzętowych przełączników zadań) oraz poprawia wydajność i elastyczność. Linux używa tylko bitmapy uprawnień portu I / O i funkcji stosu wewnętrznego TSS; inne funkcje są potrzebne tylko do przełączania zadań sprzętowych, których jądro Linuksa nie używa.
Wektor wyjątków x86 10 jest nazywany nieprawidłowym wyjątkiem TSS (#TS). Jest wydawany przez procesor za każdym razem, gdy coś pójdzie nie tak z dostępem TSS. Na przykład, jeśli przerwanie ma miejsce w CPL = 3 i przekazuje sterowanie do CPL = 0, TSS jest używany do wyodrębnienia SS0 i ESP0 / RSP0 dla przełącznika stosu. Jeśli rejestr zadań zawiera zły selektor TSS, zostanie wygenerowany błąd #TS. Wyjątek Nieprawidłowy TSS nigdy nie powinien wystąpić podczas normalnego działania systemu operacyjnego i zawsze jest związany z błędami jądra lub awarią sprzętu.
Więcej szczegółów na temat wyjątków TSS znajduje się w tomie 3a, rozdziale 6 podręcznika IA-32 .
TSS w trybie x86-64
X86-64 architektura nie obsługuje przełączniki zadaniowych sprzętu. Jednak TSS może być nadal używany na komputerze działającym w 64-bitowych trybach rozszerzonych. W tych trybach TSS jest nadal przydatny, ponieważ przechowuje:
- Adresy wskaźników stosu dla każdego poziomu uprawnień.
- Adresy wskaźników dla tabeli stosu przerwań (powyższa sekcja wskaźnika stosu wewnętrznego poziomu omawia potrzebę tego).
- Przesunięcie adresu mapy bitowej uprawnień we / wy.
Ponadto rejestr zadań jest rozszerzany w tych trybach, aby mógł przechowywać 64-bitowy adres bazowy.