Task State Segment
Aus Lowlevel
Version vom 30. Juli 2009, 02:46 Uhr von DickHuuhn (Diskussion | Beiträge)
Das Task State Segment (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 - Task State Segment
| 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 muss als Wert 1001b eingetragen werden. Die hintere Null wird zusätzlich als Busy-Flag verwendet. Dies wird 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.