欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
匯編語(yǔ)言基礎教程-控制轉移(2) [威客電腦資訊] 99d.com.cn
關(guān)于實(shí)例三的說(shuō)明
    有些步驟的實(shí)現方法已在前面的實(shí)例中做過(guò)介紹,下面就任務(wù)內無(wú)特權級變換的轉移和使用局部 描述符LDT等作些說(shuō)明:

(1)實(shí)模式下初始化LDT

    演示任務(wù)使用了局部描述符表LDT,本實(shí)例中該LDT在實(shí)模式下初始化(當然,也可以在使用LDT前 的保護模式初始化)。為了簡(jiǎn)便,LDT中各描述符的界限和屬性值在定義時(shí)預置,利用一個(gè)子程序 設置各段的段基地址。為方便起見(jiàn),在定義時(shí)把各段的段值安排在相應描述符的段基地址低16位 字段中。由于實(shí)例中各段在實(shí)模式下定位(這是因為程序是從實(shí)模式下啟動(dòng)執行的),所以把段值 乘以16就是對應的段基地址。

(2)裝載LDTR寄存器

    在使用LDT之前,還要裝載局部描述符表寄存器LDTR。本實(shí)例中的如下兩條指令用于裝載LDTR:
mov    ax,LDT_SELlldt   ax
    LLDT指令是專(zhuān)門(mén)用于裝載LDTR的指令。該指令的操作數是對應LDT段描述符的選擇子。根據該選擇子, 處理器從GDT中取出相應的LDT段描述符,在進(jìn)行合法性等檢查后,LDT段描述符的基地址和界限等信息 被裝入LDTR的高速緩沖寄存器中。由于要引用GDT,所以不能在實(shí)模式下裝載LDTR。在“操作系統類(lèi)指 令”一文中將對LLDT指令作詳細說(shuō)明。

(3)利用段間轉移指令JMP實(shí)現任務(wù)內無(wú)特權級的轉移

    在本實(shí)例中進(jìn)入保護方式后,特權級是0。通過(guò)如下段間直接轉移指令實(shí)現從代碼段K到代碼段L的轉移:
JUMP16    CodeL_Sel,Virtual2
    其中,選擇子CodeL_Sel是對應代碼段L的描述符的選擇子。該描述符在LDT中,所以選擇子中的描述 符表指示位TI為1。描述符特權級是0,表示對應代碼段的特權級是0,選擇子中的請求特權級RPL也 是0。目標代碼段不是一致代碼段,所以在CPL=DPL,RPL<=DPL的情況下,順利進(jìn)行相同特權級的轉 移:目標代碼段的選擇子CodeL_Sel被裝入CS,對應描述符中的信息被裝入高速緩沖寄存器中,偏移 量Virtual2被裝入指令指針寄存器。由于是16位代碼段,所以偏移用16位表示。
    類(lèi)似地,通過(guò)如下段間直接轉移指令實(shí)現從代碼段L轉移到代碼段K:
JUMP16    CodeK_Sel,Virtual3
    其中,選擇子CodeK_Sel是對應代碼段K的描述符選擇子。由于描述符在GDT中,所以選擇子中的TI位是0。

(4)利用段間調用指令CALL實(shí)現任務(wù)內無(wú)特權級變換的轉移

    在代碼段L中,通過(guò)段間直接調用指令CALL調用了在代碼段C中的兩個(gè)子程序,這些調用都是無(wú)特權級變 換的轉移。例如,利用如下指令調用了顯示字符串子程序DispMsg:
CALL16    CodeC_Sel,DispMsg
    其中,CodeC_Sel是代碼段C的選擇子,DispMsg表示子程序的入口。描述代碼段C的描述符在LDT中, 描述符特權級DPL是0,所以使用的選擇子CodeC_Sel的請求特權級RPL是0,描述符表指示位TI為1。 目標代碼段C不是一致代碼段,所以在CPL=DPL,RPL<=DPL的情況下,順利進(jìn)行相同特權級的轉移: 當前CS和IP壓入堆棧,目標代碼段的選擇子CodeC_Sel被裝入CS,對應描述符中的信息被裝入高速緩 沖寄存器中,16位偏移DispMsg被裝入指令指針I(yè)P。由于是16位段,所以偏移用16位表示,壓入堆棧 的是字而不是雙字。

(5)段間返回指令RET實(shí)現任務(wù)內無(wú)特權級變換的轉移

    段間返回指令RET從堆棧的棧頂彈出返回地址(由選擇子和偏移)構成。彈出選擇子內的RPL=CPL,并 且對應DPL=CPL,RPL<=DPL是當然的,所以能順利進(jìn)行相同特權級的轉移。

3.別名技術(shù)

    在上述實(shí)例三中,使用了兩個(gè)描述符來(lái)描述演示任務(wù)的LDT段。段描述符LDTable被安排在GDT中, 它是系統段描述符,把段LDTSeg描述成演示任務(wù)的局部描述符表LDT。描述符ToLDT被安排在LDT中, 它是數據段描述符,把段LDTSeg描述成一個(gè)普通數據段。描述符LDTable被裝載到LDTR,描述 符ToLDT被裝載到某個(gè)數據段寄存器。為什么要這樣處理呢?根據實(shí)例三的功能要求,需要訪(fǎng)問(wèn)演示 任務(wù)的局部描述符表LDT段,以取得代碼段L的段界限值,這需要通過(guò)某個(gè)段寄存器進(jìn)行, 但不能把系統段描述符的選擇子裝載到段寄存器,所以采 用兩個(gè)描述符來(lái)描述段LDTSeg。
    這種為了滿(mǎn)足對同一個(gè)段實(shí)施不同方式操作的需要,而用多個(gè)描述符加以描述的技術(shù)稱(chēng)為別名技術(shù)。 在保護方式程序設計中,常常要采用別名技術(shù)。例如:用兩個(gè)具有不同類(lèi)型值的描述符來(lái)描述同一個(gè) 段。再如,用兩個(gè)具有不同DPL的描述符來(lái)描述同一個(gè)段。

<三>任務(wù)內不同特權級的變換

    在一個(gè)任務(wù)內可以存在四種特權級,所以常常會(huì )發(fā)生不同特權級之間的變換。例如,外層的應用程 序調用內層操作系統的例程,以獲得必要的諸如存儲器分配等系統服務(wù)。內層操作系統的例程完成 后,返回到外層應用程序。
    在同一任務(wù)內,實(shí)現特權級從外層到內層變換的普通途徑是使用段間調用指令CALL,通過(guò)調用門(mén)進(jìn) 行轉移;實(shí)現特權級從內層向外層變換的普通途徑是使用段間返回指令RET。注意,不能用JMP指令 實(shí)現任務(wù)內不同特權級的變換。

1.通過(guò)調用門(mén)的轉移

    當段間轉移指令JMP和段間調用指令CALL所含指針的選擇子指示調用門(mén)描述符時(shí),就可以實(shí)現通過(guò) 調用門(mén)的轉移。但只有CALL指令能變換到內層的特權級,JMP指令只能轉移到同級的代碼。
    調用門(mén)描述符轉移的入口點(diǎn)包含目標地址的段及偏移量的48位全指針。在執行通過(guò)任務(wù)門(mén)的段間轉 移指令JMP或段間調用指令CALL時(shí),指令所含指針內的選擇子用 于確定調用門(mén),而偏移被丟棄;把調用門(mén)內的48位全指針作為目標地址指針進(jìn)行轉移。
    處理器采用與訪(fǎng)問(wèn)數據段相同的特權級規則控制對門(mén)描述符的訪(fǎng)問(wèn)。調用門(mén)描述符的DPL規定了訪(fǎng) 問(wèn)該門(mén)的最外層特權級,在取出調用門(mén)內的48位全指針,把它作為目標地址指針向目標代碼段轉移 之前,要進(jìn)行特權級檢查。只有在相同級或者更內層特權級的程序才可訪(fǎng)問(wèn)調用門(mén),即CPL<=調用 門(mén)的DPL。同時(shí),還要求指示門(mén)的選擇子的RPL必須滿(mǎn)足RPL<=調 用門(mén)的DPL的條件。檢測通過(guò)后,才開(kāi)始向目標代碼段轉移的步驟。其中還要檢測目標描述 符是否為代碼段描述符,調用門(mén)內的選擇子指示的描述符必須是代碼段描述符。此外,在裝載代碼 段描述符高速緩沖寄存器之前調整代碼段選擇子的RPL=0,也即調用門(mén)中代碼段選擇子的RPL被忽略。
    在裝載CS高速緩沖寄存器時(shí),還要對目標代碼段描述符進(jìn)行保護檢測。檢測過(guò)程中的DPL不再是調 用門(mén)的DPL,而是調用門(mén)內選擇子所指示的目標代碼段描述符的DPL。段間調用指令CALL和段間轉移 指令JMP所做的檢測不一樣。
    對于使用調用門(mén)的段間轉移指令JMP,檢測條件與段間直接轉移相同。由于已置RPL=0,所以可認為 RPL<=DPL的條件總能滿(mǎn)足。所以,對于普通的非一致代碼段,當CPL=DPL時(shí),發(fā)生無(wú)特權級變換的 轉移;對于一致代碼段,在滿(mǎn)足CPL>=DPL時(shí)也發(fā)生無(wú)特權級變換的轉移;其它情形就引起異常。
    對于使用調用門(mén)的段間調用指令CALL,情形就不同了。由于已置RPL=0,所以可認為RPL<=DPL的條 件總能滿(mǎn)足。對于一致代碼段,在滿(mǎn)足CPL>=DPL時(shí)發(fā)生無(wú)特權級變換的轉移。對于非一致代碼段, 當CPL=DPL時(shí),仍發(fā)生無(wú)特權級變換的轉移;當CPL>DPL時(shí),就發(fā)生向內層特權級變換的轉移,將調 用門(mén)中的選擇子和偏移裝入CS和指令指針EIP中,并使CPL保持等于DPL,同時(shí)切換到內層堆棧。
    綜上所述,使用段間調用指令CALL,通過(guò)調用門(mén)可以實(shí)現從外層程序調用進(jìn)入內層程序(JMP指令只 能實(shí)現無(wú)特權級變換的轉移);通過(guò)調用門(mén)也可實(shí)現無(wú)特權級變換的轉移。需要注意的是,JMP指令 和CALL指令都不能實(shí)現向外層特權級的轉移否則會(huì )引起異常。
    當然,CALL指令在最后把目標代碼段的指針裝入CS和EIP之前,要把原CS和EIP,即返回地址保存到 堆棧。如無(wú)特權級變換,堆棧保持不變,返回地址就保存在原堆棧中;否則,返回地址保存在內層 堆棧中。

2.堆棧切換

    在使用CALL指令通過(guò)調用門(mén)向內層轉移時(shí),不僅特權級發(fā)生變換,控制轉移到一個(gè)新的代碼段,而 且也切換到內層的堆棧段。從本教程第五篇的任務(wù)狀態(tài)段TSS的格式可見(jiàn),TSS中包含有指 向0級、1級和2級堆棧的指針。在特權級發(fā)生向內層變換時(shí),根據變換到的特權級使用TSS中相應的 堆棧指針對SS及ESP寄存器進(jìn)行初始化,建立起一個(gè)空棧。
    在建立起內層堆棧后,處理器先把外層堆棧的指針SS及ESP寄存器的值壓入內層堆棧,以使得相應 的向外層返回可恢復原來(lái)的外層堆棧。然后,從外層堆棧復制以雙字為單位的調用參數到內層堆棧 中,調用門(mén)中的DCOUNT字段值決定了復制參數的數量。這些被復制的參數是主程序通過(guò)堆棧傳遞給 子程序的實(shí)參,在調用之前被壓入外層堆棧。通過(guò)復制棧中的參數,使內層的子程序不需要考慮堆 棧的切換,而容易地訪(fǎng)問(wèn)主程序傳遞過(guò)來(lái)的實(shí)參。最后,調用的返回地址被壓入堆棧,以便在調用 結束時(shí)返回。下圖為在向內層變換時(shí),建立內層堆棧,并從外層堆棧復制2個(gè)雙字參數到內層堆棧 的示意圖。圖中每項是雙字,可見(jiàn)的段寄存器內的選擇子被擴展成32為存入堆棧,高16位為0。對 于16位的使用調用門(mén)的段也是如此。
    需要注意的是,無(wú)論是否通過(guò)調用門(mén),只要不發(fā)生特權級變換,就不會(huì )切換堆棧。

3.向外層返回

    與使用CALL指令通過(guò)調用門(mén)向內層變換相反,使用RET指令實(shí)現向外層返回。段間返回指令RET從 堆棧中彈出返回地址,并且可以采用調整ESP的方法,跳過(guò)相應的在調用之前壓入堆棧的參數。返 回地址的選擇子指示要返回的代碼段的描述符,從而確定返回的代碼段。選擇子的RPL確定返回后 的特權級,而不是對應描述符的DPL,這是因為,段間返回指令RET可能使控制返回到一致代碼段, 而一致代碼段可以在DPL規定的特權級以外的特權級執行。需要注意的是,RET指令所使用的返回 地址的選擇子只能使用代碼段描述符,而不能使用任何系統段描述符或門(mén)描述符,當然,更不能 使用數據段描述符,否則會(huì )引起異常。與CALL指令相對應,RET指令也不能向內層返回。
段間返回指令完成返回的步驟如下:
    (1)RET指令先從堆棧中彈出返回地址。如果彈出地址的選擇子的RPL規定相對于CPL更外層的特權 級,那么就引起向外層返回。
    (2)為向外層返回,跳過(guò)內層堆棧中的參數,再從內層棧中彈出指向外層堆棧的指針,并裝入SS及 ESP,以恢復外層堆棧。
    (3)調整ESP,跳過(guò)在相應的調用之前壓入到外層堆棧的參數。即返回指令不但彈出內層棧的參數, 而且也彈出外層棧的參數。
    (4)然后,檢查數據段寄存器DS、ES、FS及GS,以保證尋址的段在外層是可訪(fǎng)問(wèn)的,如果段寄存器 尋址的段在外層是不可訪(fǎng)問(wèn)的,那么裝入一個(gè)空選擇子,以避免在返回時(shí)發(fā)生保護空洞。
    (5)返回外層繼續執行。
    上述五步是對帶立即數的段間返回指令而言的,立即數規定了堆棧中要跳過(guò)的參數的字節數。對于 無(wú)立即數的段間返回指令缺少第二步和第三步。若RET指令不需要向外層返回,那么就只 有(1)和(5)兩步。對于有通過(guò)堆棧傳遞參數的子程序,必須使用帶立即數的返回指令返回,否則返 回時(shí)會(huì )裝載錯誤的外層棧指針。
    若不使用帶立即數的返回指令,可以在返回前把外層棧的棧指針存入內層棧中的用于保存返回地址 上方兩個(gè)雙字的區域中,由外層返回的過(guò)程可知,這可正確恢復外層棧的指針,但在外層程序中, 必須人為調整外層棧指針,以便廢除在外層棧中壓入的參數。在使用C調用約定的程序中可使用此 方法。但這會(huì )增加代碼的長(cháng)度和處理時(shí)間,使代碼效率變低。正因為如此,在Windows 9X下,新增 加了一種STDCALL的調用約定,它正是為了適應Intel系列處理器的體系結構而產(chǎn)生的。

<四>演示任務(wù)內特權級變換的實(shí)例(實(shí)例四)

    下面給出一個(gè)演示任務(wù)內特權級變換的實(shí)例。該實(shí)例演示在任務(wù)內通過(guò)調用門(mén)從外層特權級變換到 內層特權級;也演示通過(guò)段間返回指令從內層特權級變換到外層特權級;還演示通過(guò)調用門(mén)的無(wú)特 權級變換的轉移。實(shí)例使用了任務(wù)狀態(tài)段TSS,這是因為任務(wù)內特權級變換時(shí)要使用的內層堆棧指 針存放在TSS中。

1.實(shí)現步驟

    該實(shí)例的實(shí)現步驟為:
    (1)實(shí)方式下初始化;
    (2)切換到保護模式;
    (3)設置TR和LDTR。由于在任務(wù)內發(fā)生特權級變換時(shí)要切換堆棧,而內層堆棧的指針存放在當前任 務(wù)的TSS中,所以在進(jìn)入保護模式后設置任務(wù)狀態(tài)段寄存器TR。由于演示任務(wù)使用了局部描述符表 ,所以設置LDTR;
    (4)經(jīng)調用門(mén)進(jìn)入32位過(guò)渡代碼段;
    (5)建立返回3級演示代碼段的環(huán)境;
    (6)利用RET指令轉移到3級的演示代碼段。為了演示外層程序通過(guò)調用門(mén)調用內層程序,要 使CPL>0。實(shí)例先通過(guò)段間返回指令RET從特權級0變換到特權級3的演示代碼段。在特權級3下, 通過(guò)調用門(mén)調用1級的子程序。隨著(zhù)執行段間返回指令RET,又回到3級的演示代碼段;
    (7)在3級的演示代碼段中,經(jīng)調用門(mén)轉移到0級的32位過(guò)渡代碼段;
    (8)直接轉0級的臨時(shí)代碼段;
    (9)準備返回實(shí)模式;
    (10)切換回實(shí)模式;
    (11)實(shí)模式下的恢復工作。

2.源程序組織和清單

    實(shí)例四由如下部分組成:
    (1)全局描述符表GDT。GDT含有演示任務(wù)的TSS段描述符和LDT段描述符,此外還含有臨時(shí)代碼段 的描述符、規范數據段描述符和視頻緩沖區段描述符。
    (2)演示任務(wù)的LDT段。它含有除臨時(shí)代碼段外的其它代碼段的描述符和演示任務(wù)各級堆棧段描 述符,還含有3個(gè)調用門(mén)。
    (3)演示任務(wù)的TSS段。
    (4)演示任務(wù)的0級、1級和3級堆棧段。
    (5)顯示子程序段。32位代碼段,特權級1。
    (6)演示代碼段。32位代碼段,特權級3。
    (7)過(guò)渡代碼段。32位段,特權級0。
    (8)臨時(shí)代碼段。16位段,特權級0。
    (9)實(shí)模式下的數據和代碼段。
    該實(shí)例的邏輯功能是顯示演示代碼段執行時(shí)的當前特權級CPL。源程序清單如下:

 

 

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
rootkit ring3進(jìn)ring0之門(mén)系列[四]
DPL,RPL,CPL 之間的聯(lián)系和區別
一致代碼段和非一致代碼段
操作系統:CPU工作模式
2分鐘玩轉保護模式設計
內核代碼學(xué)習==>深入介紹Linux內核(六)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久