TSS详解 ——《x86汇编语言:从实模式到保护模式》读书笔记33
TSS(Task State Segment,任務(wù)狀態(tài)段)詳解
1. TSS描述符
和LDT一樣,必須為每個TSS在GDT中創(chuàng)建對應(yīng)的描述符。TSS描述符的格式如下圖:
B位是“忙”位(Busy)。在任務(wù)剛剛創(chuàng)建的時候,它應(yīng)該為0,表明任務(wù)不忙。當(dāng)任務(wù)開始執(zhí)行時,或者處于掛起狀態(tài)(臨時被中斷執(zhí)行)時,由處理器固件把B位置1.
任務(wù)是不可重入的。就是說在多任務(wù)環(huán)境中,如果一個任務(wù)是當(dāng)前任務(wù),那么它可以切換到其他任務(wù),但是不能從自己切換到自己。在TSS描述符中設(shè)置B位,并由處理器固件進(jìn)行管理,可以防止這種情況的發(fā)生。
2. TSS的格式
在一個多任務(wù)環(huán)境中,當(dāng)任務(wù)發(fā)生切換時,必須保存現(xiàn)場(比如通用寄存器,段寄存器,棧指針等)。為了保存被切換任務(wù)的狀態(tài),并且在下次執(zhí)行它時恢復(fù)現(xiàn)場,每個任務(wù)都應(yīng)當(dāng)有一片內(nèi)存區(qū)域,專門用于保存現(xiàn)場信息,這就是任務(wù)狀態(tài)段(Task State Segment)。
在創(chuàng)建一個任務(wù)的時候,我們要為這個任務(wù)創(chuàng)建TSS并填寫其中的一些字段。
前一任務(wù)鏈接(TSS Back Link):TSS內(nèi)偏移0處是前一個任務(wù)的TSS描述符的選擇子。
當(dāng)Call指令、中斷或者異常造成任務(wù)切換,處理器會把舊任務(wù)的TSS選擇子復(fù)制到新任務(wù)的TSS的Back Link字段中,并且設(shè)置新任務(wù)的NT(EFLAGS的bit14)為1,以表明新任務(wù)嵌套于舊任務(wù)中。關(guān)于這點(diǎn)我們會在第15章學(xué)習(xí)。在創(chuàng)建一個任務(wù)的時候,這個字段可以填寫0.
SS0,SS1,SS2和ESP0,ESP1,ESP2分別是0,1,2特權(quán)級堆棧的選擇子和棧頂指針。這些內(nèi)容應(yīng)當(dāng)由任務(wù)的創(chuàng)建者填寫,且屬于填寫后一般不變的靜態(tài)字段。
CR3和分頁有關(guān),我們會在第16章學(xué)習(xí)。如果沒有啟用分頁,可以填寫0.
偏移為0x20~0x5C的區(qū)域是處理器各個寄存器的快照部分,用于任務(wù)切換時保存現(xiàn)場。在一個多任務(wù)環(huán)境中,每次創(chuàng)建一個任務(wù),內(nèi)核至少要填寫EIP,EFLAGS,ESP,CS,DS,SS,ES,FS和GS。當(dāng)任務(wù)首次執(zhí)行時,處理器從這些寄存器中加載初始執(zhí)行環(huán)境,從CS:EIP處開始執(zhí)行任務(wù)的第一條指令。
LDT選擇子是當(dāng)前任務(wù)的LDT選擇子,由內(nèi)核填寫,以指向當(dāng)前任務(wù)的LDT。該信息由處理器在任務(wù)切換時使用,在任務(wù)運(yùn)行期間保持不變。
T(Debug Trap)位用于軟件調(diào)試。在多任務(wù)環(huán)境中,如果T=1,則每次切換到該任務(wù)的時候,會引發(fā)一個調(diào)試異常中斷(int 1).
I/O位圖基地址用來決定當(dāng)前的任務(wù)是否可以訪問特定的硬件端口。關(guān)于這個,下文會具體說明。
3. I/O許可位圖(I/O Permission Bit Map)
EFLAGS寄存器的IOPL位決定了當(dāng)前任務(wù)的I/O特權(quán)級別。如果在數(shù)值上CPL<=IOPL,那么所有的I/O操作都是允許的,針對任何硬件端口的訪問都可以通過;如果在數(shù)值上CPL>IOPL,也并不是說就不能訪問硬件端口。事實上,處理器的意思是總體上不允許,但個別端口除外。至于個別端口是哪些端口,要找到當(dāng)前任務(wù)的TSS,并檢索I/O許可位圖。
I/O許可位圖(I/O Permission Bit Map)是一個比特序列,因為處理器最多可以訪問65536個端口,所以這個比特序列最多允許65536比特(即8KB)。
如下圖中的綠色部分,第一個字節(jié)代表端口0~7,第二個字節(jié)代表端口8~15,以此類推。每個比特的值決定了相應(yīng)的端口是否允許訪問。為1時禁止訪問,為0時允許訪問。
在TSS內(nèi)偏移為102字節(jié)的那個字單元,是I/O位圖基地址字段,它指明了I/O許可位圖相對于TSS起始處的偏移,例如下圖中這個字段的值是144.
有幾點(diǎn)需要說明:
1. 如果I/O位圖基地址的值>=TSS的段界限(就是TSS描述符中的段界限),就表示沒有I/O許可位圖。
2. 處理器要求I/O位圖的末尾必須附加一個全1的字節(jié),即0xFF.
3. 處理器不要求為每一個I/O端口都提供位映射,對于那些沒有在位圖中映射的位,處理器假定它對應(yīng)的比特是1(禁止訪問)。
4. TSS描述符中的界限值包括I/O許可位圖在內(nèi),也包括最后附加的0xFF. 以下圖為例,TSS的界限值是149(總大小150減去1)。
【end】
總結(jié)
以上是生活随笔為你收集整理的TSS详解 ——《x86汇编语言:从实模式到保护模式》读书笔记33的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 任务和特权级保护(二)——《x86汇编语
- 下一篇: 用友元函数重载乘法,用成员函数重载除法