Task State Segment
Aus Lowlevel
Version vom 18. August 2008, 15:19 Uhr von Jgraef (Diskussion | Beiträge) (Damit mal die blöde Weiterleitung weg ist. Der TSS-Deskriptor gehört aber eher zur GDT oder in einen eigenen Artikel.)
Das TaskStateSegment (kurz TSS) wird von der CPU benötigt um bei einen Ringwechsel den richtigen Stack zu laden. Man kann das TSS auch benutzen um Hardware-Multitasking zu realisieren. Dafür wird der TSS-Deskriptor mit einem Longjump angesprungen. Dabei werden auch andere Register (wie EIP) geladen. Um ein TSS für den Ringwechsel benutzen zu können, muss es vorher mit ltr <Selektor> geladen werden.
Aufbau - TaskStateSegment
| Offset | 31-16 | 0-15 |
|---|---|---|
| 0x00 | Previous Task Link | |
| 0x04 | ESP0 | |
| 0x08 | SS0 | |
| 0x0C | ESP1 | |
| 0x10 | SS1 | |
| 0x14 | ESP2 | |
| 0x18 | SS2 | |
| 0x1C | CR3 | |
| 0x20 | EIP | |
| 0x24 | EFLAGS | |
| 0x28 | EAX | |
| 0x2C | ECX | |
| 0x30 | EDX | |
| 0x34 | EBX | |
| 0x38 | ESP | |
| 0x3C | EBP | |
| 0x40 | ESI | |
| 0x44 | EDI | |
| 0x48 | ES | |
| 0x4C | CS | |
| 0x50 | SS | |
| 0x54 | DS | |
| 0x58 | FS | |
| 0x5C | GS | |
| 0x60 | LDT Segment Selektor | |
| 0x64 | I/O Map Base Address | |
Aufbau - TSS-Deskriptor
| 31 - 24 | 23 | 21 - 22 | 20 | 19 - 16 | 15 | 13 - 14 | 12 | 11 - 8 | 0 - 7 |
| Basisadresse 31-24 | G | 0 | AVL | Größe 19-16 | P | DPL | 0 | Type | Basisadresse 16-23 |
| 31 - 24 | 16 - 0 |
| Basisadresse 15 - 0 | Größe 15 - 0 |
Type = Deskriptor Typ
Hier muß als Wert 1001b eingetragen werden. Die hintere Null wird zusätzlich als Busy-Flag verwendet. Dies wir auf 1 gesetzt, sobald der Task in das System geladen ist und gestartet wurde. Tasks sind nicht redundant. Das heißt sie dürfen sich nicht selbst aufrufen. Dies wird mit dem Busy Flag verhindert.