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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【OS学习笔记】二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套

發(fā)布時(shí)間:2023/12/10 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OS学习笔记】二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上一篇文章學(xué)習(xí)了任務(wù)門的概念:任務(wù)門—任務(wù)切換。主要學(xué)習(xí)了以下內(nèi)容:

  • 使用任務(wù)門進(jìn)行任務(wù)切換的一般工作原理(和中斷有關(guān)的任務(wù)切換)

本篇文章接著上一篇文章學(xué)習(xí)以下內(nèi)容:

  • 利用jmp進(jìn)行任務(wù)切換
  • 利用call進(jìn)行任務(wù)切換
  • jmp、call與任務(wù)門的中斷嵌套三者之間的區(qū)別與聯(lián)系

注意:和中斷有關(guān)的任務(wù)切換的詳細(xì)原理是在后面的文章中會(huì)講解。本文主要還是學(xué)習(xí)使用call、jmp和iret指令發(fā)起的任務(wù)切換。

1、回顧

在學(xué)習(xí)jmp、call與iret指令發(fā)起的任務(wù)切換之前,我們來回顧上一篇文章所學(xué)。

我們知道,當(dāng)中斷發(fā)生時(shí),可以執(zhí)行常規(guī)的中斷處理過程,也可以進(jìn)行任務(wù)切換。盡管性質(zhì)不同,但它們都需要使用iret指令返回。只不過前者返回到同一任務(wù)的不同代碼段;后者返回到被中斷的那個(gè)任務(wù)。那么處理器是如何體現(xiàn)這兩種截然不同的返回類型呢?

如下圖是32位的標(biāo)志寄存器EFLAGS。它有一個(gè)NT位。意思是嵌套任務(wù)標(biāo)志。

每個(gè)任務(wù)的TSS中都有一個(gè)任務(wù)鏈接域(指向前一個(gè)任務(wù)的指針),可以填寫為前一個(gè)任務(wù)的TSS描述符選擇子。如果當(dāng)前任務(wù)的EFLAGS的寄存器的NT位為1,則表示當(dāng)前正在執(zhí)行的任務(wù)是嵌套與其他任務(wù),并且能夠通過TSS的任務(wù)鏈接域的指針返回到前一個(gè)任務(wù)。

對(duì)于新任務(wù)的處理是,要把老任務(wù)的TSS描述符選擇子填寫到新任務(wù)的TSS中的任務(wù)鏈接域,同時(shí),將新任務(wù)的EFLAGS寄存器的NT位置1,以允許返回到前一個(gè)任務(wù)機(jī)械廠執(zhí)行。同時(shí),還要把新任務(wù)的TSS描述符的B位置1(忙)。

無論何時(shí),只要處理器碰到iret指令,它都會(huì)檢查NT位,如果NT位是1,表明當(dāng)前任務(wù)只需偶一能夠執(zhí)行時(shí)因?yàn)樗袛嗔吮坏娜蝿?wù),因此應(yīng)該返回到之前被中斷的任務(wù)去執(zhí)行。如果NT=0,表明是一般的中斷過程。

2、CALL指令與JMP指令

除了使用中斷引發(fā)任務(wù)切換,還可以使用遠(yuǎn)過程調(diào)用指令CALL或者遠(yuǎn)跳轉(zhuǎn)指令JMP直接發(fā)起任務(wù)切換。在這兩種情況下,CALL與JMP指令的操作數(shù)是任務(wù)的TSS描述符的選擇子或者任務(wù)門。比如以下兩條指令:

call 0x0010:0x00000000 jmp 0x0010:0x00000000

當(dāng)處理器執(zhí)行這兩條指令的時(shí)候,首先用指令中給出的描述符選擇子訪問GDT,分析它的描述符類型。將會(huì)有如下幾種情況發(fā)生:

  • 如果是一般的代碼段描述符的話,就按普通的段間轉(zhuǎn)移的規(guī)則執(zhí)行
  • 如果是調(diào)用門,按調(diào)用門的規(guī)則來執(zhí)行
  • 如果是TSS描述符或者任務(wù)門的話。則執(zhí)行任務(wù)切換

注意,如果是進(jìn)行任務(wù)切換的話,后面的32位偏移量將會(huì)被忽略。原因是執(zhí)行任務(wù)切換時(shí),所有處理器的狀態(tài)都可以從TSS中獲得。

任務(wù)門可以安裝在中斷向量表中,也可以安裝在GDT中或者LDT中。

如果是用于發(fā)起任務(wù)切換,那么call指令與jmp指令有什么不同的呢?

  • 使用call指令發(fā)起的任務(wù)切換,類似于中斷發(fā)起的任務(wù)切換。這就是說由call指令發(fā)起的切換時(shí)嵌套的,當(dāng)前任務(wù)(就任務(wù))TSS描述符法人B位保持原來的1不變,EFLAGS寄存器的NT位也不發(fā)生變化;新任務(wù)的TSS描述符的B位置1,EFLAGS寄存器的NT位也置1,表示此類任務(wù)是嵌套于其他任務(wù)中。同時(shí)TSS任務(wù)鏈接域的內(nèi)容改為舊任務(wù)的TSS描述符選擇子。
  • 如下圖是嵌套任務(wù)切換的一個(gè)圖示過程:

    • 當(dāng)任務(wù)1開始執(zhí)行時(shí)。其TSS描述符的B位是1,EFLAGS寄存器的NT位是0,不嵌套于其他任務(wù)
    • 當(dāng)任務(wù)1轉(zhuǎn)換到任務(wù)2后,任務(wù)1仍然為忙,EFLAGS寄存器的NT位不變(在其TSS中);任務(wù)2也變?yōu)槊?#xff0c;EFLAGS寄存器的NT位變?yōu)?,表示嵌套于任務(wù)1中,同時(shí)將任務(wù)1的TSS描述符選擇子復(fù)制到任務(wù)2的TSS鏈接域
    • 最后將任務(wù)2切換到任務(wù)3,過程與任務(wù)1切換到任務(wù)2是一樣的。
    • 用call指令發(fā)起的任務(wù)切換,可以通過iret指令返回到前一個(gè)任務(wù)。返回到前一個(gè)任務(wù)后,當(dāng)前任務(wù)(舊任務(wù)的EFLAGS的NT位以及TSS的B位恢復(fù)為0)
  • 和call指令不同,jmp指令發(fā)起的任務(wù)切換不會(huì)形成任務(wù)之間的嵌套關(guān)系。執(zhí)行任務(wù)切換時(shí),當(dāng)前任務(wù)(舊任務(wù))TSS的描述符的B位請0,變?yōu)榉敲B(tài),EFALGS寄存器的NT位不變。新任務(wù)的TSS的B位置1,EFLAGS寄存器的NT位保持從TSS中加載的狀態(tài)不變。
  • 3、任務(wù)的不可重入性

    任務(wù)是不可重入的

    任務(wù)的不可重入的意思是,執(zhí)行任務(wù)切換時(shí),將要切換到的新任務(wù)此時(shí)的狀態(tài)不能為忙。已經(jīng)在忙了,沒法再讓它忙。有以下兩種典型情況:

    • 執(zhí)行任務(wù)切換時(shí),新任務(wù)不能是當(dāng)前任務(wù)自己
    • 如上述嵌套任務(wù)切換的示意圖此刻的狀態(tài),不能從任務(wù)3切換到任務(wù)1或者任務(wù)2

    處理器是通過TSS的B位來檢測重入的。因中斷,iret,call,jmp指令發(fā)起的任務(wù)切換時(shí),處理器固件會(huì)檢測新任務(wù)的TSS的B位,如果該位為1,則處理器不允許這樣的任務(wù)切換。

    4、任務(wù)切換時(shí)的幾種方法總結(jié)

    處理器用以下四種方法將控制轉(zhuǎn)移到其他任務(wù)

    • 當(dāng)前程序、任務(wù)或者過程,執(zhí)行jmp或者call指令,將控制轉(zhuǎn)移到GDT內(nèi)的某一個(gè)TSS描述符
    • 當(dāng)前程序、任務(wù)或者過程,執(zhí)行jmp或者call指令,將控制轉(zhuǎn)移到GDT或者LDT內(nèi)的某一個(gè)任務(wù)門
    • 一個(gè)異常或者中斷發(fā)生時(shí),中斷號(hào)指向中斷描述符表內(nèi)的任務(wù)門
    • 在EFLAGS寄存器的NT位置1的情況下,當(dāng)前任務(wù)執(zhí)行了一個(gè)iret指令。

    jmp、call、iret指令或者異常和中斷是程序重定向的機(jī)制,它們所引用的TSS描述符或者任務(wù)門,以及EFLAGS寄存器NT標(biāo)志位的狀態(tài),決定了任務(wù)切換是否,以及如何發(fā)生。

    以下給出一個(gè)表格:不同任務(wù)切換方法對(duì)B位、NT位和任務(wù)鏈接域的影響

    5、總結(jié)

    本文主要學(xué)習(xí)關(guān)于任務(wù)切換的一些方法:jmp,call,以及中斷切換,這三者之間的區(qū)別。很明顯,call指令類似于中斷引起的切換,jmp指令就不同。同時(shí)注意iret指令執(zhí)行時(shí)處理器大概都需要執(zhí)行哪些指令(視不同的狀態(tài)而做出不同的反應(yīng))。

    詳細(xì)的內(nèi)容還是要參考原書籍,這里只是做一個(gè)簡單的總結(jié)。

    學(xué)習(xí)探討加個(gè)人:
    qq:1126137994
    微信:liu1126137994

    總結(jié)

    以上是生活随笔為你收集整理的【OS学习笔记】二十七 保护模式八:任务切换的方法之----jmp与call的区别以及任务的中断嵌套的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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