IA-32 Intel手册学习笔记(三)任务切换
一個(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ù)門描述符提供對(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寄存器結(jié)果如下
總結(jié)
以上是生活随笔為你收集整理的IA-32 Intel手册学习笔记(三)任务切换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 每天一道LeetCode-----给定一
- 下一篇: 每天一道LeetCode-----生命游