title: Task State Segment
text: # 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.
  
  