Task State Segment
# Task State Segment

Uno Task state segment (TSS) è una struttura specifica dei processori della famiglia x86 dove si trova memorizzato il contesto di un processo. Il suo descrittore si trova nella Global Descriptor Table (GDT).

In quanto segmenti, i segmenti di stato sono referenziati da descrittori di stato di processo (task state segment descriptor) (TSSD) situati nella GDT.

## Struttura di un TSS

Il TSS contiene vari tipi di informazioni:

* I registri generali EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
* I registri di segmento CS, ES, SS, DS, FS, GS
* Il registro EFLAGS
* Il registro EIP
* Il registro CR3
* Il registro LDTR
* I selettori del TSS del processo che era precedentemente eseguito
* L'I/O map base address e l'I/O map
* I puntatori agli stack dei livelli di privilegio 0,1,2

| offset | 31-16 | 15-0 |
| - | - | - |
| 0x64 | IOPB offset | riservato |
| 0x60 | riservato | LDTR |
| 0x5C | riservato | GS |
| 0x58 | riservato | FS |
| 0x54 | riservato | DS |
| 0x50 | riservato | SS |
| 0x4C | riservato | CS |
| 0x48 | riservato | ES |
| 0x44 | EDI | EDI |
| 0x40 | ESI | ESI |
| 0x3C | EBP | EBP |
| 0x38 | ESP | ESP |
| 0x34 | EBX | EBX |
| 0x30 | EDX | EDX |
| 0x2C | ECX | ECX |
| 0x28 | EAX | EAX |
| 0x24 | EFLAGS | EFLAGS |
| 0x20 | EIP | EIP |
| 0x1C | CR3 | CR3 |
| 0x18 | riservato | SS2 |
| 0x14 | ESP2 | ESP2 |
| 0x0C | riservato | SS1 |
| 0x10 | ESP1 | ESP1 |
| 0x08 | riservato | SS0 |
| 0x04 | ESP0 | ESP0 |
| 0x00 | riservato | LINK |

## Utilizzo

### Linux

Sotto Linux, a ogni commutazione di contesto, il kernel (grazie alla macro "SWITCH_TO") aggiorna il TSS con le informazioni (registri generali, EIP, EFLAGS, ecc) del nuovo processo.

Il TSS è utilizzato tra l'altro dal kernel per ritornare da una chiamata di sistema o per la gestione dell'eccezione "errore doppio" (il processore, non potendo fare affidamento sui suoi registri, usa il TSS).

## TSS nell'architettura x86-64

L'architettura x86-64 non supporta il cambio di contesto hardware, tuttavia il TSS può essere ancora utilizzato in una macchina utilizzante la modalità a 64 bit. In questa modalita il TSS viene utilizzato per memorizzare:

* Lo stack pointer per ogni livello di privilegio.
* L'indirizzo del puntatore all' Interrupt Stack Table
* Offset della bitmap dei permessi IO

Il task register viene espanso per contenere indirizzi a 64 bit.

