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:

  1. Utwórz wpis deskryptora TSS w GDT
  2. Załaduj TR z selektorem segmentu dla tego segmentu
  3. 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);
    • LinkPola w nowym TSS, jeśli przełącznik zadaniem było spowodowane CALLlub INTzamiast JMP.
  • 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 CALLlub w INTcelu ustanowienia nowego stosu.
    • Wskaźnik mapy bitowej portu IOPBwe / wy ( ) i sama mapa bitowa portu we / wy;
      Czytaj podczas IN, OUT, INSlub OUTSinstrukcji jeśli CPL > IOPLby potwierdzić instrukcja jest legalne (patrz I / O uprawnienia portów poniżej).

To PDBRpole 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.

Wyjątki związane z TSS

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:

  1. Adresy wskaźników stosu dla każdego poziomu uprawnień.
  2. Adresy wskaźników dla tabeli stosu przerwań (powyższa sekcja wskaźnika stosu wewnętrznego poziomu omawia potrzebę tego).
  3. Przesunięcie adresu mapy bitowej uprawnień we / wy.

Ponadto rejestr zadań jest rozszerzany w tych trybach, aby mógł przechowywać 64-bitowy adres bazowy.

Bibliografia

Linki zewnętrzne