用以禁止返回定向編程的動態(tài)執(zhí)行阻止的制作方法
【專利摘要】本發(fā)明提供用于執(zhí)行阻止的方法、設備和/或系統(tǒng)。將存儲器裝置中的可執(zhí)行代碼的多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài)。將所述多個存儲器頁的第二子集的狀態(tài)指示符設定為可執(zhí)行狀態(tài),其中所述多個存儲器頁的所述第二子集包含到所述多個存儲器頁的所述第一子集中的函數(shù)的間接存根。在應用程序的執(zhí)行后,即刻將函數(shù)調(diào)用引導到所述多個存儲器頁的所述第二子集中的對應間接存根,所述間接存根在引導來自所述多個存儲器頁的所述第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的所述第一子集中的對應函數(shù)的所述狀態(tài)指示符。
【專利說明】用以禁止返回定向編程的動態(tài)執(zhí)行阻止
【技術(shù)領域】
[0001]一個特征大體上涉及禁止軟件系統(tǒng)中的惡意代碼的操作,且更特定來說涉及實施執(zhí)行阻止且默認地將存儲器頁標記為不可執(zhí)行以便減少可用于軟件系統(tǒng)中的返回定向編程開發(fā)的指令數(shù)目的方法和裝置。
【背景技術(shù)】
[0002]執(zhí)行軟件的計算系統(tǒng)正在經(jīng)歷增長的大量攻擊。這些攻擊經(jīng)常將惡意代碼插入計算系統(tǒng)中且隨后致使計算系統(tǒng)執(zhí)行惡意代碼的方式。惡意代碼可執(zhí)行許多不同操作,例如致使計算系統(tǒng)運行得比正常慢,監(jiān)視計算系統(tǒng)上的活動,致使計算系統(tǒng)發(fā)射或接收用戶可能不希望傳送的信息,破壞持續(xù)和非持續(xù)存儲器中的數(shù)據(jù),以及使計算系統(tǒng)崩潰。
[0003]最近已提出有時稱為返回定向編程(ROP)開發(fā)的攻擊機制。一類ROP開發(fā)經(jīng)常稱為返回到Iibc攻擊(或返回到Iibc中攻擊)。返回到Iibc (或返回到Iibc中)攻擊可通過兩個屬性識別:(a)其使用駐留在許多軟件系統(tǒng)中的標準C庫,以及(b)其直接跳到Iibc函數(shù)的進入點而不是其內(nèi)部。ROP開發(fā)是有力的技術(shù),其允許攻擊者開發(fā)軟件程序中的有效代碼序列而無需將任何新的惡意代碼注入到處理器的地址空間中。通過開發(fā)一些錯誤或弱點,攻擊可得到對將從其執(zhí)行指令的下一存儲器地址的控制。在一個實例中,這可通過覆寫保存在堆棧上的返回地址而發(fā)生。舉例來說,此攻擊可利用緩沖器溢出來指定到堆棧上的合法代碼塊的返回地址,其在合法函數(shù)返回時具有所要的效果。攻擊指令指針和/或獲得對下一存儲器地址的控制的其它方式也是可能的。有效代碼序列的小片斷(經(jīng)常稱為小工具)可能被攻擊者發(fā)現(xiàn),隨后串接在一起以形成新的惡意代碼序列,進而避開針對代碼注入的防御。
[0004]在傳統(tǒng)ROP開發(fā)中,小代碼片斷是代碼的以例如返回或跳轉(zhuǎn)指令結(jié)束的部分。其它指令也可用作小工具終止指令。當調(diào)用函數(shù)時,在向經(jīng)調(diào)用函數(shù)的返回的地址完成時,在所述調(diào)用之后的指令的地址被推送到堆棧上。因此,所述堆棧可包含許多返回地址,用于處理器跳轉(zhuǎn)到經(jīng)調(diào)用函數(shù)完成的時間。如果攻擊可對堆棧寫入信息,那么所述攻擊可用惡意返回地址覆寫既定返回地址。此返回地址可對應于由攻擊識別的小工具中的一者。
[0005]通過操縱多個返回地址,控制調(diào)用堆棧的攻擊可將多個小工具鏈接在一起以產(chǎn)生惡意代碼序列,而從不需要將任何新代碼注入處理器地址空間。通過這些惡意代碼序列及其布置的選擇,攻擊可針對由小工具串組成的惡意程序而引起任意的行為。此類型的攻擊是成功的,因為在大多數(shù)系統(tǒng)中代碼和數(shù)據(jù)地址是可預測的。也就是說,攻擊可在第一計算機中加載特定代碼,檢視第一計算機的堆棧以確定代碼正如何加載,且當此代碼加載在第二(目標)計算機中時使用此信息來開發(fā)返回堆棧。此攻擊可大體上依賴于在不同計算機上以相同方式加載代碼。
[0006]因此,需要可禁止返回定向編程攻擊的穩(wěn)健相應措施。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的實施例包含用于禁止開發(fā)堆棧和/或存儲器中的脆弱性的設備、方法和計算機可讀碼。
[0008]提供一種在處理電路中操作的方法以通過可執(zhí)行代碼的執(zhí)行阻止來阻礙返回定向攻擊??蓪⒋鎯ζ餮b置中的可執(zhí)行代碼的多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài)。舉例來說,此狀態(tài)指示符可用以實行駐留于所述多個存儲器頁的所述第一子集中的可執(zhí)行代碼的執(zhí)行阻止。類似地,可將用于所述多個存儲器頁的第二子集的狀態(tài)指示符設定為可執(zhí)行狀態(tài),其中所述多個存儲器頁的第二子集包含到所述多個存儲器頁的第一子集中的函數(shù)的間接存根。應注意,可在所述多個存儲器頁的第一子集或第二子集中的至少一者的狀態(tài)指示符已設定為不可執(zhí)行狀態(tài)之前和/或之后將可執(zhí)行代碼的所述多個存儲器頁加載到存儲器裝置中。可執(zhí)行代碼駐留的存儲器裝置可實施虛擬存儲器。隨后將函數(shù)調(diào)用引導到所述多個存儲器頁的所述第二子集中的對應間接存根,所述間接存根在引導來自所述多個存儲器頁的所述第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的所述第一子集中的對應函數(shù)的所述狀態(tài)指示符。間接存根可將所述多個存儲器頁的第一子集中的對應函數(shù)的狀態(tài)指示符從不可執(zhí)行狀態(tài)修改為可執(zhí)行狀態(tài)以實現(xiàn)函數(shù)的執(zhí)行。在完成所述函數(shù)調(diào)用后,所述方法可即刻返回到所述多個存儲器頁的所述第二子集中的所述對應間接存根,其中所述對應間接存根隨后修改所述多個存儲器頁的所述第一子集中的所述對應函數(shù)的所述狀態(tài)指示符。間接存根隨后可將所述多個存儲器頁的第一子集中的對應函數(shù)的狀態(tài)指示符從可執(zhí)行狀態(tài)修改為不可執(zhí)行狀態(tài)以停用函數(shù)的執(zhí)行。
[0009]在一個實例中,實行執(zhí)行阻止可包含當處理電路獲取可執(zhí)行代碼用于執(zhí)行時中止駐留于處于不可執(zhí)行狀態(tài)的存儲器頁中的任何可執(zhí)行代碼的執(zhí)行。
[0010]在一個實例中,所述第一指令可為所述函數(shù)調(diào)用的部分且所述第二指令是所述對應函數(shù)的初始指令??赏ㄟ^將所述第一指令綁定到所述第二指令以使得只有所述第一指令跟隨有所述第二指令才不中止執(zhí)行,來實施所述間接存根。
[0011]可執(zhí)行代碼可對應于單個應用程序和/或進程。在一些實施方案中,所述方法還可包含在完成所述函數(shù)調(diào)用后即刻沖刷所述處理電路的內(nèi)部高速緩存存儲器。在一些實施方案中,間接存根可在可執(zhí)行代碼的編譯階段或預編譯階段產(chǎn)生。
[0012]根據(jù)一個實例,用于所述函數(shù)的代碼可駐留于所述多個存儲器頁的所述第一子集內(nèi)的第一存儲器頁中??筛櫶幱谒隹蓤?zhí)行狀態(tài)的所述第一存儲器頁的使用以確認何時所有進行中函數(shù)調(diào)用已完成執(zhí)行所述第一存儲器頁內(nèi)的對應代碼。隨后在完成最后進行中函數(shù)調(diào)用后即刻將所述第一存儲器頁的所述狀態(tài)指示符設定于不可執(zhí)行狀態(tài)。
[0013]還可提供包括存儲器裝置和處理電路的處理裝置。所述處理電路可經(jīng)配置以:(a)將存儲器裝置中的可執(zhí)行代碼的多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài);(b)將所述多個存儲器頁的第二子集的所述狀態(tài)指示符設定為可執(zhí)行狀態(tài),其中所述多個存儲器頁的所述第二子集包含到所述多個存儲器頁的所述第一子集中的函數(shù)的間接存根;和/或(C)將函數(shù)調(diào)用引導到所述多個存儲器頁的所述第二子集中的對應間接存根,所述間接存根在引導來自所述多個存儲器頁的所述第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的所述第一子集中的對應函數(shù)的所述狀態(tài)指示符。
[0014]根據(jù)另一方面,對應間接存根可包含限于由處理電路循序執(zhí)行的至少第一指令和第二指令。如果第一指令之后是除了第二指令之外的任一指令,那么中止函數(shù)調(diào)用的執(zhí)行。
[0015]提供在處理電路中操作的再一方法。產(chǎn)生包含多個函數(shù)的應用程序源代碼。還獲得和/或產(chǎn)生用于源代碼中的每一函數(shù)的間接代碼??商砑又噶钜灾率乖创a在加載到存儲器中時經(jīng)識別為不可執(zhí)行。也可添加指令以致使間接代碼在加載到存儲器中時經(jīng)識別為可執(zhí)行。可在所述處理電路處變換所述源代碼和間接代碼以產(chǎn)生可執(zhí)行代碼??蓤?zhí)行代碼可對應于單個應用程序和/或進程。間接存根可在可執(zhí)行代碼的編譯階段或預編譯階段產(chǎn)生??删幾g源代碼和間接代碼以使得其在加載到存儲器中時駐留于單獨的存儲器頁中。在一個實例中,第一間接代碼可致使在調(diào)用對應第一函數(shù)以執(zhí)行時將第一函數(shù)的存儲器狀態(tài)指示符從不可執(zhí)行狀態(tài)切換到可執(zhí)行狀態(tài)。在另一實例中,第一間接代碼可致使在對應第一函數(shù)終止執(zhí)行時將第一函數(shù)的存儲器狀態(tài)指示符從可執(zhí)行狀態(tài)切換到不可執(zhí)行狀態(tài)。在又一實例中,與第一函數(shù)相關(guān)聯(lián)的第一間接代碼可適于指向第一函數(shù),其中當產(chǎn)生可執(zhí)行代碼時,編譯第一間接代碼和第一函數(shù)以加載于不同存儲器頁中。
[0016]根據(jù)一個方面,間接代碼可包含限于由處理電路循序執(zhí)行的至少第一指令和第二指令。所述方法可進一步包括添加指令以致使在所述第一指令跟隨有除了所述第二指令之夕卜的任一指令的情況下中止所述間接代碼的執(zhí)行。
【專利附圖】
【附圖說明】
[0017]圖1是說明其中可實施用于禁止ROP攻擊的一或多個特征的示范性操作環(huán)境、裝置和/或系統(tǒng)的框圖。
[0018]圖2說明可在存儲器中實施的示范性一般調(diào)用堆棧。
[0019]圖3說明示范性處理電路,其可適于通過初始將可執(zhí)行代碼駐留的全部或大多數(shù)存儲器空間標記為不可執(zhí)行來實行執(zhí)行阻止。
[0020]圖4說明示范性處理電路的替代配置,其中數(shù)據(jù)執(zhí)行阻止模塊位于高速緩存存儲器系統(tǒng)與存儲器裝置之間。
[0021]圖5是說明適于實行增強數(shù)據(jù)執(zhí)行阻止特征的處理電路的實例的框圖。
[0022]圖6說明用于產(chǎn)生惡意代碼序列的受破壞調(diào)用堆棧的實例,包含串接在一起以形成返回定向編程(ROP)開發(fā)的小工具。
[0023]圖7是說明在圖5的處理單元的上下文中對小工具獲取發(fā)生了什么的框圖。
[0024]圖8是說明用于禁止處理單元中的代碼執(zhí)行的一般示范性方法的流程圖。
[0025]圖9是說明在處理電路中操作的用于保護存儲器免于ROP開發(fā)的另一示范性方法的流程圖。
[0026]圖10是說明用于保護存儲器免于ROP開發(fā)的示范性方法的流程圖。
[0027]圖11是說明準許在需要或調(diào)用存儲器區(qū)域時修改存儲器區(qū)域的狀態(tài)的間接層的示范性實施方案的框圖。
[0028]圖12是說明用于實施準許在需要或調(diào)用存儲器區(qū)域時修改存儲器區(qū)域的狀態(tài)的間接層的方法。
[0029]圖13說明用于在應用程序內(nèi)實施允許修改應用程序可執(zhí)行代碼駐留的存儲器區(qū)域的狀態(tài)以保護對此些存儲器區(qū)域的存取的間接層的方法。
【具體實施方式】
[0030]在以下描述中,參考附圖,其中借助于圖解說明而展示其中可實踐本發(fā)明的特定實施例。實施例既定以充分的細節(jié)描述本發(fā)明的方面以使所屬領域的技術(shù)人員能夠?qū)嵺`本發(fā)明。在不脫離本發(fā)明的范圍的情況下可利用其它實施例且可對所揭示實施例做出改變。不應在限制性意義進行以下詳細描述,且本發(fā)明的范圍僅由所附權(quán)利要求書界定。
[0031 ] 術(shù)語“數(shù)據(jù)”在本文可以可互換方式使用以指代可由處理器使用的計算指令和可由處理器操作的數(shù)據(jù)。術(shù)語“數(shù)據(jù)”的使用的上下文應當使得當“數(shù)據(jù)”涉及指令時是明顯的。在需要的情況下,指令可明確地稱為指令或指令數(shù)據(jù)。
[0032]概述
[0033]本發(fā)明涉及用于通過在不使用時默認地將可執(zhí)行和不可執(zhí)行存儲器頁兩者標記為“不可執(zhí)行”來禁止開發(fā)存儲器堆棧中的脆弱性的設備、方法和機器可讀碼。因此,處理電路可對存儲器頁中經(jīng)標記為“不可執(zhí)行”的函數(shù)/指令實施執(zhí)行阻止,因此禁止對來自ROP攻擊的指令的調(diào)用被執(zhí)行。
[0034]根據(jù)一個特征,實施間接層,其中對可執(zhí)行代碼的所有函數(shù)調(diào)用均首先重定向到存根代碼,其改變此些可執(zhí)行代碼所駐留的存儲器狀態(tài)。存根代碼可將此可執(zhí)行代碼駐留的存儲器區(qū)的存儲器狀態(tài)從默認“不可執(zhí)行”狀態(tài)改變?yōu)椤翱蓤?zhí)行”狀態(tài)。存根代碼隨后指向?qū)嶋H可執(zhí)行代碼。在一個實例中,此特征可在應用程序的源代碼中和/或當將此應用程序編譯為可執(zhí)行碼時實施。也就是說,間接層(例如,存根代碼)可在源代碼內(nèi)原生地產(chǎn)生和/或其可在編譯時間產(chǎn)生。
[0035]根據(jù)一個方面,處理電路可實施在“不可執(zhí)行”存儲器頁中發(fā)現(xiàn)的代碼/指令的執(zhí)行阻止。含有可執(zhí)行指令的存儲器頁初始加載到存儲器中,且將所有頁(除了用于間接層的存根代碼所駐留的那些頁)默認地標記為“不可執(zhí)行”。從在處理電路上操作的合法應用程序起始的函數(shù)調(diào)用通過間接層(即,存根代碼),其在從此些存儲器頁檢索和/或執(zhí)行指令/代碼之前或同時地將存儲器頁的狀態(tài)從“不可執(zhí)行”改變?yōu)椤翱蓤?zhí)行”。在指令/代碼的執(zhí)行之前,處理電路可檢查和/或確認其源自經(jīng)標記為“可執(zhí)行”的存儲器頁中。來自ROP攻擊的調(diào)用繞過間接層(存根代碼)。因此,嘗試使用來自經(jīng)標記為“不可執(zhí)行”的存儲器頁的指令(例如,小工具)的ROP攻擊將失敗,因為處理電路將阻止或中止其執(zhí)行。
[0036]根據(jù)又一方面,間接代碼可包含限于由處理電路循序執(zhí)行的至少第一指令和第二指令。如果第一指令之后是除了第二指令之外的任一指令,那么中止函數(shù)調(diào)用的執(zhí)行。在一個示范性實施方案中,可避免額外指令實施單獨間接層的需要。而是,當使用成對的對應指令(例如,第一指令和第二指令)時,其可致使處理器在可執(zhí)行與不可執(zhí)行狀態(tài)之間切換存儲器頁和/或執(zhí)行隨后的代碼。在一些實施方案中,因為發(fā)現(xiàn)第一和第二指令循序執(zhí)行,所以可不存在在可執(zhí)行與不可執(zhí)行狀態(tài)之間切換的需要,因為處理器在除了第二指令之外的任何指令跟隨第一指令的情況下中止所有后續(xù)執(zhí)行。
[0037]示范性操作環(huán)境
[0038]圖1是說明其中可實施用于禁止ROP攻擊的一或多個特征的示范性操作環(huán)境、裝置和/或系統(tǒng)100的框圖。操作環(huán)境100可包含耦合到一或多個存儲器和/或存儲裝置的處理電路102 (例如,一或多個處理器)。在一個實例中,操作環(huán)境100可實施稱為虛擬存儲器的存儲器管理技術(shù)。虛擬存儲器是針對多任務內(nèi)核開發(fā)的技術(shù)。虛擬存儲器虛擬化各種形式的數(shù)據(jù)和/或可執(zhí)行代碼存儲,例如隨機存取存儲器和磁盤存儲,允許將程序設計為似乎僅存在一種存儲器“虛擬”存儲器,其表現(xiàn)為直接可尋址的讀取/寫入存儲器(RAM)。支持虛擬存儲器的許多操作系統(tǒng)也可在其自已的專用地址空間(例如,其自已的虛擬存儲器)中運行每一進程,從而允許將程序或應用程序設計為似乎其具有對虛擬存儲器的單獨存取。舉例來說,此處展示多個專用地址空間120a、102b、120c,其中這些地址空間中的每一者可與不同進程、程序和/或應用程序相關(guān)聯(lián)。
[0039]在此實例中,虛擬存儲器104代表一或多個物理存儲器裝置108和/或持久存儲裝置106內(nèi)的可尋址存儲器空間。處理電路102可適于存取虛擬存儲器104(或由虛擬存儲器映射的存儲器地址)以讀入呈加載于物理存儲器裝置108和/或持久存儲裝置106中的代碼和/或數(shù)據(jù)的形式的可執(zhí)行指令。
[0040]根據(jù)一個實例,虛擬存儲器104可布置成堆110、堆棧112、恒定數(shù)據(jù)114、初始化數(shù)據(jù)116以及可執(zhí)行指令118。堆110可用于在各種軟件程序可在處理環(huán)境100內(nèi)為活動的時所述程序的動態(tài)分配。例如恒定數(shù)據(jù)114和初始化數(shù)據(jù)116等各種數(shù)據(jù)可存儲在主存儲器裝置104中供在處理環(huán)境100上運行的一或多個程序存取。與各種程序相關(guān)聯(lián)的可執(zhí)行指令118可存儲在指令區(qū)域118、堆110或其組合中。
[0041]除非另外指定,否則術(shù)語“存儲器”在下文用以指代虛擬存儲器和/或處理電路102從其存取(例如從其讀取和/或?qū)ζ鋵懭?可執(zhí)行指令和/或數(shù)據(jù)的任何其它可尋址存儲器空間。本文描述的概念在各種類型的存儲器架構(gòu)中操作。舉例來說,虛擬存儲器可在處理電路102外部的存儲器裝置(例如,主存儲器)中實施,和/或其可在處理電路102內(nèi)的存儲器裝置(例如,內(nèi)部高速緩存存儲器)中實施。
[0042]根據(jù)一個特征,數(shù)據(jù)執(zhí)行阻止由處理電路102實施以幫助阻止返回定向編程攻擊。根據(jù)一個方面,在執(zhí)行之前,可將可執(zhí)行指令連同處理電路102在執(zhí)行代碼時可使用的對應間接代碼(存根)一起加載到虛擬存儲器104中。處理電路102可隨后從虛擬存儲器104讀取指令數(shù)據(jù)和/或向所述虛擬存儲器寫入指令/數(shù)據(jù)。
[0043]在此特征中,可執(zhí)行代碼駐留的所有(或大多數(shù))存儲器頁在其加載(或映射)到虛擬存儲器104中時可默認地標記為不可執(zhí)行。代表“不執(zhí)行”的NX位可由一些處理電路使用以隔離用于供指令(或代碼)存儲使用或用于數(shù)據(jù)存儲的存儲器區(qū)域。具有對NX位的支持的操作系統(tǒng)(在處理電路102上運行)可將可執(zhí)行代碼駐留的虛擬存儲器104的所有區(qū)域標記為不可執(zhí)行。在一個實例中,間接代碼(存根)駐留的虛擬存儲器104的區(qū)域可標記為可執(zhí)行。此間接代碼(存根)可插入在源代碼中或在應用程序的編譯時間產(chǎn)生。來自應用程序的函數(shù)調(diào)用可調(diào)用(或可重定向到)間接代碼,其在“不可執(zhí)行”與“可執(zhí)行”之間改變存儲器狀態(tài),且隨后將執(zhí)行引導到可執(zhí)行代碼的對應部分。
[0044]每次處理電路102從虛擬存儲器104加載/獲取存儲器頁時,在處理電路102內(nèi)操作的間接層(例如,存根)在加載/獲取之前(或同時)將NX位從“不可執(zhí)行”改變?yōu)椤翱蓤?zhí)行”。也就是說,當正由處理電路102執(zhí)行的應用程序/程序調(diào)用存儲器頁中的函數(shù)時,(由間接層)將存儲器頁從“不可執(zhí)行”改變?yōu)橛砷g接層“可執(zhí)行”。如果存儲器頁已經(jīng)標記為“可執(zhí)行”(即,存儲器頁已先前從不可執(zhí)行切換到可執(zhí)行),那么間接層無需將NX位改變?yōu)椴豢蓤?zhí)行。
[0045]處理電路102可包含執(zhí)行阻止模塊,其阻擋在虛擬存儲器104中標記為“不可執(zhí)行”的存儲器頁中駐留的任何代碼的執(zhí)行。在完成所要函數(shù)的執(zhí)行后,虛擬存儲器104中對應可執(zhí)行代碼所駐留的存儲器頁可從“可執(zhí)行”切換回到“不可執(zhí)行”。
[0046]嘗試從虛擬存儲器中標記為“不可執(zhí)行”的存儲器頁存取指令的ROP攻擊將會失敗。通過將那些存儲器頁(例如,存儲器中的區(qū)域)中的所有可執(zhí)行代碼(例如,指令)初始化為“不可執(zhí)行”且僅在處理電路102經(jīng)由間接層調(diào)用/獲取那些存儲器頁(例如,區(qū)域或片段)時才將其狀態(tài)改變?yōu)椤翱蓤?zhí)行”,將ROP攻擊限于從當前標記為“可執(zhí)行”的那些存儲器頁(虛擬存儲器104中)調(diào)用指令。來自ROP攻擊的調(diào)用將繞過間接層(存根)。因此,嘗試使用來自其它存儲器頁(虛擬存儲器104中)的指令(例如,小工具)的ROP攻擊將會失敗,因為那些存儲器頁被標記為“不可執(zhí)行”。因此,在檢索到此些“不可執(zhí)行”頁后,處理電路102的執(zhí)行阻止特征/模塊將阻止或拒絕此些存儲器頁中的指令的執(zhí)行。將所有存儲器頁標記為“不可執(zhí)行”大大減少了 ROP攻擊可從中使用指令的存儲器頁的數(shù)目。為了進一步減少可用于ROP攻擊的“可執(zhí)行”指令,一旦函數(shù)終止,便在虛擬存儲器104中將對應存儲器頁設定回到“不可執(zhí)行”。
[0047]應注意,通過使用NX位的執(zhí)行阻止通常是在應用程序堆棧和含有數(shù)據(jù)的其它存儲器區(qū)/區(qū)域上完成。然而,根據(jù)當前特征,含有應用程序的合法可執(zhí)行指令(例如,代碼、函數(shù)等等)的存儲器區(qū)或頁被標記為不可執(zhí)行。
[0048]圖2說明可在存儲器中實施的示范性一般調(diào)用堆棧200。調(diào)用堆棧200可用以存儲在調(diào)用函數(shù)時可使用的各種信息。被推送于堆棧上的每一函數(shù)占據(jù)一幀202,如分別由用于被調(diào)用函數(shù)A、B和C的幀202A、202B和202C所指示。
[0049]作為非限制性實例,調(diào)用堆棧200的每一幀202可包含例如從調(diào)用者函數(shù)傳遞到被調(diào)用函數(shù)的參數(shù)等信息。調(diào)用堆棧200還可包含用于存儲可由被調(diào)用程序使用的各種局部變量的存儲器區(qū)域。指示在被調(diào)用函數(shù)已完成執(zhí)行之后調(diào)用函數(shù)執(zhí)行應在何處繼續(xù)的返回地址也可包含在調(diào)用堆棧200中。調(diào)用堆棧200可作為后入先出(LIFO)緩沖器操作,意味著被推送于堆棧上的最后數(shù)據(jù)是從堆棧首先彈出的數(shù)據(jù)。調(diào)用堆棧200可為相當深的,指示許多函數(shù)調(diào)用嵌套在其它函數(shù)內(nèi)。
[0050]幀指針204大體上指向當前執(zhí)行函數(shù)的幀202。堆棧指針206指向堆棧200上的可用以被彈出且返回到處理器的下一數(shù)據(jù)位置。
[0051]ROP開發(fā)通過將惡意地址寫入到各種幀202A、202B和202C的返回地址部分來利用堆棧數(shù)據(jù)結(jié)構(gòu)。攻擊者可檢查將駐留在存儲器中的代碼,例如標準C庫,或操作系統(tǒng)的部分。攻擊者可隨后識別這些小工具(即,小代碼片斷)中的許多以產(chǎn)生ROP指令庫。這些ROP指令可隨后經(jīng)串接在一起以產(chǎn)生有用的、非既定的且惡意的代碼序列而無需將任何代碼插入存儲器。實際上,攻擊者僅必須將調(diào)用堆棧200上的返回地址改變?yōu)橹赶蛩」ぞ叩拈_始。與調(diào)用堆棧相關(guān)的操作可能因此由ROP開發(fā)破壞。然而,由于由此些ROP開發(fā)使用的小工具是通過繞過由處理電路使用的間接層來檢索,因此這些小工具可能在標記為“不可執(zhí)行”的存儲器頁中發(fā)現(xiàn)。因此,處理電路將拒絕或中止其執(zhí)行。
[0052]具有數(shù)據(jù)執(zhí)行阻止的示范性處理電路
[0053]圖3說明示范性處理電路302,其可適于通過初始將可執(zhí)行代碼駐留的全部或大多數(shù)存儲器空間標記為不可執(zhí)行來實行執(zhí)行阻止。處理電路302可包含一或多個處理器310,且任選地包含高速緩存存儲器系統(tǒng)312。處理電路302可耦合到外部裝置,例如存儲器裝置304、各種通信接口 306和/或一或多個輸入/輸出(I/O)接口 308。作為非限制性實例,通信接口 306可包含用于總線上的通信的接口、蜂窩式網(wǎng)絡、串行端口、并行端口、以太網(wǎng)連接、通用串行總線(USB)連接、IEEE1394( “火線”)連接、藍牙無線連接、802.la/b/g/η型無線連接,以及其它合適的通信協(xié)議和接口。作為非限制性實例,I/O接口 308可包含到例如鍵盤、鼠標、跟蹤球、觸覺裝置、音頻輸入和輸出以及顯示器等裝置的接口。
[0054]一些高速緩存存儲器系統(tǒng)312包含多級高速緩存存儲器,包括高速緩存存儲器的兩個或兩個以上級314。在此實例中,高速緩沖存儲器的第一級可包含單獨指令高速緩沖存儲器316和數(shù)據(jù)高速緩沖存儲器318。使指令與數(shù)據(jù)分離可通過產(chǎn)生用于獲取信息的并行路徑且利用對于指令和數(shù)據(jù)可不同的時間和空間接近度而產(chǎn)生性能增強。高速緩沖存儲器的第二級可經(jīng)配置為統(tǒng)一高速緩沖存儲器320,包含用于指令高速緩沖存儲器316的指令和用于數(shù)據(jù)高速緩沖存儲器318的數(shù)據(jù)。另外,高速緩存存儲器系統(tǒng)312可包含用于高速緩沖存儲器的不同配置,例如集合關(guān)聯(lián)高速緩沖存儲器和用于滿的高速緩沖存儲器的各種替換協(xié)議,如高速緩沖存儲器設計領域的技術(shù)人員所知。
[0055]高速緩沖存儲器允許較快地檢索與必須到達從主存儲器304獲取數(shù)據(jù)和/或指令相關(guān)的此指令和數(shù)據(jù)。與傳統(tǒng)存儲器相比的折中是在大小上。大體上,較小的存儲器具有較高的帶寬、較低的等待時間或兩者的組合。存儲器裝置304通常實施為動態(tài)隨機存取存儲器(DRAM),其可具有相對好的帶寬,但可能具有相對長的等待時間。通過在高速緩存存儲器系統(tǒng)312中高速緩存頻繁使用的數(shù)據(jù)和指令,可快得多地且以較高帶寬接收處理器312的獲取。作為一般規(guī)則,I級高速緩沖存儲器(即,最靠近處理器316和318的高速緩沖存儲器)較小、較快,且具有較低等待時間。2級高速緩沖存儲器320通常較大,可較慢,且可具有較長等待時間。然而,它們?nèi)员却鎯ζ餮b置304快,使得通過包含第二級高速緩沖存儲器,性能改善是可能的。
[0056]根據(jù)高速緩存存儲器系統(tǒng)的各種實例,可使用一或多個級且每一級可實施為統(tǒng)一高速緩沖存儲器或單獨的指令高速緩沖存儲器和數(shù)據(jù)高速緩沖存儲器。本文論述的實施例與指令最相關(guān)。因此,討論可具體涉及指令高速緩沖存儲器316和/或統(tǒng)一高速緩沖存儲器320。然而,所屬領域的技術(shù)人員將了解,實施例可在任一級的高速緩沖存儲器上以及在指令高速緩沖存儲器316和統(tǒng)一高速緩沖存儲器320兩者中實踐。
[0057]根據(jù)一個特征,由一或多個處理器310使用的虛擬存儲器可駐留在高速緩存存儲器系統(tǒng)312內(nèi)(例如高速緩存存儲器系統(tǒng)內(nèi)的任一級)和/或存儲器裝置304內(nèi)。處理電路302還可包含或?qū)嵤﹫?zhí)行阻止模塊322。在此實例中,執(zhí)行阻止模塊322可耦合于處理器310與存儲器裝置304和高速緩存存儲器系統(tǒng)312之間。在此實例中,虛擬存儲器可在存儲器裝置304和/或高速緩存存儲器系統(tǒng)312上實施。圖4說明示范性處理電路402的替代配置,其中執(zhí)行阻止模塊322位于高速緩存存儲器系統(tǒng)312與存儲器裝置304之間。在此實例中,虛擬存儲器可在存儲器裝置304中實施。
[0058]根據(jù)一個特征,所有或大多數(shù)存儲器頁在其獲取或映射到虛擬存儲器中時初始標記為不可執(zhí)行。處理電路302隨后拒絕執(zhí)行駐留在主存儲器304中標記為“不可執(zhí)行”的這些區(qū)域中的任何代碼。而是,每次從主存儲器304加載/獲取頁到高速緩存存儲器312中時,執(zhí)行阻止模塊322在將NX位加載到高速緩存存儲器312中之前將其從不可執(zhí)行改變(或致使改變)為可執(zhí)行。一旦加載到高速緩存存儲器312中,便可執(zhí)行所述頁中的函數(shù)。
[0059]嘗試從虛擬存儲器中的經(jīng)標記為“不可執(zhí)行”的頁存取指令的ROP攻擊將失敗。通過將所有指令頁初始化為“不可執(zhí)行”且僅在經(jīng)由執(zhí)行阻止模塊322獲取時將存儲器頁狀態(tài)改變?yōu)椤翱蓤?zhí)行”,ROP攻擊限于從當前標記為“可執(zhí)行”的那些存儲器頁調(diào)用指令。應注意,雖然在本文描述的許多實例中使用“存儲器頁”,但可將具有相等或不同大小的任何存儲器單元、片段、區(qū)標記為“不可執(zhí)行”和/或“可執(zhí)行”。因為來自ROP攻擊的調(diào)用繞過數(shù)據(jù)執(zhí)行阻止模塊322,所以其尋求執(zhí)行的指令(例如,小工具)將失敗,因為那些存儲器頁經(jīng)標記為“不可執(zhí)行”。將虛擬存儲器中的所有存儲器頁默認地標記為“不可執(zhí)行”大大減少了 ROP攻擊可從其中使用指令的存儲器頁的數(shù)目。為了進一步減少可用于ROP攻擊的“可執(zhí)行”指令,一旦函數(shù)終止,便從高速緩存存儲器沖刷掉其對應存儲器頁和/或在虛擬存儲器中將其設定回到不可執(zhí)行。
[0060]圖5是說明適于實行增強執(zhí)行阻止特征的處理電路的實例的框圖。處理電路502可實施包括傳入存根508和/或傳出存根510的間接層以及不可執(zhí)行位模塊536。在一個實例中,傳入存根508和/或傳出存根510可為加載到存儲器中的應用程序的部分。然而,此傳入存根508和/或傳出存根510可加載到標記為“可執(zhí)行”(由“X旗標”表示)的不同存儲器區(qū)中,而應用程序的對應可執(zhí)行代碼可加載到默認標記為“不可執(zhí)行”(由“NX旗標”表示)的存儲器區(qū)中。在此實例中,將間接存根540加載到已默認地將NX旗標設定為可執(zhí)行的第一存儲器頁542中。將對應可執(zhí)行代碼加載到存儲器頁k512和q548中。此處可了解,每一可執(zhí)行函數(shù)具有對應的傳入/傳出存根。舉例來說,存儲器頁k512中的函數(shù)F具有對應傳入/傳出存根F544。類似地,頁k512中的函數(shù)I具有對應傳入/傳出存根1552,且頁q548中的函數(shù)J具有對應傳入/傳出存根J554。在此實例中,傳入存根508和傳出存根510是傳入/傳出存根F544的邏輯表示。
[0061]根據(jù)一個實例,存根508/510可用作間接層且可為正由處理電路502執(zhí)行的應用程序的部分。存根508/510可用以截斷來自/去往應用程序514的函數(shù)調(diào)用,和/或可特定與應用程序的一或多個對應函數(shù)(可執(zhí)行代碼)相關(guān)聯(lián)。
[0062]為了說明,傳入存根508和傳出存根510在處理電路502內(nèi)展示且用以表示從虛擬存儲器504 (例如,從存儲器頁I 542)加載的傳入/傳出存根。應注意,取決于在任何一個時間在作用中/打開的函數(shù)調(diào)用的數(shù)目,處理電路502可加載多個傳入/傳出存根(例如,從存儲器頁I 542)。傳入存根508可用以將用于存儲器頁的不可執(zhí)行(NX)旗標(通常為一位)改變?yōu)榭蓤?zhí)行(X)旗標,隨后將控制傳送到存儲器頁內(nèi)的被調(diào)用函數(shù),且一旦被調(diào)用函數(shù)已完成則顛倒過程(例如,將存儲器頁從可執(zhí)行(X)設定為不可執(zhí)行(NX))。
[0063]在圖5中說明的實例中,在處理電路執(zhí)行應用程序514后,可進行對函數(shù)F520的調(diào)用(其中函數(shù)F550駐留于虛擬存儲器504內(nèi)的存儲器頁k512中)。并非直接從虛擬存儲器504獲取被調(diào)用函數(shù)(函數(shù)F),而是將函數(shù)調(diào)用520發(fā)送到傳入存根508。舉例來說,在調(diào)用對函數(shù)F的調(diào)用后,即刻獲取且執(zhí)行傳入存根F544 (例如,說明為傳入存根508)。傳入存根508 (例如,傳入存根F544)致使在處理電路502獲取和/或加載524函數(shù)F550之前從函數(shù)F550駐留的存儲器頁k512清除/移除522(即,設定為可執(zhí)行(X)旗標位設定)不可執(zhí)行(NX)旗標/位。不可執(zhí)行(NX)旗標檢查模塊536可在處理電路502加載和/或執(zhí)行函數(shù)F550之前確認存儲器頁是否標記為可執(zhí)行(X)或不可執(zhí)行(NX)。僅在虛擬存儲器504中標記為“可執(zhí)行”(X)的存儲器頁(或存儲器區(qū)域/片段)中發(fā)現(xiàn)的指令被允許由處理電路502執(zhí)行。
[0064]一旦其中的存儲器頁和/或指令已經(jīng)檢驗為在虛擬存儲器504中標記為“可執(zhí)行”且獲取到處理電路502中,則這些指令可正常地由處理電路502執(zhí)行。此處,函數(shù)F550是從經(jīng)加載存儲器頁k512執(zhí)行526。在完成函數(shù)F550的執(zhí)行后,將從函數(shù)F的返回528發(fā)送到傳出存根510(即,傳出存根F544)。傳出存根510可將執(zhí)行控制返回到調(diào)用應用程序514。另外,傳出存根510也可設定虛擬存儲器504中的頁k512的不可執(zhí)行(NX)頁旗標530 (即,從可執(zhí)行狀態(tài)切換到不可執(zhí)行狀態(tài)),以及從處理電路502可使用的任何任選高速緩存存儲器沖刷534頁k。一旦函數(shù)調(diào)用結(jié)束便從高速緩存存儲器506沖刷頁最小化可用于ROP攻擊的可執(zhí)行指令的數(shù)目。
[0065]在替代實施方案中,傳入存根可將函數(shù)/指令移動到已經(jīng)標記為可執(zhí)行的存儲器頁中,且隨后將控制傳送到被調(diào)用函數(shù)(例如,調(diào)用既定函數(shù)F)。在被調(diào)用函數(shù)(例如,函數(shù)F)已完成執(zhí)行之后,將返回轉(zhuǎn)向到傳出存根530,其顛倒先前操作(即,從已經(jīng)標記為可執(zhí)行的存儲器頁移除函數(shù)/指令和/或從高速緩沖存儲器沖刷存儲器頁k512的任何副本)。
[0066]通過在相同或附近存儲器頁上放置“調(diào)用者”和“被調(diào)用者”函數(shù),每次設定和清除存儲器頁的集合或塊上的不可執(zhí)行旗標,和/或比每個函數(shù)進入和退出較不頻繁地在可執(zhí)行與不可執(zhí)行狀態(tài)之間切換,可改善此系統(tǒng)的性能。舉例來說,如果函數(shù)F調(diào)用函數(shù)M,函數(shù)M調(diào)用函數(shù)P,那么將有利的是這些函數(shù)位于相同存儲器頁或可從虛擬存儲器504 —起加載或獲取的頁塊中。因此,當調(diào)用函數(shù)F時改變不可執(zhí)行(NX)頁旗標也可用以使后續(xù)被調(diào)用函數(shù)M和P可執(zhí)行,而無需額外的頁加載和NX狀態(tài)改變。
[0067]ROP開發(fā)大體上具有不良的空間接近度和不良的時間接近度,原因是可位于存儲器的不一定經(jīng)常被存取的許多不同區(qū)域中的指令的短片斷(例如,小工具)的特征。
[0068]圖6說明用于產(chǎn)生惡意代碼序列的受破壞調(diào)用堆棧600的實例,包含串接在一起以形成返回定向編程(ROP)開發(fā)的小工具。受破壞的調(diào)用堆棧600呈受破壞形式,原因是攻擊者修改了受破壞調(diào)用堆棧600上的返回地址中的一者或一者以上。圖6中還說明存儲器602的含有指令的一部分。
[0069]受破壞調(diào)用堆棧600可包含用于函數(shù)U、V、W、X、Y和Z的幀(函數(shù)調(diào)用)。從受破壞調(diào)用堆棧600到存儲器602的實心箭頭指示從堆棧彈出的返回地址,致使處理電路在特定小工具的開始處開始執(zhí)行。從存儲器602到受破壞調(diào)用堆棧600的虛線箭頭指示在特定小工具的末尾處執(zhí)行以從堆棧獲取返回地址的返回指令。
[0070]在受破壞調(diào)用堆棧600中,用于函數(shù)Z608的返回地址已經(jīng)修改為指向小工具A612的開始地址610 (B卩,GA返回地址)。類似地,用于函數(shù)Y614的返回地址已經(jīng)修改為指向小工具B618的開始地址616( S卩,GB返回地址),用于函數(shù)W620的返回地址已經(jīng)修改為指向小工具E624的開始地址622 ( S卩,GE返回地址),用于函數(shù)V626的返回地址已經(jīng)修改為指向小工具D630的開始地址628 ( S卩,⑶返回地址),且用于函數(shù)U632的返回地址已經(jīng)修改為指向小工具C636的開始地址634 ( S卩,GC返回地址)。在此實例中,用于函數(shù)X640的返回地址638未經(jīng)修改。
[0071]由于這些修改,當函數(shù)Z608完成其操作且執(zhí)行返回指令而不是返回到正確地點時,控制在小工具A612的開始處繼續(xù),對于所述開始處,地址已經(jīng)放置于函數(shù)Z608的返回地址610中。每個小工具以返回指令結(jié)束。因此,當小工具A612完成時,其返回指令指向函數(shù)Y614的返回地址616。然而,函數(shù)Y614的返回地址616已經(jīng)修改以指向小工具B618的開始。因此,并非返回到正確的地點,控制在小工具B618的開始處繼續(xù)。繼續(xù)小工具執(zhí)行,在小工具B618完成之后,并非返回到函數(shù)U632的正確的地點,控制在小工具C636的開始處繼續(xù)。在小工具C636完成之后,并非返回到函數(shù)V626的正確的地點,控制在小工具D630的開始處繼續(xù)。在小工具D630完成之后,并非返回到函數(shù)W620的正確的地點,控制在小工具E624的開始處繼續(xù)。這種將小工具A到E串接在一起可執(zhí)行形成ROP開發(fā)的至少一部分的重要功能。
[0072]然而,因為本文論述的處理電路利用數(shù)據(jù)執(zhí)行阻止且存儲器中的所有存儲器頁默認地標記為“不可執(zhí)行”,所以僅已經(jīng)由間接層(例如,傳入存根508和傳出存根510)調(diào)用的函數(shù)/指令保證駐留于標記為“可執(zhí)行”的存儲器頁上。因此,位于經(jīng)標記為“不可執(zhí)行”的存儲器區(qū)域中的任何小工具將不能由處理電路執(zhí)行,因為此些小工具調(diào)用繞過間接層。
[0073]圖7是說明在圖5的處理單元的上下文中對小工具獲取發(fā)生了什么的框圖。在此實例中,已將各種函數(shù)加載到虛擬存儲器504中。堆??赡芤咽芄?,使得從頁q548加載小工具702的調(diào)用發(fā)生。然而,此小工具調(diào)用702不通過傳入存根508發(fā)生。也就是說,不同于在虛擬存儲器504中具有對應傳入/傳出存根的函數(shù)調(diào)用,小工具調(diào)用在存儲器中的任意點(例如,經(jīng)選擇以實現(xiàn)某些指令的執(zhí)行)處開始而無需傳入/傳出存根。因此,由于不調(diào)用傳入存根,因此頁q548的狀態(tài)仍標記為“不可執(zhí)行”。當從頁q548獲取704小工具時,不可執(zhí)行(NX)旗標檢查模塊536拒絕或阻擋頁q548的加載,因為其標記為“不可執(zhí)行”。這也可致使小工具調(diào)用和/或進程706的終止。
[0074]用于禁止處理電路內(nèi)的執(zhí)行的示范性方法
[0075]圖8是說明用于禁止處理單元中的代碼執(zhí)行的一般示范性方法的流程圖。此方法可例如由從存儲器(例如,虛擬存儲器、內(nèi)部/外部存儲器等等)獲取指令的處理電路實施。將存儲器中的可執(zhí)行代碼的區(qū)域加標記(例如,標記)為不可執(zhí)行802。處理電路可監(jiān)視是否有從存儲器執(zhí)行一或多個指令的請求804。如果檢測到執(zhí)行一或多個指令的請求806,那么將一或多個指令駐留的存儲器區(qū)域標記為可執(zhí)行808。處理電路可隨后從存儲器區(qū)域執(zhí)行一或多個指令810。在完成后,將一或多個指令駐留的存儲器區(qū)域標記回到不可執(zhí)行 812。
[0076]圖9是說明在處理電路中操作的用于保護存儲器免于ROP開發(fā)的另一示范性方法的流程圖。在處理電路執(zhí)行應用程序或進程后可即刻實施此方法。應用程序或進程可包含致使將其可執(zhí)行代碼加載到存儲器中和/或以如下方式受保護的指令??蓪⒖蓤?zhí)行代碼的多個存儲器頁加載到存儲器裝置中902??蓤?zhí)行代碼可對應于單個應用程序和/或進程??蓤?zhí)行代碼加載于其中的存儲器裝置可實施虛擬存儲器。可將用于所述多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài)904。同樣,將用于所述多個存儲器頁的第二子集的狀態(tài)指示符設定為可執(zhí)行狀態(tài),其中所述多個存儲器頁的第二子集包含到所述多個存儲器頁的第一子集中的函數(shù)的間接存根906。應注意,將可執(zhí)行代碼的所述多個存儲器頁加載到存儲器裝置中可在用于所述多個存儲器頁的第一子集和/或第二子集中的至少一者的狀態(tài)指示符已設定為不可執(zhí)行狀態(tài)之前和/或之后發(fā)生。
[0077]間接存根可在可執(zhí)行代碼的編譯階段或預編譯階段產(chǎn)生。隨后,可將函數(shù)調(diào)用引導到所述多個存儲器頁的第二子集中的對應間接存根,所述間接存根在引導來自所述多個存儲器頁的第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的第一子集中的對應函數(shù)的狀態(tài)指示符908。處理電路還可實行駐留于所述多個存儲器頁的第一子集中的可執(zhí)行代碼的執(zhí)行阻止910。舉例來說,實行執(zhí)行阻止可包含當處理電路獲取可執(zhí)行代碼用于執(zhí)行時中止駐留于處于不可執(zhí)行狀態(tài)的存儲器頁中的任何可執(zhí)行代碼的執(zhí)行。處理電路還可在完成函數(shù)調(diào)用后即刻返回到所述多個存儲器頁的第二子集中的對應間接存根,其中對應間接存根隨后修改所述多個存儲器頁的第一子集中的對應函數(shù)的狀態(tài)指示符912。
[0078]在一個實例中,間接存根可將所述多個存儲器頁的第一子集中的對應函數(shù)的狀態(tài)指示符從不可執(zhí)行狀態(tài)修改為可執(zhí)行狀態(tài)以啟用函數(shù)的執(zhí)行。間接存根也可將所述多個存儲器頁的第一子集中的對應函數(shù)的狀態(tài)指示符從可執(zhí)行狀態(tài)修改為不可執(zhí)行狀態(tài)以停用函數(shù)的執(zhí)行。
[0079]根據(jù)一個方面,在函數(shù)調(diào)用的完成后可對處理電路的內(nèi)部高速緩存存儲器沖刷(清除)函數(shù)調(diào)用。在另一實例中,在用于函數(shù)調(diào)用的代碼駐留于所述多個存儲器頁的第一子集內(nèi)的第一存儲器頁中的情況下,所述方法可進一步包括:(a)跟蹤處于可執(zhí)行狀態(tài)的第一存儲器頁的使用;(b)確認何時所有進行中函數(shù)調(diào)用已完成第一存儲器頁內(nèi)的對應代碼的執(zhí)行;和/或(C)在完成最后進行中函數(shù)調(diào)用后即刻將第一存儲器頁的狀態(tài)指示符設定為不可執(zhí)行狀態(tài)。
[0080]圖10是說明用于保護存儲器免于ROP開發(fā)的示范性方法的流程圖。此方法可在從存儲器(例如,虛擬存儲器)存取可執(zhí)行代碼或指令的處理電路中操作。
[0081]根據(jù)任選特征,可在執(zhí)行之前在同一存儲器頁中布置嵌套或相關(guān)函數(shù)的可執(zhí)行代碼1000。舉例來說,此布置可在可執(zhí)行代碼的編譯期間或當將可執(zhí)行代碼加載到存儲器中時發(fā)生。以此方式預布置代碼可準許相關(guān)代碼在存儲器中靠近在一起,進而避免過多的存儲器頁獲取,且通過擴展,最小化頁狀態(tài)的改變(例如,可執(zhí)行與不可執(zhí)行之間)。
[0082]處理電路可將可執(zhí)行代碼的多個存儲器頁加載到存儲器中1002,且將每一存儲器頁的狀態(tài)指示符設定為不可執(zhí)行狀態(tài)1004。在一個實例中,此存儲器可稱為虛擬存儲器,其可為主存儲器和/或高速緩存存儲器裝置的物理存儲器地址的映射。在執(zhí)行應用程序后,處理電路和/或操作系統(tǒng)可在從存儲器獲取對應可執(zhí)行代碼之前即刻檢測、監(jiān)視和/或截斷來自應用程序的函數(shù)調(diào)用1006。將第一可執(zhí)行代碼在存儲器中駐留的第一存儲器頁的狀態(tài)指示符設定和/或改變?yōu)榭蓤?zhí)行狀態(tài)1008。隨后可從存儲器獲取第一存儲器頁1010。在執(zhí)行來自第一存儲器頁的指令之前,做出關(guān)于第一存儲器頁狀態(tài)指示符是否設定為可執(zhí)行狀態(tài)的確定1012。如果存儲器頁狀態(tài)不是可執(zhí)行狀態(tài),那么中止(處理電路)對第一存儲器頁的加載/執(zhí)行1014。否則,如果第一存儲器頁狀態(tài)事實上是可執(zhí)行狀態(tài),那么(由處理電路)執(zhí)行第一可執(zhí)行代碼1016。在完成第一可執(zhí)行代碼的執(zhí)行后,處理電路可從任何內(nèi)部高速緩存存儲器(如果存在)沖刷第一存儲器頁1018。
[0083]另外,處理電路還可將存儲器中的狀態(tài)指示符設定回到不可執(zhí)行1020。以此方式,從應用程序外部發(fā)生的調(diào)用不被截斷,且其對應指令將可能在具有“不可執(zhí)行”狀態(tài)的存儲器頁中被發(fā)現(xiàn)。
[0084]在一些實施方案中,可存在對一或多個存儲器頁中的函數(shù)的多個嵌套調(diào)用。根據(jù)一個方面,執(zhí)行應用程序的處理電路可維持一或多個計數(shù)器,其中每一計數(shù)器用以跟蹤特定存儲器頁中的函數(shù)和/或指令的執(zhí)行是否已終止。舉例來說,借助嵌套函數(shù)調(diào)用,在第一存儲器頁中的函數(shù)可調(diào)用第二頁中的函數(shù)的情況下,多個存儲器頁可同時保持打開。所述一或多個計數(shù)器可用以跟蹤例如進入特定存儲器頁的次數(shù)以及退出次數(shù),進而確認存儲器頁的使用何時已完成且可被沖刷或改變回到“不可執(zhí)行”。在一些實施方案中,編譯器可將相關(guān)可執(zhí)行代碼布置在一起,使得其駐留于相同存儲器頁中。這準許從存儲器頁執(zhí)行指令而不必頻繁地清除和設定所述存儲器頁的“不可執(zhí)行”狀態(tài)。
[0085]根據(jù)另一方面,引導代碼和/或某些啟動操作系統(tǒng)可執(zhí)行代碼可從本文描述的執(zhí)行阻止特征排除。也就是說,含有此代碼的存儲器頁可默認地標記為“可執(zhí)行”(而不是“不可執(zhí)行”)。這將準許較快地引導,直到在處理電路或其上執(zhí)行的操作系統(tǒng)處已實現(xiàn)最小操作功能性為止。
[0086]示范性間接層
[0087]圖11是說明準許在需要或調(diào)用存儲器區(qū)域時修改存儲器區(qū)域的狀態(tài)的間接層的示范性實施方案的框圖。在此實例中,處理電路1102可耦合到存儲器模塊1110(例如,虛擬存儲器、存儲器裝置等等),其包含可執(zhí)行指令/代碼1108和/或?qū)g接代碼1104/1106( S卩,間接層)。在一個實例中,間接代碼1104/1106可為已特定添加或插入(例如,在預編譯處、在編譯處和/或在編譯后)到可執(zhí)行代碼中的單獨指令。在另一實例中,間接代碼1104/1106可為由處理器配置/解譯以實現(xiàn)保證對駐留于存儲器中的某些指令的存取的安全的所要功能的現(xiàn)存指令。
[0088]在一個實例中,間接代碼1104/1106可用以設定/清除可執(zhí)行指令的存儲器狀態(tài)1108。舉例來說,當從由處理電路執(zhí)行的應用程序內(nèi)調(diào)用函數(shù)A時,實際上調(diào)用對應間接代碼A1104。間接代碼Al 104將可執(zhí)行代碼A (函數(shù)A)的對應存儲器區(qū)1112的狀態(tài)從“不可執(zhí)行”設定為“可執(zhí)行”,因此指令可由處理電路1102執(zhí)行。在指令完成后,間接代碼1104即刻將可執(zhí)行代碼A(函數(shù)A)的對應存儲器區(qū)1112的狀態(tài)從“可執(zhí)行”設定為“不可執(zhí)行”,因此指令不可用于執(zhí)行(例如,通過ROP附接)。針對其它函數(shù)可重復相同過程。舉例來說,第二函數(shù)B可具有對應間接代碼BI 106,其用以存取可執(zhí)行代碼B (函數(shù)B) 1114。
[0089]與可執(zhí)行指令1108駐留的存儲器空間(默認地標記為“不可執(zhí)行”)相反,間接代碼1104和/或1106可駐留于標記為“可執(zhí)行”的存儲器空間中,使得處理電路1102可執(zhí)行此代碼。間接代碼1104和/或1106可在特定應用程序的編譯時間產(chǎn)生,其中此間接代碼與可執(zhí)行指令分開來組織?;蛘?,間接代碼1104和/或1106可在將可執(zhí)行指令1108加載到存儲器中后即刻動態(tài)地產(chǎn)生。
[0090]在一個實例中,每一可執(zhí)行代碼1112/1114(或函數(shù))可具有對應間接代碼1104/1106。因此,每一間接代碼(存根)1104/1106可知道其對應可執(zhí)行代碼1112/1114在存儲器中駐留于何處且可能夠指向此存儲器地址。此存儲器地址以及與每一函數(shù)相關(guān)聯(lián)的可執(zhí)行代碼的大小可在(應用程序的)編譯時間為可知的。因此,間接代碼1104/1106能夠確定對應可執(zhí)行代碼1112/1114駐留于哪些存儲器頁中以及駐留于多少存儲器頁中。取決于用于任一個函數(shù)的可執(zhí)行代碼的大小和存儲器頁的大小,一或多個存儲器頁可針對給定函數(shù)調(diào)用在任一個時間從“不可執(zhí)行”切換到“可執(zhí)行”(或保持在“可執(zhí)行”狀態(tài))。另夕卜,在一些實施方案中,僅對應于最當前、突出和/或待決的函數(shù)調(diào)用的可執(zhí)行代碼駐留的存儲器區(qū)/頁保持在“可執(zhí)行”狀態(tài)。在再其它實施方案中,為了改善性能,在最后η個函數(shù)調(diào)用中使用的存儲器頁保持在“可執(zhí)行”存儲器狀態(tài)中。
[0091]圖12是說明用于實施準許在需要或調(diào)用存儲器區(qū)域時修改存儲器區(qū)域的狀態(tài)的間接層的方法。此方法可在操作系統(tǒng)層級或在應用程序?qū)蛹墝嵤???稍趹贸绦虻膱?zhí)行期間攔截函數(shù)調(diào)用(例如,對存儲器中的可執(zhí)行代碼的調(diào)用)1202。在加載/執(zhí)行被調(diào)用函數(shù)之前,間接層可將與用于被調(diào)用函數(shù)的可執(zhí)行代碼相關(guān)聯(lián)的存儲器狀態(tài)從不可執(zhí)行改變?yōu)榭蓤?zhí)行1204。處理電路隨后可獲取和/或執(zhí)行用于被調(diào)用函數(shù)的可執(zhí)行代碼1206。根據(jù)一個特征,處理電路可跟蹤嵌套條目和/或從可執(zhí)行代碼退出以確認何時函數(shù)調(diào)用完成1208。在被調(diào)用函數(shù)的完成后,間接層可即刻將與用于被調(diào)用函數(shù)的可執(zhí)行代碼相關(guān)聯(lián)的存儲器狀態(tài)從可執(zhí)行改變?yōu)椴豢蓤?zhí)行1210。
[0092]圖13說明用于在應用程序內(nèi)實施允許修改應用程序可執(zhí)行代碼駐留的存儲器區(qū)域的狀態(tài)以保護對此些存儲器區(qū)域的存取的間接層的方法。可產(chǎn)生包含多個函數(shù)的應用程序源代碼1302。也可針對源代碼中的每一函數(shù)產(chǎn)生間接代碼1304??商砑又噶钜灾率乖创a在加載到存儲器中時經(jīng)識別為不可執(zhí)行1306。也可添加指令以致使間接代碼在加載到存儲器中時經(jīng)識別為可執(zhí)行1308??稍谔幚黼娐诽幾儞Q(例如,編譯)源代碼和間接代碼以產(chǎn)生可執(zhí)行代碼1310??蓤?zhí)行代碼可對應于單個應用程序和/或進程。間接存根可在可執(zhí)行代碼的編譯階段或預編譯階段產(chǎn)生??删幾g源代碼和間接代碼以使得其在加載到存儲器中用于執(zhí)行時駐留于單獨的存儲器頁中。舉例來說,與第一函數(shù)相關(guān)聯(lián)的第一間接代碼適于指向第一函數(shù),其中當產(chǎn)生可執(zhí)行代碼時,編譯第一間接代碼和第一函數(shù)以加載于不同存儲器頁中。
[0093]在一個實例中,第一間接代碼可致使在調(diào)用對應第一函數(shù)以執(zhí)行時將第一函數(shù)的存儲器狀態(tài)指示符從不可執(zhí)行狀態(tài)切換到可執(zhí)行狀態(tài)。
[0094]在另一實例中,第一間接代碼致使在對應第一函數(shù)終止執(zhí)行時將第一函數(shù)的存儲器狀態(tài)指示符從可執(zhí)行狀態(tài)切換到不可執(zhí)行狀態(tài)。
[0095]在示范性實施方案中,圖8、9、10、12和/或13中揭示的一或多個特征可在一或多個處理器中并行(例如,同時)和/或串行(例如,循序地)實施。在多個處理器執(zhí)行一或多個步驟的情況下,多個處理器中的每一者可實施不同步驟、相同步驟和/或步驟的子集。
[0096]在本文說明的示范性實施方案的一些實施方案中,間接層的函數(shù)可實施為在應用程序的編譯之前、期間和/或之后添加到應用程序的相異指令/代碼。然而,其它實施方案可再使用指令集中的現(xiàn)存指令和/或避免在可執(zhí)行與不可執(zhí)行狀態(tài)之間切換。
[0097]在另一示范性實施方案中,“間接層”可實施為指令集中的一組兩個(或兩個以上)互補指令。舉例來說,處理器可經(jīng)配置以使得當執(zhí)行第一指令時,除了接下來的第二指令之外處理器拒絕獲取任何指令。此配置可在內(nèi)部完成(例如,硬連線到處理器中)或通過例如加載到處理器中的指令完成(例如,加載器配置)。如果第二指令是在第一指令的執(zhí)行之后將到來的,那么處理器繼續(xù)執(zhí)行。否則,處理器可中止或復位執(zhí)行。在此方法中,設定含有可執(zhí)行代碼的存儲器片段的“不可執(zhí)行”狀態(tài)可為任選的和/或不必要的。舉例來說,并非具有圖5中的單獨傳入/傳出存根540,應用程序內(nèi)的函數(shù)調(diào)用指令(即,第一指令)限于僅跟隨有被調(diào)用函數(shù)的初始指令(即,第二指令)。如果處理器注意到除了初始指令之外的任何其它指令跟隨函數(shù)調(diào)用指令,那么其中止執(zhí)行。此函數(shù)調(diào)用指令(第一指令)和初始指令(第二指令)可為添加到指令集的新/特殊指令?;蛘撸呀?jīng)是指令集的部分的普通指令可用于此目的,但其中可使用位或標記來表示第一指令必須跟隨有第二指令。以此方式,處理器可檢查此指令序列且在除了第二指令之外的任何指令跟隨第一指令(例如,在返回定向攻擊的情況中那樣)的情況下中止執(zhí)行。
[0098]在此互補指令對的一個實例中,第一指令可充當“調(diào)用”(例如,以調(diào)用特定函數(shù)),而第二指令可充當可置于函數(shù)入口處的“岸”。在一個實例中,此指令對可在指令集內(nèi)具體界定為互補指令,其中第二指令必須跟隨第一指令,否則處理器便中止執(zhí)行。在一個實例中,可存在兩組此類指令,用于起始函數(shù)調(diào)用的第一對指令(例如,傳入存根)和用于退出/終止函數(shù)調(diào)用(例如,傳出存根)的第二對指令。
[0099]在替代實例中,替代于使用兩個專用指令(例如,互補的第一和第二指令),可以用以指示普通指令是否為存根指令的專用位來編碼或標記所述普通指令。舉例來說,普通第一指令(例如,“調(diào)用”指令)在其用以加載函數(shù)的情況下可具有位/標記設定。類似地,普通第二指令(例如,“岸”指令)在其用作函數(shù)加載的部分的情況下可具有類似的位/標記設定。因此,處理器可在執(zhí)行第一和/或第二指令時檢查此位/標記以確保其循序執(zhí)行,否則中止執(zhí)行。應注意,第一指令(例如,“調(diào)用”指令)可為各種類型的指令,包含跳轉(zhuǎn)(JMP)指令、加載指令等等。類似地,在相反操作中(例如,當完成函數(shù)時),第一指令可為各種類型的指令,包含返回指令、結(jié)束指令等等。
[0100]應注意,在一個實例中,“調(diào)用”函數(shù)的執(zhí)行可致使處理器將被調(diào)用函數(shù)駐留的存儲器片段/頁的狀態(tài)從不可執(zhí)行狀態(tài)自動切換到可執(zhí)行狀態(tài)。在完成被調(diào)用函數(shù)的執(zhí)行后,顛倒操作且將存儲器片段/頁設定回到不可執(zhí)行狀態(tài)。在替代實施例中,完全不將存儲器片段/頁標記為不可執(zhí)行。而是,函數(shù)調(diào)用指令(第一指令)必須跟隨有被調(diào)用函數(shù)的初始指令(第二指令)的限制可阻礙返回定向編程攻擊。這禁止返回定向編程攻擊選擇性跳轉(zhuǎn)到存儲器中的特定指令中,因為調(diào)用指令限于跟隨有登陸指令。
[0101]所展示和描述的特定實施方案僅是實例且不應闡釋為實施本發(fā)明的僅有方式,除非本文另外指定。所屬領域的技術(shù)人員容易了解,本發(fā)明中的各種實例可通過許多其它分割解決方案來實踐。
[0102]本文描述且在圖中圖解說明的組件、動作、特征和/或功能中的一者或一者以上可經(jīng)重新布置和/或組合為單個組件、動作、特征或功能或者在若干組件、動作、特征或功能中體現(xiàn)。在不脫離本發(fā)明的情況下也可添加額外元件、部件、動作和/或功能。本文描述的算法可以軟件有效地實施和/或嵌入硬件中。
[0103]在描述中,可以框圖形式展示元件、電路和功能,以免用不必要的細節(jié)混淆本發(fā)明。相反,所展示和描述的特定實施方案僅是示范性的且不應闡釋為實施本發(fā)明的僅有方式,除非本文另外指定。另外,塊界定以及各種塊之間的邏輯的分割是特定實施方案的示范。所屬領域的技術(shù)人員容易了解,本發(fā)明可通過許多其它分割解決方案來實踐。對于大部分,已經(jīng)省略關(guān)于時序考慮和類似的細節(jié),其中此些細節(jié)對于獲得本發(fā)明的完整理解不是必要的,且在所屬領域的技術(shù)人員的能力以內(nèi)。
[0104]還注意到,可將實施例描述為過程,所述過程描繪為流程圖、流圖、結(jié)構(gòu)圖或框圖。雖然流程圖可將操作描述為順序過程,但操作中的許多可并行地或同時地執(zhí)行。另外,可重新布置操作的次序。當過程的操作完成時,過程終止。過程可對應于方法、函數(shù)、程序、子例程、子程序等等。當過程對應于函數(shù)時,其終止對應于所述函數(shù)到調(diào)用函數(shù)或主函數(shù)的返回。
[0105]所屬領域的技術(shù)人員將了解,可使用多種不同技藝和技術(shù)中的任一種來表示信息和信號。舉例來說,可通過電壓、電流、電磁波、磁場或磁性粒子、光場或光學粒子或者其任何組合來表示整個本描述中可能參考的數(shù)據(jù)、指令、命令、信息、信號、位、符號和碼片。一些圖式可能為了呈現(xiàn)和描述的清楚而將信號圖解說明為單個信號。所屬領域的技術(shù)人員將了解,信號可表示信號總線,其中總線可具有多種位寬度,且本發(fā)明可在任一數(shù)目的數(shù)據(jù)信號上實施,包含單個數(shù)據(jù)信號。
[0106]應理解,本文使用例如“第一”、“第二”等標示對元件的任何參考均不限制這些元件的數(shù)量或次序,除非明確陳述此限制。實際上,這些標示在本文可用作在兩個或兩個以上元件或一元件的若干實例之間進行區(qū)分的方便方法。因此,對第一和第二元件的參考不意味著該處僅可采用兩個元件或第一元件必須以某種方式在第二元件之前。另外,除非另外陳述,否則一組元件可包括一個或一個以上元件。
[0107]而且,存儲媒體可表示用于存儲數(shù)據(jù)的一個或一個以上裝置,包含用于存儲信息的只讀存儲器(ROM)、隨機存取存儲器(RAM)、磁盤存儲媒體、光學存儲媒體、快閃存儲器裝置和/或其它機器可讀媒體,以及處理器可讀媒體和/或計算機可讀媒體。術(shù)語“機器可讀媒體”、“計算機可讀媒體”和/或“處理器可讀媒體”可包含(但不限于)能夠存儲、含有或載運指令和/或數(shù)據(jù)的非暫時性媒體,例如便攜式或固定存儲裝置、光學存儲裝置和各種其它媒體。因此,本文描述的各種方法可完全地或部分地由可存儲在“機器可讀媒體”、“計算機可讀媒體”和/或“處理器可讀媒體”中且由一個或一個以上處理器、機器和/或裝置執(zhí)行的指令和/或數(shù)據(jù)實施。
[0108]此外,實施例可通過硬件、軟件、固件、中間件、微碼或其任一組合來實施。當以軟件、固件、中間件或微碼實施時,用以執(zhí)行必要任務的程序代碼或代碼段可存儲在例如存儲媒體等機器可讀媒體或其它存儲裝置中。處理器可執(zhí)行所述必要任務。代碼段可表示過程、函數(shù)、子程序、程序、例程、子例程、模塊、軟件包、類或指令、數(shù)據(jù)結(jié)構(gòu)或程序語句的任一組合。代碼段可通過傳遞和/或接收信息、數(shù)據(jù)、自變量、參數(shù)或存儲器內(nèi)容而耦合到另一代碼段或硬件電路。信息、自變量、參數(shù)、數(shù)據(jù)等等可經(jīng)由任一合適手段傳遞、轉(zhuǎn)發(fā)或發(fā)射,所述手段包含存儲器共享、消息傳遞、令牌傳遞、網(wǎng)絡發(fā)射等等。
[0109]結(jié)合本文所揭示的實例描述的各種說明性邏輯塊、模塊、電路、元件和/或組件可用經(jīng)設計以執(zhí)行本文描述的功能的通用處理器、數(shù)字信號處理器(DSP)、專用集成電路(ASIC)、現(xiàn)場可編程門陣列(FPGA)或其它可編程邏輯組件、離散門或晶體管邏輯、離散硬件組件或其任何組合來實施或執(zhí)行。通用處理器可以是微處理器,但在替代方案中,所述處理器可以是任何常規(guī)處理器、控制器、微控制器或狀態(tài)機。處理器還可實施為計算組件的組合,例如DSP與微處理器的組合、若干微處理器、結(jié)合DSP核心的一個或一個以上微處理器或任何其它此類配置。經(jīng)配置以用于執(zhí)行本文描述的實施例的通用處理器視為用于實行此些實施例的專用處理器。類似地,通用計算機在經(jīng)配置以用于實行本文描述的實施例時視為專用計算機。
[0110]結(jié)合本文所揭示的實例描述的方法或算法可直接以硬件、以由處理器執(zhí)行的軟件模塊或以所述兩者的組合以處理單元、編程指令或其它指示的形式來實施,且可包含在單個裝置中或分布于多個裝置上。軟件模塊可駐留在RAM存儲器、快閃存儲器、ROM存儲器、EPROM存儲器、EEPROM存儲器、寄存器、硬盤、可裝卸式盤、⑶-ROM或此項技術(shù)中已知的任何其它形式的存儲媒體中。存儲媒體可耦合到處理器,使得處理器可從存儲媒體讀取信息和向存儲媒體寫入信息。在替代方案中,存儲媒體可與處理器成一體式。
[0111]所屬領域的技術(shù)人員將進一步了解,結(jié)合本文所揭示的實施例描述的各種說明性邏輯塊、模塊、電路和算法步驟可實施為電子硬件、計算機軟件或所述兩者的組合。為了清楚地說明硬件與軟件的這種可交換性,上文已大體上在其功能性方面描述了各種說明性組件、塊、模塊、電路和步驟。將此類功能性實施為硬件、軟件還是其組合取決于特定應用和對整個系統(tǒng)施加的設計選擇。
[0112]本文描述的本發(fā)明的各種特征可在不同系統(tǒng)中實施而不脫離本發(fā)明。應注意,前述實施例僅是實例且不應解釋為限制本發(fā)明。實施例的描述既定為說明性的,且將不限制權(quán)利要求書的范圍。由此,本發(fā)明教示可容易應用于其它類型的設備,且所屬領域的技術(shù)人員將了解許多替代例、修改和變化。
【權(quán)利要求】
1.一種在處理電路中操作的方法,其包括: 將存儲器裝置中的可執(zhí)行代碼的多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài); 將所述多個存儲器頁的第二子集的所述狀態(tài)指示符設定為可執(zhí)行狀態(tài),其中所述多個存儲器頁的所述第二子集包含到所述多個存儲器頁的所述第一子集中的函數(shù)的間接存根;以及 將函數(shù)調(diào)用引導到所述多個存儲器頁的所述第二子集中的對應間接存根,所述間接存根在引導來自所述多個存儲器頁的所述第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的所述第一子集中的對應函數(shù)的所述狀態(tài)指示符。
2.根據(jù)權(quán)利要求1所述的方法,其中所述可執(zhí)行代碼對應于單個應用程序和/或進程。
3.根據(jù)權(quán)利要求1所述的方法,其進一步包括: 在所述多個存儲器頁的所述第一子集或第二子集中的至少一者的所述狀態(tài)指示符已設定為所述不可執(zhí)行狀態(tài)之后將可執(zhí)行代碼的所述多個存儲器頁加載到所述存儲器裝置中。
4.根據(jù)權(quán)利要求1所述的方法,其進一步包括: 在所述多個存儲器 頁的所述第一子集或第二子集中的至少一者的所述狀態(tài)指示符已設定為所述不可執(zhí)行狀態(tài)之前將可執(zhí)行代碼的所述多個存儲器頁加載到所述存儲器裝置中。
5.根據(jù)權(quán)利要求1所述的方法,其中所述可執(zhí)行代碼所駐留的所述存儲器裝置實施虛擬存儲器。
6.根據(jù)權(quán)利要求1所述的方法,其進一步包括: 實行駐留于所述多個存儲器頁的所述第一子集中的可執(zhí)行代碼的執(zhí)行阻止。
7.根據(jù)權(quán)利要求6所述的方法,其中實行執(zhí)行阻止包含 當所述處理電路獲取所述可執(zhí)行代碼供執(zhí)行時中止駐留于處于所述不可執(zhí)行狀態(tài)的存儲器頁中的任何可執(zhí)行代碼的執(zhí)行。
8.根據(jù)權(quán)利要求1所述的方法,其中所述間接存根將所述多個存儲器頁的所述第一子集中的所述對應函數(shù)的所述狀態(tài)指示符從所述不可執(zhí)行狀態(tài)修改為所述可執(zhí)行狀態(tài)以啟用所述函數(shù)的執(zhí)行。
9.根據(jù)權(quán)利要求1所述的方法,其進一步包括: 在完成所述函數(shù)調(diào)用后即刻返回到所述多個存儲器頁的所述第二子集中的所述對應間接存根,其中所述對應間接存根隨后修改所述多個存儲器頁的所述第一子集中的所述對應函數(shù)的所述狀態(tài)指示符。
10.根據(jù)權(quán)利要求9所述的方法,其中所述間接存根將所述多個存儲器頁的所述第一子集中的所述對應函數(shù)的所述狀態(tài)指示符從所述可執(zhí)行狀態(tài)修改為所述不可執(zhí)行狀態(tài)以停用所述函數(shù)的執(zhí)行。
11.根據(jù)權(quán)利要求1所述的方法,其進一步包括: 在完成所述函數(shù)調(diào)用后即刻沖刷所述處理電路的內(nèi)部高速緩存存儲器。
12.根據(jù)權(quán)利要求1所述的方法,其中所述間接存根在所述可執(zhí)行代碼的編譯階段或預編譯階段產(chǎn)生。
13.根據(jù)權(quán)利要求1所述的方法,其中所述對應間接存根包含限于由所述處理電路循序執(zhí)行的至少第一指令和第二指令。
14.根據(jù)權(quán)利要求13所述的方法,其進一步包括: 在所述第一指令后跟隨有除了所述第二指令之外的任一指令的情況下中止所述函數(shù)調(diào)用的執(zhí)行。
15.根據(jù)權(quán)利要求13所述的方法,其中所述第一指令是所述函數(shù)調(diào)用的部分且所述第二指令是所述對應函數(shù)的初始指令。
16.根據(jù)權(quán)利要求15所述的方法,其中通過將所述第一指令綁定到所述第二指令以使得如果所述第一指令后不跟隨有所述第二指令即中止執(zhí)行來實施所述間接存根。
17.根據(jù)權(quán)利要求1所述的方法,其中用于所述函數(shù)的代碼駐留于所述多個存儲器頁的所述第一子集內(nèi)的第一存儲器頁中,且所述方法進一步包括: 跟蹤處于所述可執(zhí)行狀態(tài)的所述第一存儲器頁的使用; 確認何時所有進行中函數(shù)調(diào)用已完成執(zhí)行所述第一存儲器頁內(nèi)的對應代碼;以及 在完成最后進行中函數(shù)調(diào)用后即刻將所述第一存儲器頁的所述狀態(tài)指示符設定于不可執(zhí)行狀態(tài)。
18.一種處理裝置,其包括: 存儲器裝置;以及 處理電路,其耦合到所述存儲器裝置,所述處理電路經(jīng)配置以 將所述存儲器裝置中的可執(zhí)行代碼的多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài); 將所述多個存儲器頁的第二子集的所述狀態(tài)指示符設定為可執(zhí)行狀態(tài),其中所述多個存儲器頁的所述第二子集包含到所述多個存儲器頁的所述第一子集中的函數(shù)的間接存根;以及 將函數(shù)調(diào)用引導到所述多個存儲器頁的所述第二子集中的對應間接存根,所述間接存根在引導來自所述多個存儲器頁的所述第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的所述第一子集中的對應函數(shù)的所述狀態(tài)指示符。
19.根據(jù)權(quán)利要求18所述的處理裝置,其中所述處理電路進一步經(jīng)配置以: 實行駐留于所述多個存儲器頁的所述第一子集中的可執(zhí)行代碼的執(zhí)行阻止。
20.根據(jù)權(quán)利要求19所述的處理裝置,其中實行執(zhí)行阻止,所述處理電路進一步經(jīng)配置以: 當所述處理電路獲取所述可執(zhí)行代碼供執(zhí)行時中止駐留于處于所述不可執(zhí)行狀態(tài)的存儲器頁中的任何可執(zhí)行代碼的執(zhí)行。
21.根據(jù)權(quán)利要求18所述的處理裝置,其中所述間接存根將所述多個存儲器頁的所述第一子集中的所述對應函數(shù)的所述狀態(tài)指示符從所述不可執(zhí)行狀態(tài)修改為所述可執(zhí)行狀態(tài)以啟用所述函數(shù)的執(zhí)行。
22.根據(jù)權(quán)利要求18所述的處理裝置,其中所述處理電路進一步經(jīng)配置以: 在完成所述函數(shù)調(diào)用后即刻返回到所述多個存儲器頁的所述第二子集中的所述對應間接存根,其中所述對應間接存根隨后修改所述多個存儲器頁的所述第一子集中的所述對應函數(shù)的所述狀態(tài)指示符。
23.根據(jù)權(quán)利要求18所述的處理裝置,其中所述間接存根將所述多個存儲器頁的所述第一子集中的所述對應函數(shù)的所述狀態(tài)指示符從所述可執(zhí)行狀態(tài)修改為所述不可執(zhí)行狀態(tài)以停用所述函數(shù)的執(zhí)行。
24.根據(jù)權(quán)利要求18所述的處理裝置,其中所述對應間接存根包含限于由所述處理電路循序執(zhí)行的至少第一指令和第二指令,其中所述處理電路進一步經(jīng)配置以: 在所述第一指令后跟隨有除了所述第二指令之外的任一指令的情況下中止所述函數(shù)調(diào)用的執(zhí)行。
25.—種處理裝置,其包括: 用于將可執(zhí)行代碼的多個存儲器頁 加載到存儲器裝置中的裝置; 用于將所述多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài)的裝置; 用于將所述多個存儲器頁的第二子集的所述狀態(tài)指示符設定為可執(zhí)行狀態(tài)的裝置,其中所述多個存儲器頁的所述第二子集包含到所述多個存儲器頁的所述第一子集中的函數(shù)的間接存根;以及 用于將函數(shù)調(diào)用引導到所述多個存儲器頁的所述第二子集中的對應間接存根的裝置,所述間接存根在引導來自所述多個存儲器頁的所述第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的所述第一子集中的對應函數(shù)的所述狀態(tài)指示符。
26.一種其上存儲有指令的處理器可讀媒體,所述指令在由至少一個處理器執(zhí)行時致使所述至少一個處理器: 將存儲器裝置中的可執(zhí)行代碼的多個存儲器頁的第一子集的狀態(tài)指示符設定為不可執(zhí)行狀態(tài); 將所述多個存儲器頁的第二子集的所述狀態(tài)指示符設定為可執(zhí)行狀態(tài),其中所述多個存儲器頁的所述第二子集包含到所述多個存儲器頁的所述第一子集中的函數(shù)的間接存根;以及 將函數(shù)調(diào)用引導到所述多個存儲器頁的所述第二子集中的對應間接存根,所述間接存根在引導來自所述多個存儲器頁的所述第一子集的被調(diào)用函數(shù)的執(zhí)行之前修改所述多個存儲器頁的所述第一子集中的對應函數(shù)的所述狀態(tài)指示符。
27.一種在處理電路中操作的方法,其包括: 產(chǎn)生包含多個函數(shù)的應用程序源代碼; 產(chǎn)生用于所述源代碼中的每一函數(shù)的間接代碼; 添加指令以致使所述源代碼在加載到存儲器中時經(jīng)識別為不可執(zhí)行; 添加指令以致使所述間接代碼在加載到存儲器中時經(jīng)識別為可執(zhí)行;以及 在所述處理電路處變換所述源代碼和間接代碼以產(chǎn)生可執(zhí)行代碼。
28.根據(jù)權(quán)利要求27所述的方法,其中所述可執(zhí)行代碼對應于單個應用程序和/或進程。
29.根據(jù)權(quán)利要求27所述的方法,其中所述間接存根在所述可執(zhí)行代碼的編譯階段或預編譯階段產(chǎn)生。
30.根據(jù)權(quán)利要求27所述的方法,其中編譯所述源代碼和間接代碼以使得所述源代碼和間接代碼在加載到存儲器中時駐留于單獨的存儲器頁中。
31.根據(jù)權(quán)利要求27所述的方法,其中第一間接代碼致使在調(diào)用對應第一函數(shù)以供執(zhí)行時將所述第一函數(shù)的存儲器狀態(tài)指示符從不可執(zhí)行狀態(tài)切換到可執(zhí)行狀態(tài)。
32.根據(jù)權(quán)利要求27所述的方法,其中第一間接代碼致使在對應第一函數(shù)終止執(zhí)行時將所述第一函數(shù)的存儲器狀態(tài)指示符從可執(zhí)行狀態(tài)切換到不可執(zhí)行狀態(tài)。
33.根據(jù)權(quán)利要求27所述的方法,其中與第一函數(shù)相關(guān)聯(lián)的第一間接代碼適于指向所述第一函數(shù),其中當產(chǎn)生所述可執(zhí)行代碼時,編譯所述第一間接代碼和第一函數(shù)以加載于不同存儲器頁中。
34.根據(jù)權(quán)利要求27所述的方法,其中所述間接代碼包含限于由處理電路循序執(zhí)行的至少第一指令和第二指令。
35.根據(jù)權(quán)利要求27所述的方法,其進一步包括: 添加指令以致使在所述第一指令后跟隨有除了所述第二指令之外的任一指令的情況下中止所述間接代碼的執(zhí)行。
36.一種其上存儲有指令的處理器可讀媒體,所述指令在由至少一個處理器執(zhí)行時致使所述至少一個處理器: 產(chǎn)生包含多個函數(shù)的應用程序源代碼; 產(chǎn)生用于所述源代碼中的每一函數(shù)的間接代碼; 添加指令以致使所述 源代碼在加載到存儲器中時經(jīng)識別為不可執(zhí)行; 添加指令以致使所述間接代碼在加載到存儲器中時經(jīng)識別為可執(zhí)行;以及 在所述處理電路處變換所述源代碼和間接代碼以產(chǎn)生可執(zhí)行代碼。
37.根據(jù)權(quán)利要求36所述的處理器可讀媒體,其中所述可執(zhí)行代碼對應于單個應用程序和/或進程。
38.根據(jù)權(quán)利要求36所述的處理器可讀媒體,其中所述間接存根在所述可執(zhí)行代碼的編譯階段或預編譯階段產(chǎn)生。
39.根據(jù)權(quán)利要求36所述的處理器可讀媒體,其中第一間接代碼致使在調(diào)用對應第一函數(shù)以供執(zhí)行時將所述第一函數(shù)的存儲器狀態(tài)指示符從不可執(zhí)行狀態(tài)切換到可執(zhí)行狀態(tài)。
40.根據(jù)權(quán)利要求36所述的處理器可讀媒體,其中第一間接代碼致使在對應第一函數(shù)終止執(zhí)行時將所述第一函數(shù)的存儲器狀態(tài)指示符從可執(zhí)行狀態(tài)切換到不可執(zhí)行狀態(tài)。
【文檔編號】G06F21/54GK104054061SQ201380005427
【公開日】2014年9月17日 申請日期:2013年1月15日 優(yōu)先權(quán)日:2012年1月16日
【發(fā)明者】阿倫·巴拉克里沙南, 亞歷山大·甘特曼, 葛仁偉, 丹尼爾·科馬羅米, 毛憶念, 阿南德·帕拉尼古德, 布萊恩·M·羅森貝格 申請人:高通股份有限公司