日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TSS详解 ——《x86汇编语言:从实模式到保护模式》读书笔记33

發(fā)布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TSS详解 ——《x86汇编语言:从实模式到保护模式》读书笔记33 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。