TSS : Task State Segment
目次
タスク・ステート・セグメントとは
マルチタスクを実現するための、メモリ上のデータ領域。
タスクの状態(主にレジスタの値)を保存しておくためのセグメントで、システム・セグメントの一種。
一つのタスクに対して、一つのTSSが与えられる。
TSSの構造
104バイトの構成。
タスク・スイッチをする度に、レジスタの値をここに書き込んでいる。
| 0x0f | 0x0e | 0x0d | 0x0c | 0x0b | 0x0a | 0x09 | 0x08 | 0x07 | 0x06 | 0x05 | 0x04 | 0x03 | 0x02 | 0x01 | 0x00 | |
|---|
| 前のタスクのTSSセレクタ | 0x0000 | 0x0000 |
|---|
| 予約:0 | 0x0002 |
|---|
| ESP0 | 0x0004 | 0x0004 |
|---|
| 0x0006 |
|---|
| SS0 | 0x0008 | 0x0008 |
|---|
| 予約:0 | 0x000a |
|---|
| ESP1 | 0x000c | 0x000c |
|---|
| 0x000e |
|---|
| SS1 | 0x0010 | 0x0010 |
|---|
| 予約:0 | 0x0012 |
|---|
| ESP2 | 0x0014 | 0x0014 |
|---|
| 0x0016 |
|---|
| SS2 | 0x0018 | 0x0018 |
|---|
| 予約:0 | 0x001a |
|---|
| CR3 | 0x001c | 0x001c |
|---|
| 0x001e |
|---|
| EIP | 0x0020 | 0x0020 |
|---|
| 0x0022 |
|---|
| EFLAGS | 0x0024 | 0x0024 |
|---|
| 0x0026 |
|---|
| EAX | 0x0028 | 0x0028 |
|---|
| 0x002a |
|---|
| ECX | 0x002c | 0x002c |
|---|
| 0x002e |
|---|
| EDX | 0x0030 | 0x0030 |
|---|
| 0x0032 |
|---|
| EBX | 0x0034 | 0x0034 |
|---|
| 0x0036 |
|---|
| ESP | 0x0038 | 0x0038 |
|---|
| 0x003a |
|---|
| EBP | 0x003c | 0x003c |
|---|
| 0x003e |
|---|
| ESI | 0x0040 | 0x0040 |
|---|
| 0x0042 |
|---|
| EDI | 0x0044 | 0x0044 |
|---|
| 0x0046 |
|---|
| ES | 0x0048 | 0x0048 |
|---|
| 予約:0 | 0x004a |
|---|
| CS | 0x004c | 0x004c |
|---|
| 予約:0 | 0x004e |
|---|
| SS | 0x0050 | 0x0050 |
|---|
| 予約:0 | 0x0052 |
|---|
| DS | 0x0054 | 0x0054 |
|---|
| 予約:0 | 0x0056 |
|---|
| FS | 0x0058 | 0x0058 |
|---|
| 予約:0 | 0x005a |
|---|
| GS | 0x005c | 0x005c |
|---|
| 予約:0 | 0x005e |
|---|
| LDTセグメント・セレクタ | 0x0060 | 0x0060 |
|---|
| 予約:0 | 0x0062 |
|---|
| 予約:0 | T | 0x0064 | 0x0064 |
|---|
| I/Oマップ・ベース・アドレス | 0x0066 |
|---|
前のタスクのTSSセレクタ
タスクスイッチ前のタスクのTSSディスクリプタのセレクタが入る。
呼び出しや割り込みなどによって、自動で格納される。
このフィールドによって、IRET命令で前のタスクに戻ることができる。
ESP0-2, SS0-2
各特権レベルのスタック・セグメントとスタック・ポインタ。
詳しくはスタック・スイッチング?を参照。
T(デバッグトラップ)フラグ
このフラグがセットされている場合、このタスクへのタスクスイッチが起こると、プロセッサはデバッグ例外を発生させる。
I/Oマップ・ベース・アドレス
I/O許可ビットマップのベースアドレスを格納する。(TSSのベースアドレスが基準)
I/O許可ビットマップは同TSS内にある。
すべてのI/Oアクセスを禁止する(I/Oマップを作らない)ときは、TSSのリミット値を越える値を設定すればOK。
0xDFFFが設定の限界値のようです。>インテルマニュアル参照。
ページングを使用する際の注意点
TSSは物理アドレスで連続していないといけないので、ページングを利用する際にはTSSの中に4KiB境界が来ないように注意する必要がある。
関連リンク