【OS学习笔记】二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套
上一篇文章學習了任務門的概念:任務門—任務切換。主要學習了以下內容:
- 使用任務門進行任務切換的一般工作原理(和中斷有關的任務切換)
本篇文章接著上一篇文章學習以下內容:
- 利用jmp進行任務切換
- 利用call進行任務切換
- jmp、call與任務門的中斷嵌套三者之間的區別與聯系
注意:和中斷有關的任務切換的詳細原理是在后面的文章中會講解。本文主要還是學習使用call、jmp和iret指令發起的任務切換。
1、回顧
在學習jmp、call與iret指令發起的任務切換之前,我們來回顧上一篇文章所學。
我們知道,當中斷發生時,可以執行常規的中斷處理過程,也可以進行任務切換。盡管性質不同,但它們都需要使用iret指令返回。只不過前者返回到同一任務的不同代碼段;后者返回到被中斷的那個任務。那么處理器是如何體現這兩種截然不同的返回類型呢?
如下圖是32位的標志寄存器EFLAGS。它有一個NT位。意思是嵌套任務標志。
每個任務的TSS中都有一個任務鏈接域(指向前一個任務的指針),可以填寫為前一個任務的TSS描述符選擇子。如果當前任務的EFLAGS的寄存器的NT位為1,則表示當前正在執行的任務是嵌套與其他任務,并且能夠通過TSS的任務鏈接域的指針返回到前一個任務。
對于新任務的處理是,要把老任務的TSS描述符選擇子填寫到新任務的TSS中的任務鏈接域,同時,將新任務的EFLAGS寄存器的NT位置1,以允許返回到前一個任務機械廠執行。同時,還要把新任務的TSS描述符的B位置1(忙)。
無論何時,只要處理器碰到iret指令,它都會檢查NT位,如果NT位是1,表明當前任務只需偶一能夠執行時因為它中斷了被的任務,因此應該返回到之前被中斷的任務去執行。如果NT=0,表明是一般的中斷過程。
2、CALL指令與JMP指令
除了使用中斷引發任務切換,還可以使用遠過程調用指令CALL或者遠跳轉指令JMP直接發起任務切換。在這兩種情況下,CALL與JMP指令的操作數是任務的TSS描述符的選擇子或者任務門。比如以下兩條指令:
call 0x0010:0x00000000 jmp 0x0010:0x00000000當處理器執行這兩條指令的時候,首先用指令中給出的描述符選擇子訪問GDT,分析它的描述符類型。將會有如下幾種情況發生:
- 如果是一般的代碼段描述符的話,就按普通的段間轉移的規則執行
- 如果是調用門,按調用門的規則來執行
- 如果是TSS描述符或者任務門的話。則執行任務切換
注意,如果是進行任務切換的話,后面的32位偏移量將會被忽略。原因是執行任務切換時,所有處理器的狀態都可以從TSS中獲得。
任務門可以安裝在中斷向量表中,也可以安裝在GDT中或者LDT中。
如果是用于發起任務切換,那么call指令與jmp指令有什么不同的呢?
如下圖是嵌套任務切換的一個圖示過程:
- 當任務1開始執行時。其TSS描述符的B位是1,EFLAGS寄存器的NT位是0,不嵌套于其他任務
- 當任務1轉換到任務2后,任務1仍然為忙,EFLAGS寄存器的NT位不變(在其TSS中);任務2也變為忙,EFLAGS寄存器的NT位變為1,表示嵌套于任務1中,同時將任務1的TSS描述符選擇子復制到任務2的TSS鏈接域
- 最后將任務2切換到任務3,過程與任務1切換到任務2是一樣的。
- 用call指令發起的任務切換,可以通過iret指令返回到前一個任務。返回到前一個任務后,當前任務(舊任務的EFLAGS的NT位以及TSS的B位恢復為0)
3、任務的不可重入性
任務是不可重入的
任務的不可重入的意思是,執行任務切換時,將要切換到的新任務此時的狀態不能為忙。已經在忙了,沒法再讓它忙。有以下兩種典型情況:
- 執行任務切換時,新任務不能是當前任務自己
- 如上述嵌套任務切換的示意圖此刻的狀態,不能從任務3切換到任務1或者任務2
處理器是通過TSS的B位來檢測重入的。因中斷,iret,call,jmp指令發起的任務切換時,處理器固件會檢測新任務的TSS的B位,如果該位為1,則處理器不允許這樣的任務切換。
4、任務切換時的幾種方法總結
處理器用以下四種方法將控制轉移到其他任務
- 當前程序、任務或者過程,執行jmp或者call指令,將控制轉移到GDT內的某一個TSS描述符
- 當前程序、任務或者過程,執行jmp或者call指令,將控制轉移到GDT或者LDT內的某一個任務門
- 一個異常或者中斷發生時,中斷號指向中斷描述符表內的任務門
- 在EFLAGS寄存器的NT位置1的情況下,當前任務執行了一個iret指令。
jmp、call、iret指令或者異常和中斷是程序重定向的機制,它們所引用的TSS描述符或者任務門,以及EFLAGS寄存器NT標志位的狀態,決定了任務切換是否,以及如何發生。
以下給出一個表格:不同任務切換方法對B位、NT位和任務鏈接域的影響
5、總結
本文主要學習關于任務切換的一些方法:jmp,call,以及中斷切換,這三者之間的區別。很明顯,call指令類似于中斷引起的切換,jmp指令就不同。同時注意iret指令執行時處理器大概都需要執行哪些指令(視不同的狀態而做出不同的反應)。
詳細的內容還是要參考原書籍,這里只是做一個簡單的總結。
學習探討加個人:
qq:1126137994
微信:liu1126137994
總結
以上是生活随笔為你收集整理的【OS学习笔记】二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv中的椭圆拟合
- 下一篇: GmSSL初次探索