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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

IA-32 Intel手册学习笔记(三)任务切换

發(fā)布時(shí)間:2024/4/19 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IA-32 Intel手册学习笔记(三)任务切换 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)任務(wù)由兩部分組成

  • 任務(wù)執(zhí)行空間,由代碼段,棧段,和一個(gè)或多個(gè)數(shù)據(jù)段組成
  • 任務(wù)狀態(tài)段(TSS)

如果操作系統(tǒng)使用處理器特權(quán)級(jí)機(jī)制,那么任務(wù)執(zhí)行空間會(huì)對(duì)每個(gè)特權(quán)級(jí)提供不同的棧(實(shí)際上是對(duì)0, 1, 2三個(gè)特權(quán)級(jí)分別提供不同的棧)

注,用戶程序的特權(quán)級(jí)是3,不是上述三個(gè)棧中的任何一個(gè),而是SS : ESP表示的棧

一個(gè)正在被執(zhí)行的任務(wù)狀態(tài)包括

  • 任務(wù)當(dāng)前執(zhí)行的空間,由各種段選擇子決定(CS, DS, SS, ES, FS和GS)。在線性地址空間中,是一個(gè)段空間
  • 通用寄存器狀態(tài),包括EAX, ECX, EDX, EBX, ESP, ESI和EDI的值
  • EIP寄存器的狀態(tài),即EIP的值
  • CR3控制寄存器的值
  • 任務(wù)寄存器(TR)的狀態(tài)
  • LDTR寄存器的狀態(tài)
  • I/O內(nèi)存映射的基地址(包含在TSS中),(共享內(nèi)存?)
  • 三個(gè)棧指針,分別指向特權(quán)級(jí)0, 1, 2的棧地址
  • 上一個(gè)被執(zhí)行的任務(wù)的link(地址)

任務(wù)狀態(tài)中”上一個(gè)被執(zhí)行的任務(wù)的link”指的是

當(dāng)任務(wù)A使用CALL指令調(diào)用任務(wù)B時(shí),在任務(wù)B的任務(wù)狀態(tài)中會(huì)包含任務(wù)A的地址,以便于當(dāng)B執(zhí)行完成后可以返回到任務(wù)A接著執(zhí)行。很像匯編中CALL指令調(diào)用函數(shù)時(shí)將下一條語(yǔ)句的地址入棧。

軟件或者處理器可以使用以下幾種方法調(diào)度一個(gè)任務(wù)

  • 顯式使用CALL指令調(diào)用某個(gè)任務(wù)
  • 顯式使用JUMP指令跳轉(zhuǎn)到某個(gè)任務(wù)
  • 由處理器隱式調(diào)用中斷處理任務(wù)
  • 隱式調(diào)用異常處理任務(wù)(也是由處理器?)
  • 如果EFLAGS寄存器的NT標(biāo)志被設(shè)置,那么可以使用IRET指令在返回時(shí)隱式調(diào)轉(zhuǎn)到某個(gè)任務(wù)

上述的所有方法都是通過(guò)一個(gè)指向任務(wù)段描述符的選擇子或者指向任務(wù)門描述符的選擇子實(shí)現(xiàn)的。

在任務(wù)切換過(guò)程中,假設(shè)由于某種原因(通常是屬于某個(gè)任務(wù)的時(shí)間片用光),處理器將從當(dāng)前正在執(zhí)行的任務(wù)A切換到另一個(gè)任務(wù)B。此時(shí),處理器需要記錄任務(wù)A的所有狀態(tài)以便當(dāng)切換回任務(wù)A時(shí)就好像沒(méi)離開(kāi)過(guò)一樣,所以,處理器會(huì)先將任務(wù)A的狀態(tài)(上面列出的任務(wù)狀態(tài))存儲(chǔ)在任務(wù)A的TSS中(任務(wù)狀態(tài)段)。然后將任務(wù)A掛起,并將任務(wù)B的狀態(tài)加載到處理器上(從B的TSS中),以此完成任務(wù)切換。

雖然聽(tīng)起來(lái)任務(wù)切換比較簡(jiǎn)單,就是保存A,執(zhí)行B。但是在這個(gè)看似簡(jiǎn)單的過(guò)程中,處理器做了非常多的事情,不過(guò)再次之前,先看一下都在什么時(shí)候處理器會(huì)執(zhí)行任務(wù)切換
- 當(dāng)前任務(wù)A執(zhí)行了JMP或CALL指令顯示調(diào)用任務(wù)B。JMP和CALL的操作數(shù)為段選擇子,指向GDT中任務(wù)B的TSS段描述符
- 當(dāng)前任務(wù)A執(zhí)行了JMP或CALL指令顯示調(diào)用任務(wù)B。JMP和CALL的操作數(shù)為段選擇子,指向GDT或任務(wù)B的LDT中的任務(wù)門描述符
- 當(dāng)前任務(wù)A出現(xiàn)一個(gè)指向IDT中任務(wù)門描述符的中斷/異常向量
- 當(dāng)前任務(wù)A執(zhí)行了IRET指令且EFLAGS寄存器中的NT標(biāo)志位被設(shè)置

當(dāng)發(fā)生任務(wù)切換時(shí),處理器依次執(zhí)行如下操作

  • 從任務(wù)門或上一個(gè)任務(wù)的link中獲取任務(wù)B的TSS段選擇子作為JMP或CALL的操作數(shù)
  • 核查任務(wù)A是否可以切換到任務(wù)B。這里需要應(yīng)用特權(quán)級(jí)規(guī)則,即任務(wù)A的CPL和任務(wù)B的TSS段選擇子的RPL必須小于任務(wù)B的TSS段描述符或任務(wù)門的DPL。另外對(duì)于中斷/異常(不包括INT n中斷)以及IRET指令則不需要進(jìn)行核查
  • 核查TSS段描述符是否有一個(gè)有效的段界限
  • 核查任務(wù)B是處于空閑狀態(tài)(available)還是忙碌狀態(tài)(busy),檢查段描述符中B標(biāo)志位,這步驟用于防止遞歸調(diào)用任務(wù)
  • 核查任務(wù)A的TSS,任務(wù)B的TSS和切換過(guò)程中被使用的所有段描述符是否都已經(jīng)被映射到物理內(nèi)存中(分頁(yè)機(jī)制可能會(huì)導(dǎo)致某些數(shù)據(jù)被存放到外存中)
  • 對(duì)于JMP和IRET指令,因?yàn)椴恍枰祷禺?dāng)前任務(wù)A,所以將任務(wù)A的段描述符的B標(biāo)簽置0,表示任務(wù)A處于空閑狀態(tài);對(duì)于CALL指令,因?yàn)樾枰祷禺?dāng)前任務(wù)A,所以將B標(biāo)簽置1,表示任務(wù)A處于忙碌狀態(tài),防止遞歸調(diào)用任務(wù)A
  • 如果任務(wù)切換由IRET指令引發(fā)(此時(shí)NT標(biāo)志位是1),那么在轉(zhuǎn)移過(guò)程中會(huì)將NT標(biāo)志置0。如果由其他因素引發(fā)(CALL, JMP,中斷,異常),則保持NT標(biāo)志位不變
  • 保存當(dāng)前任務(wù)A的任務(wù)狀態(tài),這個(gè)過(guò)程中會(huì)通過(guò)TR獲取任務(wù)A的TSS地址,然后將任務(wù)A的所有運(yùn)行狀態(tài)(主要是各個(gè)寄存器的值)保存在任務(wù)A的TSS中
  • 如果任務(wù)切換由CALL,中斷或異常引發(fā),那么處理器將會(huì)將任務(wù)B的NT標(biāo)志位置1。如果由IRET或JMP指令引發(fā),那么處理器會(huì)從任務(wù)B的TSS中讀取NT的值
  • 如果任務(wù)切換由CALL,JMP,中斷或異常引發(fā),那么處理器會(huì)設(shè)置任務(wù)B的段描述符的B標(biāo)簽。如果由IRET引發(fā),則保持不變
  • 將任務(wù)B的段選擇子和段描述符加載到TR寄存器中
  • 將任務(wù)B的TSS加載到處理器中,本質(zhì)是設(shè)置各種寄存器的值
  • 加載有關(guān)的段描述符
  • 開(kāi)始執(zhí)行任務(wù)B
  • 任務(wù)門描述符提供對(duì)TSS的間接引用,可以位于GDT,LDT以及IDT中,描述符中保存著段選擇子,通過(guò)段選擇子,可以在GDT中找到TSS段描述符以獲取TSS的基地址

    當(dāng)程序使用CALL或JMP指令嘗試條用任務(wù)門時(shí),CALL和JMP的操作數(shù)實(shí)際上是任務(wù)門的選擇子,通過(guò)選擇子可以找到在GDT,LDT或IDT中的任務(wù)門描述符。不過(guò),任務(wù)門選擇子的CPL和RPL必須小于等于門描述符的DPL

    任務(wù)門描述符的結(jié)果如下


    TSS(任務(wù)狀態(tài)段)的結(jié)果如下


    可以看出TSS中主要就是各種寄存器的值,這主要是為了當(dāng)任務(wù)切換時(shí),把當(dāng)前正在執(zhí)行的任務(wù)的各種狀態(tài)保存下來(lái),這樣,當(dāng)又執(zhí)行這個(gè)任務(wù)時(shí),就可以從TSS中獲取剛離開(kāi)時(shí)這個(gè)任務(wù)的狀態(tài),從而像從沒(méi)有離開(kāi)過(guò)一樣。

    每個(gè)任務(wù)都有屬于自己的TSS,而TR寄存器保存著當(dāng)前正在執(zhí)行的任務(wù)的TSS的段選擇子和基地址以及偏移量。
    在執(zhí)行任務(wù)A時(shí),TR寄存器保存著任務(wù)A的TSS的段選擇子和基地址。當(dāng)處理器從任務(wù)A切換到任務(wù)B時(shí),處理器執(zhí)行如下操作

  • 從TR中獲取任務(wù)A的TSS段基地址
  • 將任務(wù)A的各種狀態(tài)存在任務(wù)A的TSS中
  • 通過(guò)任務(wù)B的選擇子或任務(wù)門獲得任務(wù)B的TSS段選擇子和基地址
  • 將任務(wù)B的TSS段選擇子和基地址存在TR寄存器中
  • 將任務(wù)B的TSS段中的各種信息賦值給相應(yīng)寄存器
  • TR寄存器結(jié)果如下

    總結(jié)

    以上是生活随笔為你收集整理的IA-32 Intel手册学习笔记(三)任务切换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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