Seitenleiste

Infodatenbank

Tutorial

Community

Das Task State Segment (TSS)

Zweck des TSS

Das TSS dient zum Speichern von Informationen, die sich auf einen Task beziehen. Es wird zum Multitasking verwendet. Vorrangig für das hardwarebasierte Multitasking, wobei auch beim softwarebasierten Multitasking mindestens ein TSS nötig ist.

Aufbau des TSS

Das TSS enthält Informationen über einen Task. Zu diesen Informationen gehören unter anderem…

Um sich das Ganze bildlich besser vorstellen zu können:

tss_aufbau_intel.jpg

Als C-Struct könnte man das folgendermaßen umsetzen:

struct TSS_entry {
    unsigned short prev_tss;
    unsigned short prev_tss_RESERVED;
    unsigned int esp0;
    unsigned short ss0;
    unsigned short ss0_RESERVED;
    unsigned int esp1;
    unsigned short ss1;
    unsigned short ss1_RESERVED;
    unsigned int esp2;
    unsigned short ss2;
    unsigned short ss2_RESERVED;
    unsigned int cr3;
    unsigned int eip;
    unsigned int eflags;
    unsigned int eax;
    unsigned int ecx;
    unsigned int edx;
    unsigned int ebx;
    unsigned int esp;
    unsigned int ebp;
    unsigned int esi;
    unsigned int edi;
    unsigned short es;
    unsigned short es_RESERVED;
    unsigned short cs;
    unsigned short cs_RESERVED;
    unsigned short ss;
    unsigned short ss_RESERVED;
    unsigned short ds;
    unsigned short ds_RESERVED;
    unsigned short fs;
    unsigned short fs_RESERVED;
    unsigned short gs;
    unsigned short gs_RESERVED;
    unsigned short ldt;
    unsigned short ldt_RESERVED;
    unsigned short trap_and_RESERVED;
    unsigned short io_map_base;
} __attribute__((packed));

Erklärung der einzelnen Daten

*_RESERVED

Alle so gekennzeichneten Einträge sind reserviert und **müssen* auf 0 gelassen bzw. initialisiert werden. Einzige Ausnahme hierbei ist der Eintrag trap_and_RESERVED. Das niedrigste Bit (Bit 0) kann hierbei beschrieben werden.

Es ist der sogenannte Debug Trap Eintrag (Byte 100, Bit0). Ist dieses Bit gesetzt, wird bei einem Taskwechsel zu dem Task mit diesem TSS vom Prozessor eine Debug Exception ausgelöst.

prev_tss

Dieser Eintrag wird als Zeiger auf ein anderes TSS interpretiert. Beim hardwarebasierten Multitasking wird hiermit eine verlinkte Liste von Tasks erstellt. Beim softwarebasierten Multitasking kann dieses Feld leer gelassen werden.

esp0

Dieser Wert wird in den Stackzeiger (esp) geladen, wenn bei einem Interrupt oder bei einer Exception ein Wechsel in Ring 0 vorgenommen werden muss. In solche einem Fall wechselt der Prozessor automatisch auf diesen Stack (setzt esp auf diesen Wert) und pusht darauf Interrupt/Exceptionspezifische Informationen.

ss0

Wie esp0, nur das hier bei einem Wechsel nach Ring 0 das Stacksegment für Ring 0 angegeben sein muss.

esp1, ss1

Das Gleiche wie bei den beiden eben genannten Felder gilt auch hier, allerdings werden diese Felder bei einem Wechsel zu Ring 1 geladen.

esp2, ss2

Bei einem Wechsel zu Ring 2. Einzelheiten siehe Feld esp0 bzw. ss0.

cr3

Bei hardwarebasiertem Multitasking: Dieses Feld enthält den Wert, der bei bei einem Wechsel zu dem Task, dem das TSS „gehört“ in das CR3 Register geladen wird. Es stellt also die Adresse des Page Directories vom jeweiligen Task dar.

Bei softwarebasiertem Taskswitching spielt dieses Feld meist keine Rolle bzw. kann für beliebige Zwecke verwendet werden.

eip

Dieses Feld spielt beim softwarebasiertem Taskswitching keine Rolle bzw. kann beliebig verwendet werden.

Beim hardwarebasierten Multitasking wird in diesem Feld der Instruction Pointer und damit die aktuelle Position im Programm gespeichert.

eflags

Beim softwarebasierten Taskswitching spielt dieses Feld keine Rolle.

Ansonsten steht hier der Wert, der bei einem Wechsel zu diesem Task ins EFLAGS-Register geladen wird.

eax, ecx, edx, ebx, esp, ebp, esi, edi

Bei softwarebasiertem Taskswitching sind diese Felder ohne Bedeutung und können beliebig verwendet werden.

Wird hardwarebasiertes Multitasking verwendet, so werden bei einem Wechsel zu diesem Task die Werte aus den genannten Feldern in die entsprechenden CPU-Register geladen.

1)

1)
wird weitergeschrieben