專利名稱:用于逐模塊驗(yàn)證的對(duì)非置信模塊的高速緩存的制作方法
本申請(qǐng)涉及Yellin和Gosling于1995年12月20日提交的,題為"具有數(shù)據(jù)類型限制和對(duì)象初始化的預(yù)驗(yàn)證的字節(jié)代碼程序解釋器裝置和方法"的美國(guó)專利申請(qǐng)序號(hào)No.575,291(PL000),現(xiàn)在是美國(guó)專利No.5,740,441;Bracha和Liang于1998年8月14日提交的,題為"用于類型安全、遲緩、用戶定義的類裝載的方法和裝置"的美國(guó)專利申請(qǐng)序號(hào)No.09/134,477(P3135);在此作為一個(gè)整體引入這些公開(kāi)作為參考。
本申請(qǐng)還涉及1999年5月27日提交的,題為"完全遲緩鏈接"的美國(guó)專利申請(qǐng)序號(hào)No.09/321,223[50253-228](P3564);1999年5月27日提交的,題為"逐模塊驗(yàn)證"的美國(guó)專利申請(qǐng)序號(hào)No.09/320,574[50253-229](P3565);1999年5月27日提交的,題為"具有逐模塊驗(yàn)證的完全遲緩鏈接"的美國(guó)專利申請(qǐng)序號(hào)No.09/321,226[50253-230](P3566);1999年5月27日提交的,題為"用于最低上界類型的符號(hào)計(jì)算的數(shù)據(jù)流算法"的美國(guó)專利申請(qǐng)序號(hào)No.09/321,228[50253-236](P3809)。
本發(fā)明涉及計(jì)算機(jī)編程語(yǔ)言,特別是具有驗(yàn)證指令的動(dòng)態(tài)鏈接同時(shí)支持遲緩裝載的計(jì)算機(jī)編程語(yǔ)言。
通常,以人們易于理解的高級(jí)語(yǔ)言將計(jì)算機(jī)程序編寫(xiě)為源代碼語(yǔ)句。在實(shí)際執(zhí)行計(jì)算機(jī)程序時(shí),計(jì)算機(jī)響應(yīng)由直接控制中央處理單元(CPU)操作的二進(jìn)制信號(hào)構(gòu)成的指令組成的機(jī)器碼。使用被稱為編譯程序的專用程序讀取源代碼并將其語(yǔ)句轉(zhuǎn)換成具體CPU的機(jī)器碼指令在本領(lǐng)域中是熟知的。所產(chǎn)生的機(jī)器碼指令是依賴于平臺(tái)的,就是說(shuō),不同的計(jì)算機(jī)設(shè)備具有帶有由不同機(jī)器碼表示的不同指令集的不同CPU 。
通過(guò)組合幾個(gè)比較簡(jiǎn)單的程序構(gòu)成更強(qiáng)大的程序在本領(lǐng)域中也是已知的??赏ㄟ^(guò)在編譯前將幾段源代碼復(fù)制在一起,然后編譯組合的源代碼來(lái)進(jìn)行該組合。當(dāng)頻繁使用一段源代碼語(yǔ)句而沒(méi)有改變時(shí),通常最好是由其自身將其編譯一次,以產(chǎn)生一個(gè)模塊,并且僅當(dāng)實(shí)際需要該功能塊時(shí)將該模塊與其它模塊組合。這種編譯后的模塊組合被稱為鏈接。剛好在執(zhí)行之前,當(dāng)依據(jù)運(yùn)行時(shí)間狀況決定組合哪些模塊并且模塊組合發(fā)生在運(yùn)行時(shí)間時(shí),該鏈接被稱為動(dòng)態(tài)鏈接。
鏈接的優(yōu)點(diǎn)在于可一次一個(gè)模塊地開(kāi)發(fā)程序,并由于不同開(kāi)發(fā)者能夠在不同地點(diǎn)同時(shí)開(kāi)發(fā)不同模塊,因此能夠提高生產(chǎn)率。
在運(yùn)行時(shí)間進(jìn)行的鏈接,即當(dāng)執(zhí)行程序時(shí)的動(dòng)態(tài)鏈接的優(yōu)點(diǎn)在于不需要鏈接執(zhí)行期間不使用的模塊,從而減少了必須執(zhí)行的工作量,并且很可能減少執(zhí)行代碼的規(guī)模。通常,在鏈接前必須裝載模塊,即識(shí)別并將其引入存儲(chǔ)器。將模塊鏈接延緩到直到需要該模塊為止將允許延期裝載這些模塊,并稱其為遲緩裝載。
當(dāng)匯編幾個(gè)已經(jīng)獨(dú)立編寫(xiě)的模塊時(shí),謹(jǐn)慎的作法是,檢驗(yàn)在其自己的全部范圍內(nèi)正確地執(zhí)行每個(gè)模塊,即模塊內(nèi)檢驗(yàn),以及多個(gè)模塊一起正確地工作,即模塊間檢驗(yàn)。從JAVATM編程語(yǔ)言的設(shè)計(jì)者使用的術(shù)語(yǔ)推論,這種后編譯模塊檢驗(yàn)可被稱為驗(yàn)證。
得益于動(dòng)態(tài)鏈接的計(jì)算機(jī)體系結(jié)構(gòu)的一個(gè)實(shí)例是如SunMicrosystems,Inc的JAVATM虛擬機(jī)(JVM)之類的虛擬機(jī)(VM),這是一種可用硬件或軟件實(shí)現(xiàn)的抽象計(jì)算機(jī)體系結(jié)構(gòu)。在下面的VM描述中包括了規(guī)定的任何一種實(shí)現(xiàn)方案。
VM可以以下面的方式提供平臺(tái)獨(dú)立性。把如JAVATM編程語(yǔ)言之類的高級(jí)計(jì)算語(yǔ)言中表示的語(yǔ)句編譯成獨(dú)立于系統(tǒng)的VM指令。VM指令對(duì)VM的關(guān)系正如機(jī)器碼對(duì)中央處理單元(CPU)的關(guān)系。然后可將VM指令從一臺(tái)機(jī)器傳送到另一臺(tái)機(jī)器。每個(gè)不同的處理器需要其自己的VM實(shí)現(xiàn)。VM通過(guò)一次一條或多條指令地對(duì)VM指令進(jìn)行翻譯或解釋來(lái)運(yùn)行VM指令。在許多實(shí)現(xiàn)中,該VM是在特定計(jì)算機(jī)的CPU上運(yùn)行的程序,但VM指令也可用作特定處理器或設(shè)備的本機(jī)指令集。在后一種情況下,VM是一臺(tái)"實(shí)際"的機(jī)器。包括動(dòng)態(tài)鏈接和驗(yàn)證的VM也可進(jìn)行其它操作。
使用該VM的編程處理有兩個(gè)與其相關(guān)聯(lián)的時(shí)間紀(jì)元;"編譯時(shí)間"是指將高級(jí)語(yǔ)言轉(zhuǎn)換成VM指令的步驟,"運(yùn)行時(shí)間"是指在JAVATMVM環(huán)境中解釋指令以執(zhí)行該模塊的步驟。在編譯時(shí)間與運(yùn)行時(shí)間之間,從語(yǔ)句編譯的指令模塊可在延長(zhǎng)的、任意時(shí)間周期內(nèi)駐留待用,或可從一個(gè)存儲(chǔ)裝置傳送到另一個(gè)存儲(chǔ)裝置,包括跨網(wǎng)絡(luò)傳送。
JAVATM虛擬機(jī)的實(shí)例可說(shuō)明實(shí)現(xiàn)具有驗(yàn)證和具有或沒(méi)有遲緩裝載的動(dòng)態(tài)鏈接的嘗試中所遇到的問(wèn)題。JVM是一種面向?qū)ο蟮腏AVATM高級(jí)編程語(yǔ)言的特定VM,如T.Lindholm和Frank Yellin,Addison-Wesley,Menlo Park于1997年在California的JAVATM虛擬機(jī)說(shuō)明書(shū)中對(duì)常規(guī)JVM所描述的,這種JAVATM高級(jí)編程語(yǔ)言被設(shè)計(jì)用來(lái)執(zhí)行動(dòng)態(tài)鏈接、驗(yàn)證和遲緩裝載。
面向?qū)ο蟮木幊碳夹g(shù)被廣泛使用,例如JAVATM平臺(tái)使用的那些面向?qū)ο缶幊碳夹g(shù)。面向?qū)ο蟪绦虻幕締卧菍?duì)象,其具有方法(過(guò)程)和域(數(shù)據(jù)),在此被稱為成員。將共享成員的對(duì)象分組成類。一個(gè)類定義了在該類中對(duì)象的共享成員。每個(gè)對(duì)象則是其所屬類的一個(gè)特定實(shí)例。實(shí)際上,經(jīng)常將一個(gè)類用作模板,以便產(chǎn)生具有相似特性的多個(gè)對(duì)象(多個(gè)實(shí)例)。
這些類的一個(gè)特性是封裝,描述了除非通過(guò)接口暴露外,使外部用戶,和其它類無(wú)法察覺(jué)該類中的成員的實(shí)際實(shí)現(xiàn)的特性。這使得這些類適合于分布式開(kāi)發(fā),例如,由不同的開(kāi)發(fā)者在網(wǎng)絡(luò)上的不同地點(diǎn)開(kāi)發(fā)。通過(guò)匯編所需的類,把它們鏈接在一起,并執(zhí)行得到的程序可形成一個(gè)完整的程序。
類享有繼承的特性。繼承是能使一個(gè)類繼承另一個(gè)類的所有成員的機(jī)理。從另一個(gè)類繼承的類被稱為子類;提供該屬性的類是超類??捎梅?hào)將其寫(xiě)成子類<=超類,或超類=>子類。子類可通過(guò)增加附加成員來(lái)擴(kuò)展超類的容量。子類可通過(guò)提供具有相同名稱和類型的替代成員來(lái)超越超類的屬性。
JVM以用于編譯的類的特定二進(jìn)制格式,即類文件格式操作。類文件包含JVM指令和符號(hào)表,以及其它輔助信息。為安全起見(jiàn),JVM對(duì)類文件中的指令施加強(qiáng)格式和結(jié)構(gòu)約束。在特定實(shí)例中,JVM指令是類型專用的,意圖在于對(duì)如下面說(shuō)明的給定類型的操作數(shù)操作??捎扇魏蜼M施加同樣的約束。JVM可作為具有可通過(guò)有效類文件表示的功能性的任何語(yǔ)言的宿主。設(shè)計(jì)類文件來(lái)處理可表示以JAVATM編程語(yǔ)言寫(xiě)成的程序的面向?qū)ο蠼Y(jié)構(gòu),而且也支持幾種其它編程語(yǔ)言。
在類文件中,變量是已與一種類型相關(guān)聯(lián)的存儲(chǔ)位置,該類型有時(shí)被稱為其編譯時(shí)間類型,其是原始類型或引用類型。引用類型是到對(duì)象或是不指向?qū)ο蟮膶S每找玫闹羔?。子類的類型被稱為其超類的子類型。JVM的原始類型包括boolean(取真值為真和假),char(用于單一代碼字符的代碼),byte(8個(gè)帶有符號(hào)的0或1比特),short(帶符號(hào)的短整數(shù)),int(帶符號(hào)的整數(shù)),long(帶符號(hào)的長(zhǎng)整數(shù)),float(單精度浮點(diǎn)數(shù))或double(雙精度浮點(diǎn)數(shù))。
類類型的成員是域和方法;這些包括從超類繼承的成員。類文件還命名超類。成員可以是公用的,是指可由任何類的成員訪問(wèn)。專用成員僅可由包含其聲明的類的成員訪問(wèn)。被保護(hù)的成員可由聲明類的成員或來(lái)自其聲明的封裝中任何地方的成員訪問(wèn)。在JAVATM編程語(yǔ)言中,可對(duì)類分組并可對(duì)組命名;命名的類組是一個(gè)封裝。
JVM的實(shí)際指令包含在由類文件編碼的類的方法中。
當(dāng)JAVATM語(yǔ)言程序違反操作的約束時(shí),JVM檢測(cè)一無(wú)效條件并將該錯(cuò)誤作為異常發(fā)送到程序。將異常從其出現(xiàn)的點(diǎn)發(fā)出(throw),并且在向其傳送控制的點(diǎn)被捕捉。由類Throwable或其子類之一的實(shí)例表示每個(gè)異常,可使用這樣一個(gè)對(duì)象從異常出現(xiàn)的點(diǎn)向該程序的部分傳遞信息,即向用于對(duì)其進(jìn)行捕捉和處理的異常處理程序傳遞信息。
JVM通過(guò)調(diào)用一些指定類的"main"方法,傳送給它一個(gè)作為字符串?dāng)?shù)組的單個(gè)自變量來(lái)開(kāi)始執(zhí)行。這樣使得指定類被裝載、鏈接和初始化。
裝載是指通常通過(guò)取出預(yù)先從源代碼編譯的二進(jìn)制表示,找到具有特定名稱的類或封裝的二進(jìn)制形式的過(guò)程。在JVM中,裝載步驟取出表示所希望類的類文件。由引導(dǎo)類裝載程序或用戶定義的類裝載程序?qū)崿F(xiàn)該裝載過(guò)程。用戶定義的類裝載程序是由類本身定義的。類裝載程序可表示要搜索的特定位置順序,以便找到表示一命名的類的類文件。類裝載程序可緩存類的二進(jìn)制表示,根據(jù)預(yù)期的使用預(yù)取,或把一組相關(guān)的類裝載在一起。預(yù)取的類或裝載的組越多,裝載程序越"急切"?!斑t緩”裝載程序?qū)ΡM可能少的類進(jìn)行預(yù)取或分組。常規(guī)的JVM規(guī)范允許在急切和近乎完全遲緩之間的寬頻譜的裝載行為。
如果僅在一個(gè)類首先需要執(zhí)行當(dāng)前處理的類的指令時(shí),其調(diào)用一個(gè)類裝載程序以便裝載該類,則VM是完全遲緩。如果實(shí)現(xiàn),完全遲緩裝載不浪費(fèi)運(yùn)行時(shí)間資源,例如系統(tǒng)存儲(chǔ)器及執(zhí)行時(shí)間,裝載在運(yùn)行時(shí)間不嚴(yán)格需要的類。
JVM中的鏈接是在存儲(chǔ)器中取類的二進(jìn)制形式并將其組合成VM的運(yùn)行時(shí)間狀態(tài),以便可執(zhí)行的過(guò)程。在鏈接類之前必須裝載類。根據(jù)JVM規(guī)范,在鏈接中涉及到三個(gè)不同的活動(dòng)驗(yàn)證、準(zhǔn)備和符號(hào)引用的決定。
在驗(yàn)證期間,檢驗(yàn)類文件格式中對(duì)二進(jìn)制類的必要約束。這是JVM安全規(guī)定的基礎(chǔ)。驗(yàn)證確保了JVM不嘗試可導(dǎo)致無(wú)意義結(jié)果或可損害操作系統(tǒng)、文件系統(tǒng)、或JVM本身的完整性的違法操作。然而,檢驗(yàn)這些約束有時(shí)需要了解其它類中的子類型關(guān)系,因此,成功的驗(yàn)證通常取決于由被驗(yàn)證的類引用的其它類的特性。這樣具有使當(dāng)前的用于驗(yàn)證的JVM設(shè)計(jì)規(guī)范是上下文有關(guān)的效果。
JVM的二進(jìn)制類實(shí)質(zhì)上是一般程序模塊的例子,該程序模塊包含從編譯的源語(yǔ)句產(chǎn)生的指令。有效性檢驗(yàn)的上下文有關(guān)性意味著這些檢驗(yàn)取決于跨越多于一個(gè)模塊分散的信息,即,在此這些檢驗(yàn)被稱為跨模塊檢驗(yàn)或模塊間檢驗(yàn)。不需要來(lái)自另一個(gè)模塊的信息的有效性檢驗(yàn)在此被稱為模塊內(nèi)檢驗(yàn)。
上下文有關(guān)的驗(yàn)證有一些缺陷。例如,在象JAVATM平臺(tái)這樣的面向?qū)ο缶幊滔到y(tǒng)中,當(dāng)驗(yàn)證程序需要檢驗(yàn)未裝載的類間的子類型關(guān)系時(shí),它導(dǎo)致驗(yàn)證程序啟動(dòng)類裝載。即使從未執(zhí)行引用其它類的代碼,該裝載也可發(fā)生。就是說(shuō),上下文有關(guān)的驗(yàn)證可干擾完全遲緩裝載。由于該原因,與除了實(shí)際執(zhí)行的指令引用某些類以外都不裝載這些類的過(guò)程相比,裝載可能消耗存儲(chǔ)器并在運(yùn)行時(shí)間減慢執(zhí)行。
當(dāng)驗(yàn)證是上下文有關(guān)時(shí),同樣沒(méi)有在運(yùn)行時(shí)間之前一次驗(yàn)證一個(gè)類或模塊的規(guī)定。由于不能預(yù)先,例如在運(yùn)行時(shí)間前驗(yàn)證類,這是一個(gè)缺陷,因此驗(yàn)證肯定招致花費(fèi)運(yùn)行時(shí)間。因此,需要在運(yùn)行時(shí)間前進(jìn)行逐模塊,也稱為一次一模塊驗(yàn)證。在此將該驗(yàn)證稱為預(yù)驗(yàn)證,因?yàn)閺募夹g(shù)上講,它與JVM鏈接運(yùn)行時(shí)間期間發(fā)生的驗(yàn)證不同。
另外,由于在運(yùn)行時(shí)間進(jìn)行驗(yàn)證,每當(dāng)裝載一個(gè)類時(shí),已運(yùn)行一次,并通過(guò)驗(yàn)證的類再次受到驗(yàn)證,即使在相同的主計(jì)算機(jī)上的相同應(yīng)用中使用該類,其中很可能沒(méi)有新的驗(yàn)證問(wèn)題,或是可安排一種情況,以致不能做出影響驗(yàn)證的變化。這樣會(huì)導(dǎo)致冗余驗(yàn)證,從而在運(yùn)行時(shí)間期間需要比應(yīng)需要的更多的存儲(chǔ)器并且更慢地執(zhí)行。因此需要一個(gè)使用預(yù)驗(yàn)證模塊的選項(xiàng),在運(yùn)行時(shí)間不用進(jìn)一步驗(yàn)證,或使驗(yàn)證最少。
對(duì)預(yù)驗(yàn)證和完全遲緩裝載的需求是可能被分別滿足的兩種分離的需求。還需要同時(shí)支持逐模塊預(yù)驗(yàn)證和完全遲緩裝載。
對(duì)包括減少運(yùn)行時(shí)間驗(yàn)證的預(yù)驗(yàn)證的需求可能與安全的目的相沖突,安全目的需要在運(yùn)行時(shí)間檢驗(yàn)提供給虛擬機(jī)或任何計(jì)算體系結(jié)構(gòu)的所有模塊,以防止非法或損壞操作。例如,在非置信的情況下,例如從因特網(wǎng)下載模塊和其預(yù)驗(yàn)證輸出,攻擊者可能對(duì)預(yù)驗(yàn)證輸出進(jìn)行電子欺騙,可能使惡意的類表現(xiàn)為良性。因此,需要可在非置信的情況下使用的預(yù)驗(yàn)證,如跨越因特網(wǎng)下載模塊。
對(duì)完全遲緩裝載或逐模塊預(yù)驗(yàn)證的需求產(chǎn)生了對(duì)類型點(diǎn)陣(typelattice)的替換表示的需求。類型點(diǎn)陣是表示類型間子類型關(guān)系的數(shù)學(xué)結(jié)構(gòu)。由JVM建立類型點(diǎn)陣的表示,用于表示運(yùn)行時(shí)間期間類的類型和子類型。JVM還保持鏈接的類的所有屬性的引用和類型。期望類似的運(yùn)行時(shí)間結(jié)構(gòu)用于任何動(dòng)態(tài)鏈接過(guò)程。為支持逐類預(yù)驗(yàn)證或完全遲緩裝載,必須在不完全了解類型點(diǎn)陣的情況下進(jìn)行類型檢驗(yàn),另外,大部分類型點(diǎn)陣通常在可能仍不需要裝載的其它模塊中定義。特別是,JVM通常需要在驗(yàn)證期間找到類型點(diǎn)陣中的LUB(最低上屆)類型。因此,即使在不能使用類型點(diǎn)陣時(shí),仍需要執(zhí)行依賴于LUB的功能。
從下面結(jié)合附圖對(duì)本發(fā)明的詳細(xì)描述中將使本發(fā)明上面和其它特性,方面和優(yōu)點(diǎn)變得顯而易見(jiàn)。
本發(fā)明的一個(gè)目的是允許鏈接期間的驗(yàn)證同時(shí)不阻止完全遲緩裝載。對(duì)于動(dòng)態(tài)鏈接程序,特別是JVM,其優(yōu)點(diǎn)是在指令(例如方法的)執(zhí)行期間需要在專用的,定義的點(diǎn)遲緩地進(jìn)行被引用模塊(例如類)的所有決定。這些優(yōu)點(diǎn)包括●一次寫(xiě)入,任何時(shí)間運(yùn)行(WORA)特性被改善。程序相對(duì)于鏈接錯(cuò)誤的行為對(duì)所有平臺(tái)和實(shí)現(xiàn)是相同的。
●大大地改善了可測(cè)試性。例如,不需要預(yù)先考慮可能鏈接類或方法的所有位置,并在不能找到類或方法的情況下嘗試捕捉所有那些位置處的異常。
●用戶可以用一種可靠和簡(jiǎn)單的方式確定模塊的存在。例如,通過(guò)把那些引用放置在除可使用不同版本外不能執(zhí)行的程序支路上,用戶可以避免因調(diào)用在不同版本的運(yùn)行時(shí)間環(huán)境中遺漏的模塊造成的鏈接錯(cuò)誤。
常規(guī)JVM規(guī)范的裝載行為的廣度不提供這些優(yōu)點(diǎn)。
本發(fā)明的另一個(gè)目的是提供一次一模塊的預(yù)驗(yàn)證。本發(fā)明的再一個(gè)目的是使用預(yù)驗(yàn)證的指令,以減少運(yùn)行時(shí)間驗(yàn)證。某些JAVATM平臺(tái)的用戶想對(duì)某些類執(zhí)行上下文不相關(guān)的,或上下文獨(dú)立的,驗(yàn)證檢驗(yàn)??稍诰幾g期間或之后和運(yùn)行時(shí)間之前進(jìn)行的上下文獨(dú)立的檢驗(yàn)有許多優(yōu)點(diǎn)。這些優(yōu)點(diǎn)包括●在運(yùn)行時(shí)間之前可檢測(cè)某些驗(yàn)證錯(cuò)誤;●由于其所包含的驗(yàn)證代碼量減少,如果仍需要的話,運(yùn)行時(shí)間的鏈接部分更小并且更簡(jiǎn)單;和●用戶可在逐模塊的基礎(chǔ)上,而不是逐應(yīng)用的基礎(chǔ)上存儲(chǔ)模塊(在安全儲(chǔ)存庫(kù)中,例如RDBMS(關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))),并在運(yùn)行時(shí)間前進(jìn)行盡可能多的工作。這樣避免了冗余驗(yàn)證并減少或消除了驗(yàn)證花費(fèi)的運(yùn)行時(shí)間。
本發(fā)明的再一個(gè)目的是支持與允許可完全遲緩裝載的運(yùn)行時(shí)間驗(yàn)證組合的一次一模塊(或類)預(yù)驗(yàn)證,以便同時(shí)享有二者的優(yōu)點(diǎn)。
本發(fā)明的另一目的就是預(yù)驗(yàn)證來(lái)自非置信源的模塊,從而擴(kuò)大預(yù)驗(yàn)證以帶來(lái)好處的情況的范圍。
本發(fā)明的另一個(gè)目的是在缺乏對(duì)類型點(diǎn)陣的全面了解時(shí)使用LUB的替代物,以簡(jiǎn)化模塊間的有效性驗(yàn)證。
本發(fā)明的上述和其他一些目的及優(yōu)點(diǎn)都由在一次一模塊地對(duì)計(jì)算機(jī)程序模塊中指令的可信驗(yàn)證的一種方法、計(jì)算機(jī)程序、信號(hào)傳輸和裝置來(lái)提供。其判定在驗(yàn)證第一模塊指令時(shí)是否需要與第一模塊不同的參考模塊的信息。若要求此種信息,則對(duì)參考模塊的約束就被寫(xiě)入,且將被寫(xiě)入的約束以數(shù)字方式加以標(biāo)記,而不要求訪問(wèn)參考模塊。
本發(fā)明的另一方面是一種方法、計(jì)算機(jī)程序、信號(hào)傳輸和裝置。其提供了在計(jì)算機(jī)程序模塊中指令的可信驗(yàn)證。判定將被裝載的可疑模塊是否被儲(chǔ)存于非置信的存儲(chǔ)位置。若來(lái)自非置信源,則該可疑模塊被裝載,并于鏈接前在該可疑模塊上執(zhí)行一次一模塊的預(yù)驗(yàn)證。若可疑模塊通過(guò)如此的預(yù)驗(yàn)證,則該模塊就被裝入可信的高速緩沖存儲(chǔ)器。
本發(fā)明的另一方面是一種方法、計(jì)算機(jī)程序、信號(hào)傳送和裝置。其提供了在鏈接過(guò)程中在一計(jì)算機(jī)程序模塊中的指令的可信驗(yàn)證。其判定第一個(gè)模塊是否已通過(guò)一次一模塊的預(yù)驗(yàn)證。若第一個(gè)模塊已通過(guò)該預(yù)驗(yàn)證,便進(jìn)一步?jīng)Q定結(jié)果是否可信。若結(jié)果可信,則讀取在被約束模塊中的預(yù)驗(yàn)證約束(若有的話)。若預(yù)驗(yàn)證約束被讀取,便進(jìn)一步判斷是否被約束模塊被裝載。若被約束模塊被裝載,則執(zhí)行預(yù)驗(yàn)證約束。
在本發(fā)明的另一方面,一種可信預(yù)驗(yàn)證系統(tǒng)在鏈接前一次一模塊地執(zhí)行是否可信的驗(yàn)證,并在鏈接過(guò)程中減少驗(yàn)證。該系統(tǒng)包括一個(gè)網(wǎng)絡(luò)和一個(gè)與用于存儲(chǔ)計(jì)算機(jī)程序模塊的網(wǎng)絡(luò)相連的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)??尚诺母咚倬彌_存儲(chǔ)器在單個(gè)處理器控制下與網(wǎng)絡(luò)相連,用于存儲(chǔ)模塊和約束。其中裝載有模塊的存儲(chǔ)器與該網(wǎng)絡(luò)相連。一與該網(wǎng)絡(luò)相連的處理器被配置成判斷一將要裝載的可疑模塊是否存儲(chǔ)于不可信的存儲(chǔ)位置,并且,若如此,則裝載該可疑模塊,并在鏈接前于該可疑模塊中執(zhí)行一次一模塊預(yù)驗(yàn)證。若該可疑模塊通過(guò)了這一驗(yàn)證,則將該模塊存儲(chǔ)于可信的高速緩沖存儲(chǔ)器中。連接到該網(wǎng)絡(luò)的相同或不同的可信處理器被配置成可執(zhí)行一次一模塊的預(yù)驗(yàn)證。進(jìn)而判斷在驗(yàn)證可疑模塊中的指令時(shí)是否需要與可疑模塊不同的參考模塊的信息。若如此,則在可信的高速緩沖存儲(chǔ)器中寫(xiě)入?yún)⒖寄K的約束,而不需要訪問(wèn)參考模塊。連接到該網(wǎng)絡(luò)的相同或不同的可信處理器被配置成在鏈接前判斷第一模塊是否已通過(guò)一次一模塊的預(yù)驗(yàn)證,并當(dāng)?shù)谝荒K已通過(guò)預(yù)驗(yàn)證時(shí)判斷結(jié)果是否可信。若結(jié)果可信,則讀入被約束模塊中的預(yù)驗(yàn)證約束(若有的話)。若讀入了任何預(yù)驗(yàn)證約束,并且如果被約束模塊被裝載,則執(zhí)行該預(yù)驗(yàn)證約束。
本發(fā)明系統(tǒng)的目的、特性和優(yōu)點(diǎn)從下面的描述中是顯而易見(jiàn),其中
圖1A是適合于執(zhí)行本發(fā)明使用的計(jì)算機(jī)系統(tǒng)示例的示意圖。
圖1B是圖1A的計(jì)算機(jī)的硬件配置示例的方框圖。
圖1C示出了適合于存儲(chǔ)根據(jù)本發(fā)明的程序和數(shù)據(jù)信息的存儲(chǔ)介質(zhì)的示例。
圖1D是適合于承載根據(jù)本發(fā)明的數(shù)據(jù)和程序的網(wǎng)絡(luò)體系結(jié)構(gòu)的方框圖。
圖1E是根據(jù)本發(fā)明配置的計(jì)算機(jī)的方框圖。
圖2是在與JAVATM編程語(yǔ)言類似的偽語(yǔ)言中具有方法FOO和引用類A和B的類BAR的示例。
圖3是描繪來(lái)自圖2的類BAR示例的完全急切裝載的流程圖。
圖4A是來(lái)自圖2的類BAR示例的近乎遲緩裝載的流程圖。
圖4B是描繪針對(duì)圖4A中描繪的近乎遲緩裝載的步驟475,在新近更新的JVM中采用的訪問(wèn)類型檢驗(yàn)的流程圖。
圖5A是描繪在針對(duì)圖2的類BAR示例的圖4A的鏈接步驟435中的驗(yàn)證的流程圖。
圖5B是描繪針對(duì)來(lái)自圖2的類BAR示例,在來(lái)自圖5A的步驟530的一個(gè)實(shí)施例期間的驗(yàn)證方法的流程圖。
圖5C是描繪在圖5B的驗(yàn)證指令步驟537中的指令驗(yàn)證的流程圖。
圖6A是描繪針對(duì)來(lái)自允許圖2的完全遲緩裝載的類BAR示例,對(duì)于來(lái)自圖5A的步驟530,在本發(fā)明的實(shí)施例期間的驗(yàn)證方法的流程圖。
圖6B是描繪根據(jù)本發(fā)明的實(shí)施例,在圖6A的驗(yàn)證指令步驟637中驗(yàn)證指令的流程圖。
圖6C是描繪針對(duì)圖2的類BAR示例,在圖4A的步驟475期間根據(jù)本發(fā)明實(shí)施例的驗(yàn)證約束檢驗(yàn)的流程圖。
圖7A是描繪根據(jù)本發(fā)明針對(duì)來(lái)自圖2的類BAR示例一次一類預(yù)驗(yàn)證的流程圖。
圖7B是描繪在圖7A的步驟716期間預(yù)驗(yàn)證方法的流程圖。
圖7C是描繪根據(jù)本發(fā)明一個(gè)實(shí)施例,在來(lái)自圖2的類BAR示例的運(yùn)行時(shí)間驗(yàn)證期間,在圖5A中的步驟530期間使用的逐類預(yù)驗(yàn)證的流程圖。
圖8是描繪根據(jù)本發(fā)明的另一個(gè)實(shí)施例,在來(lái)自圖5A的步驟530期間使用逐類預(yù)驗(yàn)證的流程圖,允許具有來(lái)自圖2的類BAR示例的逐類預(yù)驗(yàn)證的完全遲緩裝載。
圖9是根據(jù)本發(fā)明的另一個(gè)實(shí)施例為具有用于可信的類和驗(yàn)證約束的緩存的預(yù)驗(yàn)證配置的計(jì)算機(jī)的流程圖。標(biāo)注和術(shù)語(yǔ)下面給出關(guān)于可在計(jì)算機(jī)或計(jì)算機(jī)網(wǎng)絡(luò)上執(zhí)行的程序過(guò)程的詳細(xì)描述。這些程序描述和表示法是本領(lǐng)域技術(shù)人員使用的含義,以便最有效地將其工作要點(diǎn)傳達(dá)給本領(lǐng)域的其他技術(shù)人員。
在此,通常將該過(guò)程設(shè)想為導(dǎo)致所希望結(jié)果的獨(dú)立的步驟序列。這些步驟是需要物理量的物理操作的那些步驟。通常,雖然不是一定的,這些量采用能夠存儲(chǔ),傳送,組合,比較,以及操作的電或磁信號(hào)的形式。主要是為了共同使用的緣故,實(shí)踐證明將這些信號(hào)看作是比特,值,元素,符號(hào),字符,項(xiàng),數(shù)字等是很方便的。然而,應(yīng)該指出,所有這些和相似項(xiàng)與適當(dāng)?shù)奈锢砹肯嚓P(guān)聯(lián),并且僅是便于應(yīng)用于那些量的標(biāo)記。
另外,所進(jìn)行操作經(jīng)常是指術(shù)語(yǔ),例如相加或比較,這些術(shù)語(yǔ)通常與由操作人員進(jìn)行的智力操作相關(guān)聯(lián)。在大多數(shù)情況下,在形成本發(fā)明一部分的,在此描述的任何操作中,操作人員不必或不需要具有這種能力;該操作是機(jī)器操作。用于執(zhí)行本發(fā)明的操作的有效機(jī)器包括通用數(shù)字計(jì)算機(jī)或類似設(shè)備。
本發(fā)明還涉及執(zhí)行這些操作的裝置??梢詫樗璧哪康臉?gòu)成該裝置,或是其可包括由計(jì)算機(jī)中存儲(chǔ)的計(jì)算機(jī)程序有選擇地驅(qū)動(dòng)或重新構(gòu)成的通用計(jì)算機(jī)。在此給出的過(guò)程不固定涉及特定計(jì)算機(jī)或其它裝置。各種通用機(jī)器可與根據(jù)在此講述寫(xiě)入的程序一起使用,或者其可證明便于構(gòu)成執(zhí)行所需方法步驟的更專用的裝置。這些機(jī)器中的各種所需結(jié)構(gòu)從給出的描述中是顯而易見(jiàn)的。
圖1A示出了一個(gè)適合于實(shí)現(xiàn)本發(fā)明的類型的計(jì)算機(jī)。在圖1A中的外部視圖看,計(jì)算機(jī)系統(tǒng)具有一個(gè)帶有盤(pán)驅(qū)動(dòng)器110A和110B的中央處理單元100。盤(pán)驅(qū)動(dòng)器指示110A和110B僅僅是多個(gè)可為計(jì)算機(jī)系統(tǒng)容納的盤(pán)驅(qū)動(dòng)器的符號(hào)。這些盤(pán)驅(qū)動(dòng)器一般包括一個(gè)軟盤(pán)驅(qū)動(dòng)器,例如110A,一個(gè)硬盤(pán)驅(qū)動(dòng)器(未在外部示出),和槽110B代表的CD ROM或DVD驅(qū)動(dòng)器。驅(qū)動(dòng)器的數(shù)量和類型一般隨不同計(jì)算機(jī)配置而改變。計(jì)算機(jī)有一個(gè)顯示信息的顯示器120。還有可用作輸入設(shè)備的鍵盤(pán)130和鼠標(biāo)器140。圖1A中示出的計(jì)算機(jī)可以是SunMicrosystems,Inc.生產(chǎn)的SPARC工作站。
圖1B示出了圖1A的計(jì)算機(jī)的內(nèi)部硬件的方框圖??偩€150用作互連其它計(jì)算機(jī)組件的主信息干線。CPU155是系統(tǒng)的中央處理單元,進(jìn)行執(zhí)行程序所需的計(jì)算和邏輯操作。只讀存儲(chǔ)器(160)和隨機(jī)存取存儲(chǔ)器(165)構(gòu)成了計(jì)算機(jī)的主存儲(chǔ)器。盤(pán)控制器170把一個(gè)或多個(gè)盤(pán)驅(qū)動(dòng)器連接到系統(tǒng)總線150。這些盤(pán)驅(qū)動(dòng)器可以是軟盤(pán)驅(qū)動(dòng)器,例如173,內(nèi)置或外置硬盤(pán)驅(qū)動(dòng)器,例如172,或CD ROM或DVD(數(shù)字視盤(pán))驅(qū)動(dòng)器,例如171。顯示器接口125連接顯示器120,并使來(lái)自總線的信息顯示在顯示器上??梢酝ㄟ^(guò)通信端口175與外部設(shè)備通信。
圖1C示出了圖1B中173或圖1A中的110A可以使用的示例存儲(chǔ)介質(zhì)。諸如軟盤(pán),或CD-ROM,或數(shù)字視盤(pán)之類的存儲(chǔ)介質(zhì)一般包含用于控制計(jì)算機(jī)的程序信息,以使計(jì)算機(jī)能夠執(zhí)行根據(jù)本發(fā)明的功能。
圖1D是適用于承載根據(jù)本發(fā)明的一些方面的數(shù)據(jù)和程序的網(wǎng)絡(luò)構(gòu)造的方框圖。網(wǎng)絡(luò)190用作使客戶計(jì)算機(jī)100與一個(gè)或多個(gè)服務(wù)器,例如服務(wù)器195,連接,以下載程序和數(shù)據(jù)信息??蛻魴C(jī)100’也可以經(jīng)過(guò)網(wǎng)絡(luò)服務(wù)提供商,例如ISP180,連接到網(wǎng)絡(luò)190。如以后將說(shuō)明的,可以通過(guò)網(wǎng)絡(luò)配置以硬件或軟件實(shí)現(xiàn)的有關(guān)虛擬機(jī)(VM)的單元或其它計(jì)算體系結(jié)構(gòu)。
圖1E示出了一個(gè)配置有有關(guān)虛擬機(jī)組件的單一計(jì)算機(jī)。組件包括在計(jì)算機(jī)中的存儲(chǔ)介質(zhì)的一個(gè)或多個(gè)邏輯塊中的源代碼語(yǔ)句162,一個(gè)編譯源代碼162以產(chǎn)生一個(gè)或多個(gè)包含VM指令之類指令的模塊165,166的編譯程序164,和一個(gè)像虛擬機(jī)(VM)167那樣的把一個(gè)或多個(gè)模塊165,166作為輸入并執(zhí)行它們產(chǎn)生的程序的處理器。盡管在圖1E示出了在一個(gè)計(jì)算機(jī)上的組件,但是應(yīng)當(dāng)知道模塊165和例如VM167這樣的處理器需要至少臨時(shí)地存在于相同的計(jì)算機(jī)上。可以從一個(gè)運(yùn)行編譯程序以便從源代碼產(chǎn)生模塊的不同計(jì)算機(jī)發(fā)送模塊。例如,圖1D示出了服務(wù)器195上的一個(gè)編譯程序194和源代碼192,和兩個(gè)不同的虛擬機(jī)實(shí)現(xiàn)150,151,兩個(gè)客戶機(jī)100,100’分別各有一個(gè)。源代碼192(和圖1E中的162)可以是任何語(yǔ)言,但是優(yōu)選是JAVATM語(yǔ)言編程語(yǔ)言,并且可以是由人類程序員編寫(xiě)或從另外一個(gè)程序輸出??梢酝ㄟ^(guò)網(wǎng)絡(luò)190傳送服務(wù)器195上的編譯程序194產(chǎn)生的模塊196,并作為模塊,例如156,存儲(chǔ)在一個(gè)客戶機(jī)上,例如客戶機(jī)100。在那里,例如VM150的特定平臺(tái)實(shí)現(xiàn)可以執(zhí)行模塊156中的指令。
要特別指出,盡管本發(fā)明是用JVM說(shuō)明的,但并不限于JVM。本發(fā)明可以應(yīng)用于任何在運(yùn)行期間鏈接來(lái)自各種源的程序模塊并且在執(zhí)行它們之前驗(yàn)證這些程序模塊的處理。
圖2示出了用類似于JAVATM編程語(yǔ)言的編程語(yǔ)言寫(xiě)出偽源代碼,作為一個(gè)程序模塊的偽源代碼的例子,其代表一個(gè)表現(xiàn)了引起本發(fā)明要解決的問(wèn)題的條件的類。第一行命名了類“BAR”。第一組省略號(hào)代表給予類BAR定義的其它語(yǔ)句,但在這里不予考慮。接下來(lái)一行到本例的結(jié)尾定義了類BAR中命名為FOO的方法(也表示為BAR.FOO);類型“void”指示在方法FOO的調(diào)用終止時(shí)不返回值。下面一行引入了一個(gè)在執(zhí)行期間提供兩個(gè)支路的“if else”結(jié)構(gòu)。如果方法自變量,即“arg”是真,那么執(zhí)行由下一組省略號(hào)、括號(hào)中的賦值語(yǔ)句和緊跟著的省略號(hào)代表的一個(gè)支路。賦值語(yǔ)句表示給命名為“var”的類A的變量賦予一個(gè)類B的新實(shí)例。因此,在這個(gè)支路中,對(duì)兩個(gè)其它類進(jìn)行引用,這兩個(gè)類是被引用類,類A和類B。下一行,if else結(jié)構(gòu)的else,表示方法的另一個(gè)支路的開(kāi)始,如果arg是假,那么進(jìn)入這個(gè)支路。該另一個(gè)支路包括在下一對(duì)括號(hào)之間,并且由另一組省略號(hào)代表,指示不在本支路中對(duì)類A或B進(jìn)行引用。兩個(gè)支路最后再次匯聚到給變量z的值賦予其原始值的平方的語(yǔ)句。
利用示例類BAR及其方法FOO,可以在JVM之類的虛擬機(jī)中顯示出急切裝載(eagerloading),近乎遲緩裝載(almost lazy loading),和完全遲緩裝載(fully lazy loading)之間的差別以及本發(fā)明的優(yōu)點(diǎn)。當(dāng)然,JVM并不是以圖2中列出的類似JAVATM編程語(yǔ)言操作,而是用一般由編譯程序產(chǎn)生的包含指令的模塊操作;編譯程序以圖2中所示的高級(jí)編程語(yǔ)言代碼操作。
圖3示出了由JVM進(jìn)行的示例類BAR的完全急切裝載。假設(shè)還沒(méi)有裝載類BAR,當(dāng)達(dá)到調(diào)用類BAR中定義的方法FOO的時(shí)刻,在步驟310,JVM利用BAR的類裝載程序,例如裝載程序L1,把類BAR從某個(gè)存儲(chǔ)裝置裝載到存儲(chǔ)器中。然后,類BAR成為當(dāng)前類。由于當(dāng)前類引用類A和B,如果它們還沒(méi)有裝載,那么在步驟320,急切JVM也調(diào)用裝載程序來(lái)裝載這兩個(gè)類。在圖3中,類A和B的類裝載程序分別表示為L(zhǎng)2和L3;但是L1,L2和L3可以是相同的內(nèi)建或用戶定義的類裝載程序,或者可以是任意兩個(gè)相同,或可以每個(gè)都是不同的。
在鏈接期間335,JVM執(zhí)行驗(yàn)證。前面參考的第5,740,441號(hào)美國(guó)專利中描述了驗(yàn)證期間使用的過(guò)程的許多細(xì)節(jié)。如上述專利中所描述的,驗(yàn)證包括識(shí)別一個(gè)試圖處理錯(cuò)誤類型的數(shù)據(jù)的方法中的任何指令序列,或任何會(huì)引起虛擬機(jī)的操作數(shù)堆棧下溢或溢出的指令。JVM中的指令是特定類型的,因此通過(guò)指令操作的操作數(shù)必須與指令定義的類型匹配。操作數(shù)堆棧溢出是試圖把一個(gè)會(huì)造成堆棧超過(guò)類文件中定義的堆棧的預(yù)定最大容量的項(xiàng)目,例如原始值或?qū)ο笠?,放入操作?shù)堆棧,也就是說(shuō)在堆棧已經(jīng)裝滿時(shí)放入。當(dāng)在堆棧上沒(méi)有有效項(xiàng)目留下時(shí),即,在堆棧已經(jīng)清空時(shí),指令試圖從操作數(shù)堆棧取出項(xiàng)目時(shí)發(fā)生操作數(shù)堆棧下溢??梢灶A(yù)期,驗(yàn)證中可以包括能夠在執(zhí)行模塊中指令之前進(jìn)行的任何有效性檢驗(yàn)。
如果模塊驗(yàn)證失敗,那么虛擬機(jī)識(shí)別出錯(cuò)誤,并且不執(zhí)行模塊中的指令。在JVM的情況下,JVM發(fā)出一個(gè)可以用類異常處理程序得體處理的鏈接或驗(yàn)證錯(cuò)誤消息(未示出)。
如果模塊驗(yàn)證成功并且完成了鏈接,那么執(zhí)行可以開(kāi)始。在本例的情況下,當(dāng)JVM解釋每個(gè)指令并執(zhí)行之的時(shí)候,可以在步驟340初始化當(dāng)前類BAR,和在步驟350運(yùn)行當(dāng)前類的方法FOO.BAR。解釋程序不需要檢驗(yàn)類型,或操作數(shù)堆棧下溢或溢出,因?yàn)橐呀?jīng)通過(guò)在鏈接期間335執(zhí)行的驗(yàn)證完成了檢驗(yàn)。
上述涉及動(dòng)態(tài)鏈接的過(guò)程的兩個(gè)優(yōu)點(diǎn)是可以安全地使用由他人開(kāi)發(fā)和編譯的類,并且在鏈接之后,執(zhí)行速度更快。可以使用他人編譯的類是因?yàn)闉榱朔乐篃o(wú)效和可能的危險(xiǎn)操作,在執(zhí)行前的鏈接期間驗(yàn)證過(guò)它們。由于在驗(yàn)證期間進(jìn)行了類型檢驗(yàn)和操作數(shù)堆棧溢出和下溢,在指令執(zhí)行時(shí)不進(jìn)行它們,所以執(zhí)行時(shí)間更快。同樣,可以安全地在執(zhí)行中跳過(guò)在驗(yàn)證期間進(jìn)行過(guò)的其它有效性檢驗(yàn)。
在遲緩裝載中,如圖4A中所示,直到在執(zhí)行中需要它時(shí)才裝載類。其優(yōu)點(diǎn)可以用圖2中的樣本類BAR說(shuō)明。如果arg是假,那么不進(jìn)行“if”支路中引用類A和B的賦值,并且不需要裝載或鏈接A或B。因此,利用遲緩裝載在運(yùn)行時(shí)使得處理更快。
例如,如圖4A中所示,在步驟410中利用類裝載程序L1裝載了類BAR之后,不立即裝載BAR引用的類A和B。而是在步驟435在鏈接期間驗(yàn)證類BAR;并且如果類BAR通過(guò)驗(yàn)證和鏈接,在步驟440,JVM繼續(xù)初始化類BAR。另一方面,如果類BAR沒(méi)有通過(guò)鏈接和驗(yàn)證,那么發(fā)出一個(gè)錯(cuò)誤消息(未示出)并且不試圖執(zhí)行(未示出)。在步驟440中初始化類BAR之后,在步驟450中執(zhí)行類BAR中的主方法(main method)并最終調(diào)用方法FOO。如果變量arg是假,那么在方法FOO中采用“else”支路,并且既不使用類A也不使用類B。這在圖4A中用決策步驟460代表,在步驟460中確定當(dāng)前指令是否需要決定對(duì)類B的引用。如果不需要類B,那么執(zhí)行當(dāng)前指令并且返回到460繼續(xù)執(zhí)行下一個(gè)指令,直到?jīng)]有剩下要驗(yàn)證的指令為止。另一方面,如果變量arg是真,那么執(zhí)行“if”支路。這個(gè)支路包括賦值,在賦值中把類A類型的變量var設(shè)定為一個(gè)類B的新實(shí)例。當(dāng)遇到第一個(gè)引用類B的指令時(shí),必須調(diào)用類B的一個(gè)方法(B的構(gòu)造函數(shù)),并且必須決定對(duì)類B的引用。步驟460代表的,問(wèn)詢是否必須為這個(gè)指令決定B的測(cè)試被給予肯定的回答。那么,如果還沒(méi)有裝載類B,步驟470利用類裝載程序L3裝載類B。
在現(xiàn)有的JVM中,處理只是在圖4A中所示的后裝載步驟475中繼續(xù),并且直接前進(jìn)到步驟480。由于建立了類B的一個(gè)新實(shí)例,必須首先鏈接和初始化類B。因此,如果還沒(méi)有鏈接類B,那么在下一步在步驟480中鏈接類B。如果在步驟480中類B通過(guò)鏈接(包括驗(yàn)證),那么在步驟490初始化類B,然后該處理繼續(xù)到步驟498,其中當(dāng)前指令可以使用新決定的類B。
這個(gè)流程表現(xiàn)為完全遲緩裝載,其中直到需要在執(zhí)行期間決定引用時(shí)才裝載一個(gè)類。但是,如以后將要說(shuō)明的,根據(jù)現(xiàn)有JVM規(guī)定,在鏈接期間435驗(yàn)證步驟可能需要類B的裝載。在這種場(chǎng)合,不能認(rèn)為該處理是完全遲緩,并且把該處理稱為近乎遲緩裝載。
圖4A中所示近乎遲緩裝載期間識(shí)別的一個(gè)問(wèn)題是類名含糊不清。當(dāng)一起編譯幾個(gè)類時(shí),編譯程序產(chǎn)生一個(gè)名稱空間,名稱空間包含有在名稱空間內(nèi)唯一的類名。但是,當(dāng)不同編譯程序在不同時(shí)間編譯幾個(gè)類時(shí),不可能保證類的名稱唯一性。在運(yùn)行時(shí)間,類裝載程序可能引入多個(gè)名稱空間。結(jié)果,運(yùn)行時(shí)間期間一個(gè)類的類型不是只通過(guò)其名稱定義,而是通過(guò)類名和它的定義類裝載程序,例如<BAR,Li>,的組合定義。這種環(huán)境可能欺騙驗(yàn)證程序,即使是在驗(yàn)證步驟裝載決定類型所需的全部被引用類的現(xiàn)有系統(tǒng)中。在包括驗(yàn)證的鏈接435期間,假設(shè)被引用類,例如B,具有當(dāng)前類裝載程序,例如L1要參看的類型,也就是說(shuō),假設(shè)類B的“類型”是<B,L1>。如果這種假設(shè)不是真,那么可能會(huì)產(chǎn)生訪問(wèn)特權(quán)的問(wèn)題。例如,如果B的類裝載程序L3與BAR的類裝載程序L1不同,并且如果<B,L3>把<B,L1>聲明為共用變量的一個(gè)變量聲明為專用變量,那么VM可以允許從類B的外部訪問(wèn)該專用變量,并且可能危及程序的安全性。
在1999年4月發(fā)布的JVM規(guī)定的最新版本第二版中,如另一個(gè)有關(guān)專利申請(qǐng)中所述的那樣避免這一問(wèn)題,這個(gè)有關(guān)專利申請(qǐng)是Bracha和Liang等申請(qǐng)的名稱為“用于類型安全,遲緩,用戶定義類裝載的方法和裝置”的序列號(hào)為09/134,477號(hào)美國(guó)專利申請(qǐng),這一專利申請(qǐng)也作為上述規(guī)定的參考。圖4B示出了一個(gè)說(shuō)明在JVM規(guī)定的第二版中使用的解決方法。利用這個(gè)解決方法,在后裝載步驟475中包括進(jìn)額外的步驟。步驟473確定在用L3實(shí)際裝載類B時(shí)是否產(chǎn)生根據(jù)名稱和BAR的裝載程序L1假設(shè)的類型;即,步驟473確定<B,L3>是否等于<B,L1>。如果裝載B實(shí)際產(chǎn)生了與假設(shè)類型不同的類型,那么類B不能通過(guò)名稱/類型約束,并且在步驟474發(fā)出一個(gè)錯(cuò)誤。否則,在步驟479繼續(xù)執(zhí)行。如下所述,上述專利申請(qǐng)中說(shuō)明的方法并沒(méi)有改變的事實(shí)是,步驟435中的鏈接可能需要裝載被引用類A和/或B以檢驗(yàn)子類型(subtyping),從而由類BAR使用它們。因此,上述的專利申請(qǐng)沒(méi)有解決干擾提供完全遲緩裝載的問(wèn)題。
用圖5A,5B和5C舉例說(shuō)明圖4A的鏈接435內(nèi)的驗(yàn)證步驟。圖5A是一個(gè)流程圖,示出了步驟435中鏈接類BAR包括開(kāi)始驗(yàn)證當(dāng)前類BAR的步驟510,緊接其后的步驟530,在步驟530中當(dāng)前類BAR的方法FOO受到驗(yàn)證。接下來(lái),在步驟590結(jié)束步驟435中的類BAR的驗(yàn)證。圖5B中示出了步驟530的慣用實(shí)施530a期間使用的驗(yàn)證類BAR的方法FOO的過(guò)程。該方法在步驟532開(kāi)始。如果該方法引用A和B之類的其它類,并且這些類尚未裝載,那么驗(yàn)證過(guò)程可能需要裝載類A和/或B。在步驟555中對(duì)每個(gè)指令進(jìn)行這個(gè)第一確定。如果需要被引用類B,那么在步驟540確定類B是否已經(jīng)裝載。如果需要并且尚未裝載,那么在步驟550裝載該被引用類。因此,即使希望遲緩裝載,方法驗(yàn)證可能在執(zhí)行期間實(shí)際需要其它類之前裝載了這些類。如步驟537表示的,如果在驗(yàn)證過(guò)程中發(fā)現(xiàn)A和B之間的不正確的子類型關(guān)系或其它驗(yàn)證問(wèn)題,那么在步驟539發(fā)出一個(gè)驗(yàn)證錯(cuò)誤。如果當(dāng)前指令通過(guò)驗(yàn)證,那么在步驟582把驗(yàn)證過(guò)程繼續(xù)到方法的結(jié)束,并返回到步驟555,直到?jīng)]有指令需要驗(yàn)證。也就是說(shuō),驗(yàn)證了足夠的指令集,因而可以開(kāi)始方法的執(zhí)行。
圖5C示出了可以在步驟537進(jìn)行的驗(yàn)證的某些示例細(xì)節(jié);例如,在JVM中進(jìn)行的和圖4B的美國(guó)專利5,740,441中所述的。在這個(gè)示例中,保存每個(gè)指令的類型快照(snapshot)。類型快照是一種保持一系列的局部變量和一個(gè)操作數(shù)堆棧上的每個(gè)位置的類型的結(jié)構(gòu)。當(dāng)需要驗(yàn)證一個(gè)指令時(shí),在步驟533裝載它的快照。在步驟534,確定指令的執(zhí)行對(duì)快照中類型的影響。當(dāng)一個(gè)指令是多個(gè)其它指令的后繼時(shí),例如當(dāng)操作的兩個(gè)支路匯聚時(shí)(如在圖2中的示例方法BAR.FOO中的涉及“z”的語(yǔ)句處),必須把一個(gè)指令的類型快照與每個(gè)支路上的前驅(qū)指令的快照合并。這是在驗(yàn)證一個(gè)指令的同時(shí)通過(guò)在步驟535中確定當(dāng)前指令的后繼指令和在步驟536中把當(dāng)前指令的快照與每個(gè)后繼指令的快照合并完成的。如果快照中相同位置的原始類型不一致,這種合并將檢測(cè)到一個(gè)驗(yàn)證的失敗。該合并還用產(chǎn)生的合并快照中的最特殊的公用超類型(也稱為最小上界LUB,或最小公用超類型LCS)替換進(jìn)行合并的快照中的相同位置上的引用;如果該操作不能完成則驗(yàn)證失敗。
如圖5B所示,引用其它類的方法的驗(yàn)證可能妨礙完全遲緩裝載,因?yàn)轵?yàn)證程序可能必須裝載被引用類。被引用類的裝載是不確定的--它取決于引用所處的上下文關(guān)系。在本示例中,為了使賦值語(yǔ)句合法,A必須是B的超類??梢酝ㄟ^(guò)裝載類B檢驗(yàn)這種子類型關(guān)系。如果A是B的超類,那么A將在裝載B的過(guò)程中裝載其自身。如果在裝載B之后沒(méi)有裝載A,它不可能是超類B。如果裝載了A,那么可以直接檢驗(yàn)是否保持了這種關(guān)系。帶有完全遲緩裝載的驗(yàn)證為了完成根據(jù)本發(fā)明的帶有驗(yàn)證的完全遲緩裝載,必須能夠延遲觸發(fā)根據(jù)現(xiàn)有技術(shù)的裝載的跨模塊關(guān)系的檢驗(yàn)。
如果在示例類BAR的驗(yàn)證期間B已經(jīng)裝載,那么可以立即確定是否保持了子類型關(guān)系。在裝載B時(shí)超類型已經(jīng)裝載,不然它不可能是B的超類型。如果類B尚未裝載,根據(jù)本發(fā)明,要給類B設(shè)置一個(gè)約束,在裝載了類B之后將檢驗(yàn)或?qū)嵤┻@個(gè)約束。圖6A至圖6C中示出了本發(fā)明的這個(gè)實(shí)施例的一個(gè)示例。
圖6A是圖5A中所示方法驗(yàn)證步驟530的實(shí)現(xiàn)530b的流程圖,并且是現(xiàn)有JVM規(guī)定的圖5B中所示版本530a的替代。根據(jù)本發(fā)明的這個(gè)實(shí)施例,在步驟632開(kāi)始方法驗(yàn)證,并在步驟655確定是否需要有關(guān)通常觸發(fā)裝載的類型的被引用類B的信息。如果被引用類B將傳統(tǒng)地觸發(fā)裝載,程序接下來(lái)在步驟640檢驗(yàn)是否已經(jīng)裝載了參考類B。如果已經(jīng)裝載了類B,那么在步驟637可以如現(xiàn)有JVM中那樣繼續(xù)處理,檢驗(yàn)子類型和其它有效性檢驗(yàn),并且如果一個(gè)指令驗(yàn)證失敗則在步驟639發(fā)出一個(gè)錯(cuò)誤。如果指令確實(shí)滿足包括模塊間檢驗(yàn)的有效性檢驗(yàn),那么在步驟682繼續(xù)方法FOO的驗(yàn)證,循環(huán)通過(guò)足夠的指令,直到?jīng)]有為了開(kāi)始執(zhí)行而需要驗(yàn)證的指令。如果任何開(kāi)始執(zhí)行所需的指令驗(yàn)證失敗,那么不開(kāi)始模塊的執(zhí)行。
但是,如果在步驟640中確定尚未裝載類B,那么在此時(shí)不調(diào)用類B的類裝載程序來(lái)裝載類B。而是在步驟650寫(xiě)入用于類BAR使用類B的驗(yàn)證約束。然后,假設(shè)對(duì)B的諸如子類型檢驗(yàn)之類的所有跨模塊檢驗(yàn)通過(guò),并且像以前那樣在步驟682繼續(xù)方法FOO的驗(yàn)證。在步驟650中導(dǎo)致寫(xiě)入約束的條件,和這些約束的形式將在以后對(duì)這些示例進(jìn)行更詳細(xì)的說(shuō)明。根據(jù)本發(fā)明的這個(gè)實(shí)施例,如所希望的那樣,鏈接期間的驗(yàn)證步驟530b不干擾模塊的完全遲緩裝載。帶有LUB符號(hào)計(jì)算的驗(yàn)證如果尚未裝載被引用模塊或類,那么在這種完全遲緩鏈接期間不裝載。在JVM中,這影響合并快照的結(jié)果,因?yàn)榭赡懿恢涝趫D5C中所示的步驟538中插入的LUB。用另一種方式來(lái)說(shuō),JVM不能給出充分填充的類型點(diǎn)陣的代表來(lái)確定多個(gè)不同被引用類型的LUB。圖6B示出了如何根據(jù)本發(fā)明的一個(gè)實(shí)施例完成合并快照功能的。步驟633,634,635和636與對(duì)應(yīng)的步驟533,534,535和536類似。但是,在步驟638中,如果不知道LUB,那么不能把它的類型插入到合并快照的適當(dāng)位置。而是插入前驅(qū)指令快照中適當(dāng)固定位置上的被引用類型的一個(gè)列表,或是與合并快照中的該固定位置關(guān)聯(lián)。也就是說(shuō),不是通過(guò)裝載構(gòu)造類型點(diǎn)陣所需的類或模塊來(lái)識(shí)別和把對(duì)快照中的LUB的引用放在這個(gè)位置,而是把造成對(duì)LUB需要的對(duì)不同類型(例如類類型X1,X2,…,Xn)的引用用符號(hào)列出,可能用^之類的標(biāo)記或符號(hào)隔離。該符號(hào)表示這些類型必須共享具有一個(gè)LUB的這種關(guān)系。約束實(shí)施當(dāng)和如果實(shí)際裝載了被引用類B時(shí),在步驟650實(shí)施,例如檢驗(yàn),VM使用的寫(xiě)入或記錄的約束。因此,在圖4A中步驟475代表的后裝載步驟期間裝載之后立即實(shí)施約束。圖6C示出了根據(jù)本發(fā)明的一個(gè)示例實(shí)施例的對(duì)被引用類B的驗(yàn)證約束的實(shí)施。本發(fā)明的這個(gè)實(shí)施例代表了一個(gè)可以包括圖4B中所示的475a的各步驟的新處理過(guò)程475b。實(shí)施在步驟671開(kāi)始。在示例中,把B的實(shí)際超類型用于確定B是否滿足以前寫(xiě)入的子類型驗(yàn)證約束。在步驟673進(jìn)行這個(gè)檢驗(yàn)。如果被引用類B不滿足約束,那么在步驟674發(fā)出一個(gè)錯(cuò)誤。用于這個(gè)錯(cuò)誤的處理程序可以終止執(zhí)行或允許執(zhí)行繼續(xù)。作為選擇,可以終止執(zhí)行而不發(fā)出一個(gè)錯(cuò)誤。如果被引用類B確實(shí)滿足了寫(xiě)入的約束,那么在步驟679結(jié)束后裝載處理。
通過(guò)這樣的改進(jìn),VM可以實(shí)現(xiàn)帶有驗(yàn)證的完全遲緩裝載。采用完全遲緩裝載的優(yōu)點(diǎn)包括·有關(guān)鏈接錯(cuò)誤的程序的行為對(duì)于所有平臺(tái)和實(shí)現(xiàn)都是相同的。
·不需要預(yù)期類或方法可能鏈接的所有位置,和試圖捕捉所有這些位置上的異常。
·用戶可以用可靠和簡(jiǎn)單的方式確定類或其它模塊的可用性。
本發(fā)明的一個(gè)優(yōu)點(diǎn)是,程序員可以用可靠和簡(jiǎn)單方式在一個(gè)平臺(tái)上測(cè)試類的可用性。例如,如果程序員希望使用一個(gè)新版次的模塊并且僅在這些新模塊可用時(shí)使用它們,那么遲緩鏈接使其變得容易。在這種情況下程序員產(chǎn)生的代碼中的某些地方會(huì)是對(duì)新版本的新模塊的引用的支路。如果平臺(tái)的當(dāng)前版本不支持在該支路中引用的模塊,那么程序員將把程序設(shè)計(jì)為不執(zhí)行該支路。如果新模塊在該平臺(tái)上不可用,并且驗(yàn)證的模塊引用該新模塊,那么不是完全遲緩的虛擬機(jī)可能需要驗(yàn)證程序嘗試裝載該遺漏的新模塊。這個(gè)裝載必然失敗,它將導(dǎo)致驗(yàn)證步驟的失敗。因此,由于一個(gè)遺漏模塊,驗(yàn)證將造成失敗,即使該模塊僅在一個(gè)不會(huì)執(zhí)行的支路中引用。利用需要的完全遲緩裝載,由于并不實(shí)際執(zhí)行的指令引用的模塊,驗(yàn)證不會(huì)失敗。在檢驗(yàn)類這樣的模塊的最新版本的同時(shí)通過(guò)驗(yàn)證的能力提供了對(duì)采用本發(fā)明支持的完全遲緩裝載的極大推動(dòng),這是虛擬機(jī)所需要的。
即使利用需要的遲緩裝載,VM的不同實(shí)現(xiàn)可以自由地提前裝載和鏈接——只要任何失敗僅在合法的定義點(diǎn)上出現(xiàn)。代碼必須能夠執(zhí)行到帶有錯(cuò)誤類型的類必須決定的點(diǎn)。例如,一個(gè)適時(shí)(JIT)代碼發(fā)生器可以選擇在編譯時(shí)預(yù)鏈接一個(gè)類或方法。但是,如果不是立即失敗的任何鏈接失敗,JIT應(yīng)當(dāng)產(chǎn)生將使適當(dāng)?shù)漠惓T谶t緩裝載應(yīng)當(dāng)已經(jīng)完成(它不須要實(shí)際進(jìn)行鏈按時(shí)間檢測(cè),盡管它可以)的點(diǎn)發(fā)生的代碼。作為另一個(gè)示例,由于無(wú)效類引用,一個(gè)靜態(tài)編譯程序在其專用鏈接階段可能失敗。盡管如此,如果即使它不能夠完全地鏈接,它選擇編譯代碼,那么在執(zhí)行時(shí)該代碼在JIT編譯代碼的相同的點(diǎn)失敗。作為最后一個(gè)示例,當(dāng)動(dòng)態(tài)地裝載了一個(gè)類時(shí)(例如,通過(guò)一個(gè)類裝載程序),一個(gè)實(shí)現(xiàn)可以選擇完全或部分地預(yù)鏈接它。但是,如果有任何失敗,代碼也必須能夠執(zhí)行到無(wú)效引用的點(diǎn)。逐模塊驗(yàn)證在本發(fā)明的另一方面,即使裝載了被引用模塊也不進(jìn)行被引用模塊的驗(yàn)證。有許多原因希望使用逐模塊驗(yàn)證,也叫作一次一模塊(類)驗(yàn)證。其允許在運(yùn)行時(shí)間之前進(jìn)行驗(yàn)證,具有有益結(jié)果。可以減少或一同消除在時(shí)間和空間上的驗(yàn)證運(yùn)行時(shí)間代價(jià)。JAVATM運(yùn)行時(shí)間環(huán)境可以更小和更簡(jiǎn)單,因?yàn)樗膶?shí)現(xiàn)驗(yàn)證的代碼量可以減少?,F(xiàn)有JVM規(guī)定或上述提議的完全遲緩裝載并不自動(dòng)提供這種如同逐類驗(yàn)證一樣實(shí)現(xiàn)了對(duì)JAVATM平臺(tái)的擴(kuò)充的一次一模塊驗(yàn)證。在第一種情況下,如果需要,驗(yàn)證程序無(wú)可選擇地自動(dòng)裝載被引用類。在后一種情況下,如果裝載了被引用類,將發(fā)生被引用類的驗(yàn)證,并且這種驗(yàn)證也是無(wú)可選擇地進(jìn)行。因此預(yù)期有逐類驗(yàn)證的兩種實(shí)施例,一種可以在現(xiàn)有JVM設(shè)計(jì)使用,另一種可以在新的完全遲緩裝載設(shè)計(jì)使用。
根據(jù)本發(fā)明的一個(gè)實(shí)施例,可以在運(yùn)行時(shí)間之前進(jìn)行通常在驗(yàn)證期間進(jìn)行的檢驗(yàn)。因?yàn)檫\(yùn)行時(shí)間之前的檢驗(yàn)在技術(shù)上不是鏈接部分,因而不是鏈接的驗(yàn)證階段部分,這些檢驗(yàn)在這里被稱為預(yù)驗(yàn)證,表示有效性的潛在預(yù)運(yùn)行時(shí)間檢驗(yàn)。
在本實(shí)施例中,在編譯程序產(chǎn)生了一個(gè)二進(jìn)制類之后的任何時(shí)間,程序員可以進(jìn)行有關(guān)該二進(jìn)制類的預(yù)驗(yàn)證,并且獨(dú)立地進(jìn)行對(duì)在該類中可能要引用的任何其它類的驗(yàn)證。結(jié)果,不需要訪問(wèn)被引用類或被引用模塊。圖7A中示出了本發(fā)明的逐類預(yù)驗(yàn)證。在步驟710,例如,通過(guò)把類BAR從存儲(chǔ)介質(zhì)裝載到存儲(chǔ)器開(kāi)始該方法。然后,在步驟712進(jìn)行有效性檢驗(yàn),例如類型檢驗(yàn),操作數(shù)堆棧溢出/下溢檢驗(yàn),這些檢驗(yàn)在現(xiàn)有技術(shù)中是在驗(yàn)證過(guò)程中進(jìn)行的。在檢驗(yàn)期間,樂(lè)觀地假設(shè)引用其它模塊的指令驗(yàn)證所需的任何模塊間信息,諸如從類BAR引用的類A和B之間的子類型關(guān)系,從而使該指令是有效的。但是,假設(shè)的信息或關(guān)系把一個(gè)約束置于虛擬機(jī)必須記憶的被引用模塊上。如果最終裝載了這樣一個(gè)被引用模塊,那么必須檢驗(yàn)這些約束。如果盡管有這些假設(shè),類BAR之類的模塊沒(méi)有通過(guò)所進(jìn)行的檢驗(yàn),則產(chǎn)生一個(gè)錯(cuò)誤,步驟713。由于這樣一個(gè)錯(cuò)誤不必是一個(gè)運(yùn)行時(shí)間錯(cuò)誤,在執(zhí)行期間可以不把它發(fā)出到一個(gè)處理程序。而是可能必須把它傳送給程序員,例如利用出現(xiàn)在打印機(jī)或顯示屏幕這樣的輸出設(shè)備上的錯(cuò)誤消息通知給程序員。如果模塊通過(guò)了所有檢驗(yàn),那么在步驟716寫(xiě)入任何要調(diào)用的預(yù)驗(yàn)證約束,以便以后在運(yùn)行時(shí)間使用。接下來(lái),當(dāng)預(yù)驗(yàn)證完成時(shí)在步驟719停止處理過(guò)程。然后可以按照?qǐng)D7A中所示步驟預(yù)驗(yàn)證另外的類或模塊。并不是模塊中所有指令都需要預(yù)驗(yàn)證,只是模塊的特殊使用所需的指令才需要預(yù)驗(yàn)證。例如,可能只需要驗(yàn)證方法FOO中的指令,但類BAR中其它方法中指令不需驗(yàn)證。
作為選擇,可以把預(yù)驗(yàn)證約束寫(xiě)入一個(gè)文件,或用其它方法與模塊聯(lián)系,以便以后在運(yùn)行時(shí)間檢驗(yàn)。為了JVM使用,可以把這些約束作為與該類相關(guān)的數(shù)據(jù)以二進(jìn)制類格式記錄在存儲(chǔ)介質(zhì)上。當(dāng)把類裝載到存儲(chǔ)器中時(shí),JVM可以把這些約束內(nèi)在化,以便在需要時(shí),例如在裝載了被引用類B之后檢驗(yàn)。
作為另一種選擇,根據(jù)本發(fā)明,無(wú)論是存儲(chǔ)的預(yù)驗(yàn)證約束或是模塊本身或是二者都可以附加一個(gè)信號(hào),例如數(shù)字簽名,可以用于可靠地識(shí)別模塊或約束的源,和指示自標(biāo)記以來(lái)它們是否被改動(dòng)。
以這種方式,可以在運(yùn)行時(shí)間之前進(jìn)行相當(dāng)于現(xiàn)有驗(yàn)證期間進(jìn)行的,但是不需要關(guān)于類A和B之類的被引用模塊的跨模塊信息的有效性模塊內(nèi)驗(yàn)證檢驗(yàn)。也就是說(shuō),對(duì)于模塊內(nèi)檢驗(yàn)可以進(jìn)行實(shí)際上的完全逐模塊預(yù)驗(yàn)證。模塊間檢驗(yàn)轉(zhuǎn)變?yōu)轭A(yù)驗(yàn)證約束。
圖7B示出了用作示例的圖7A的步驟716的詳細(xì)情況。在步驟732,處理過(guò)程開(kāi)始所裝載的類BAR的一個(gè)方法的預(yù)驗(yàn)證。接下來(lái),在步驟755確定該方法中的下一個(gè)指令是否需要來(lái)自被引用類B的信息,以便使該指令能夠進(jìn)行其有效性檢驗(yàn)。如果不是,那么在步驟737,程序進(jìn)行有關(guān)該指令的任何需要的類內(nèi)有效性檢驗(yàn)。如果指令未通過(guò)類內(nèi)檢驗(yàn),那么把一個(gè)錯(cuò)誤消息寫(xiě)入輸出設(shè)備。然后程序員可以處理這個(gè)問(wèn)題。另一方面,如果必須裝載一個(gè)被引用類以充分驗(yàn)證該指令,那么在步驟750寫(xiě)入或用其它方式記錄一個(gè)預(yù)驗(yàn)證約束,以便以后調(diào)用,并且假設(shè)該指令所需的子類型關(guān)系有效。由于該指令可能也需要類內(nèi)檢驗(yàn),控制前進(jìn)到步驟737,進(jìn)行這些檢驗(yàn)。如果該指令不需要類內(nèi)檢驗(yàn),那么在步驟737它自動(dòng)地“通過(guò)”檢驗(yàn)。如果在類內(nèi)檢驗(yàn)后發(fā)現(xiàn)該指令有效,和/或在寫(xiě)入預(yù)驗(yàn)證約束后假設(shè)其有效,那么流程控制轉(zhuǎn)移到步驟782,步驟782循環(huán)到步驟755,直到所裝載的類BAR的方法FOO中不再有剩余指令,此時(shí)方法FOO的預(yù)驗(yàn)證結(jié)束。應(yīng)當(dāng)注意,無(wú)論是進(jìn)行模塊內(nèi)檢驗(yàn)還是寫(xiě)入預(yù)驗(yàn)證約束,都不進(jìn)行是否裝載了被引用類的確定。即使是對(duì)于已經(jīng)裝載的模塊也不進(jìn)行跨模塊檢驗(yàn)。
圖7C示出了如何在運(yùn)行時(shí)間通過(guò)鏈接期間進(jìn)行的驗(yàn)證來(lái)處理已經(jīng)在運(yùn)行時(shí)間之前一次一模塊地驗(yàn)證過(guò)的模塊,例如類BAR。為了取代現(xiàn)有JVM的步驟530a,或用于完全遲緩裝載的修改的步驟530b,圖7C示出了一個(gè)遵循現(xiàn)有JVM的近乎遲緩裝載并且結(jié)合逐類預(yù)驗(yàn)證的替代步驟530c。在步驟792,在對(duì)類BAR的方法FOO之類的模塊的指令的驗(yàn)證步驟開(kāi)始之后,在步驟780確定該模塊是否已經(jīng)通過(guò)預(yù)驗(yàn)證。如果沒(méi)有,那么控制跟隨在圖5B中的步驟555開(kāi)始的現(xiàn)有JVM的流程。否則,在步驟783可選地檢驗(yàn)預(yù)驗(yàn)證的模塊是否是可信之后,下面將對(duì)其更詳細(xì)地說(shuō)明,控制前進(jìn)到步驟784。已知有許多測(cè)試一個(gè)文件是否可信的現(xiàn)有技術(shù)方法,例如通過(guò)使用數(shù)字簽名。如果不關(guān)心預(yù)驗(yàn)證模塊的可信性,那么可以省略步驟783。在步驟784,并不是一步步地通過(guò)方法中的指令,而是運(yùn)行時(shí)間驗(yàn)證程序讀出在BAR的逐類驗(yàn)證期間記錄/寫(xiě)入的預(yù)驗(yàn)證約束。如果沒(méi)有寫(xiě)入的預(yù)驗(yàn)證約束,那么BAR.FOO的驗(yàn)證完成,控制前進(jìn)到步驟778,完成處理過(guò)程。
如果為一個(gè)被引用類,例如,類A或B,寫(xiě)入了一個(gè)預(yù)驗(yàn)證約束,那么在步驟786,運(yùn)行時(shí)間驗(yàn)證程序確定約束中的被引用模塊是否已經(jīng)裝載。如果是,那么在步驟788實(shí)施該預(yù)驗(yàn)證約束。如果被引用模塊未通過(guò)該約束,那么在步驟762,發(fā)出一個(gè)錯(cuò)誤使一個(gè)錯(cuò)誤處理程序能夠捕捉到該錯(cuò)誤。否則控制前進(jìn)到步驟778,該步驟循環(huán)通過(guò)預(yù)驗(yàn)證約束,直到?jīng)]有剩余的約束。如果在步驟786確定沒(méi)有裝載被引用模塊,例如被引用類,那么在步驟789裝載該被引用模塊(例如一個(gè)類),并且在步驟788實(shí)施約束。
只要已經(jīng)預(yù)驗(yàn)證了類(并且作為選擇,通過(guò)了可信檢驗(yàn)),無(wú)論是否寫(xiě)入了有關(guān)被引用類的預(yù)驗(yàn)證約束,都不需要進(jìn)行類內(nèi)檢驗(yàn);它們已經(jīng)在運(yùn)行時(shí)間之前的逐類預(yù)驗(yàn)證期間進(jìn)行了檢驗(yàn)。然后,根據(jù)本發(fā)明,在一個(gè)模塊通過(guò)了一次一模塊的預(yù)驗(yàn)證之后,運(yùn)行時(shí)間驗(yàn)證不進(jìn)行模塊內(nèi)檢驗(yàn);它僅實(shí)施模塊間約束。
在所述的示例中,在模塊編譯后立即進(jìn)行預(yù)驗(yàn)證,而不裝載任何其它模塊。這使得在運(yùn)行時(shí)間之前能夠進(jìn)行大量驗(yàn)證,并且不用在每次模塊裝載和鏈接時(shí)重復(fù),因而節(jié)約了寶貴的時(shí)間和空間資源(例如,在運(yùn)行虛擬機(jī)的處理器上)。帶有完全遲緩裝載的逐模塊預(yù)驗(yàn)證圖8描述了結(jié)合在運(yùn)行時(shí)間完全遲緩裝載期間預(yù)驗(yàn)證結(jié)果的流程圖。圖8示出了對(duì)于示例類BAR,在支持完全遲緩裝載的鏈接期間進(jìn)行的驗(yàn)證是如何處理已經(jīng)在運(yùn)行時(shí)間之前一次一模塊地驗(yàn)證過(guò)的模塊的。替代現(xiàn)有JVM的步驟530a,或用于完全遲緩裝載的修改的步驟530b,或帶有一次一模塊驗(yàn)證的近乎遲緩裝載的步驟530c,圖8示出了遵循JVM的一個(gè)新實(shí)施例的完全遲緩裝載并且結(jié)合逐類預(yù)驗(yàn)證的替代步驟530d。圖8中的步驟892,880,883,884,878,886和862與圖7C中的對(duì)應(yīng)的700號(hào)的步驟792,780,783,784,778,786和762分別類似。在步驟892開(kāi)始對(duì)一個(gè)如類BAR的方法FOO這樣的模塊的指令的驗(yàn)證步驟之后,在步驟880確定該模塊是否已經(jīng)通過(guò)預(yù)驗(yàn)證。如果沒(méi)有,控制遵循圖6A中的JVM在步驟655開(kāi)始的完全遲緩裝載的流程。在步驟833可選地檢驗(yàn)預(yù)驗(yàn)證的模塊是否可信之后,如前面說(shuō)明的,控制進(jìn)入步驟884。在步驟884,并不是逐步通過(guò)方法中的指令,而是由運(yùn)行時(shí)間驗(yàn)證程序讀出在BAR的逐類驗(yàn)證期間寫(xiě)入的預(yù)驗(yàn)證約束。如果沒(méi)有寫(xiě)入的預(yù)驗(yàn)證約束,BAR.FOO的驗(yàn)證完成,并且控制前進(jìn)到步驟878,完成處理過(guò)程。
如果讀出了用于一個(gè)被引用模塊,例如類A或B的一個(gè)預(yù)驗(yàn)證約束,那么在步驟886運(yùn)行時(shí)間驗(yàn)證程序確定是否已經(jīng)裝載了約束中的被引用模塊。如果是,那么在步驟888實(shí)施預(yù)驗(yàn)證約束。如果被引用模塊未通過(guò)該約束,那么在步驟862發(fā)出一個(gè)錯(cuò)誤,由錯(cuò)誤處理程序捕捉。如果被引用模塊無(wú)需驗(yàn)證而通過(guò)約束,那么流程前進(jìn)到步驟878,步驟878循環(huán)通過(guò)預(yù)驗(yàn)證約束直到?jīng)]有任何剩余。
圖8中剩余的用于完全遲緩裝載的步驟實(shí)際上與用于近乎遲緩裝載的它們的對(duì)應(yīng)部分不同。如果在步驟886確定沒(méi)有裝載被引用模塊,例如被引用類,那么不裝載該被引用模塊。而是在步驟889把預(yù)驗(yàn)證約束復(fù)制到,或用其它方法保存到存儲(chǔ)器或存儲(chǔ)介質(zhì)中,以便在裝載現(xiàn)在尚未裝載的模塊(例如一個(gè)類)時(shí),實(shí)施該約束。
在圖8中,步驟888的實(shí)施可以有三種結(jié)果。除了失敗和無(wú)條件通過(guò)之外,可能有已經(jīng)裝載的被引用模塊只有在知道一個(gè)或更多的尚未裝載的模塊的內(nèi)容時(shí)才能通過(guò)的結(jié)果。這種結(jié)果可以看成是“有條件通過(guò)”,有條件通過(guò)是把有關(guān)一些被引用模塊的預(yù)驗(yàn)證約束重寫(xiě)為有關(guān)尚未裝載的(一個(gè)或多個(gè))被引用模塊的驗(yàn)證約束。步驟885把預(yù)驗(yàn)證約束重寫(xiě)為僅有關(guān)于尚未裝載的被引用模塊,例如類,的驗(yàn)證約束。重寫(xiě)之后,如果需要,控制前進(jìn)到步驟878。非置信類的逐模塊驗(yàn)證如上所述,根據(jù)本發(fā)明的驗(yàn)證依賴于能夠用被引用模塊所必須滿足的約束來(lái)構(gòu)造和注釋一個(gè)模塊的能力。不幸的是,程序并不總能防止攻擊者對(duì)這種注釋進(jìn)行電子欺騙——可能使一個(gè)惡意類看起來(lái)是良性的。因此,根據(jù)本發(fā)明的一個(gè)實(shí)施例,可選的可信檢驗(yàn)包括在圖7C的步驟783和圖8的步驟883中。缺少這些檢驗(yàn),在可信場(chǎng)合可以使用預(yù)驗(yàn)證,例如在執(zhí)行之前可以對(duì)類進(jìn)行預(yù)驗(yàn)證并將其裝載到非置信(防篡改)數(shù)據(jù)庫(kù)中的場(chǎng)合。
但是,在非置信場(chǎng)合,需要更多的防護(hù)。根據(jù)本發(fā)明的一個(gè)實(shí)施例,如圖9中所示,建立一個(gè)高速緩沖存儲(chǔ)器。高速緩沖存儲(chǔ)器920包含諸如可信的類和/或預(yù)驗(yàn)證約束之類的可信模塊,例如965a。從一個(gè)非置信源,例如因特網(wǎng)上的源,輸入到虛擬機(jī)的模塊和/或約束將放置在高速緩沖存儲(chǔ)器外部,例如在965。從例如965的非置信源與類一同輸入的任何預(yù)驗(yàn)證約束將被忽略。而是在第一次裝載這樣一個(gè)模塊時(shí),根據(jù)圖7A的所示方法,在一預(yù)驗(yàn)證程序910中急切地預(yù)驗(yàn)證它。如果模塊未能通過(guò)預(yù)驗(yàn)證,它將被立即拒絕。如果模塊通過(guò)預(yù)驗(yàn)證,則按需要產(chǎn)生新的預(yù)驗(yàn)證約束,并且隨后把這個(gè)注釋的或與新約束關(guān)聯(lián)的模塊,例如965a,存儲(chǔ)在一個(gè)可信模塊高速緩沖存儲(chǔ)器920中。在以后試圖從一非置信源裝載模塊時(shí),將首先搜索模塊高速緩沖存儲(chǔ)器920。如果發(fā)現(xiàn)了緩存的預(yù)驗(yàn)證模塊965a,那么可以把模塊965a安全地用作預(yù)驗(yàn)證模塊。利用這種改進(jìn),圖7B中所示的逐類預(yù)驗(yàn)證約束的檢驗(yàn)將會(huì)正確地進(jìn)行。實(shí)際上,圖7C的步驟780回答了關(guān)于是否已經(jīng)通過(guò)檢驗(yàn)?zāi)K高速緩沖存儲(chǔ)器進(jìn)行了預(yù)驗(yàn)證的問(wèn)題。利用這種改進(jìn),不需要圖7A中的步驟718中的預(yù)驗(yàn)證約束的數(shù)字簽名。同樣,利用這一改進(jìn),圖7C中的步驟783和圖8中的步驟883中所示的預(yù)驗(yàn)證輸出是否可信的檢驗(yàn)也不需要了,并且流程直接分別從步驟780或880前進(jìn)到步驟784或884。約束的形式圖6A,6C,7A,7B和8中的流程說(shuō)明的方法都提供了盡可能遲地檢驗(yàn)被引用類的要素。寫(xiě)入的約束的形式,以及隨后檢驗(yàn)這些約束的方式如下??梢栽诶纾瑘D6A的步驟650,圖7B的步驟750,和圖8的步驟885及889中寫(xiě)入約束。約束的實(shí)施可以在圖6C的步驟673,圖7C的步驟788,和圖8的步驟888中應(yīng)用。
下面通過(guò)舉例更詳細(xì)地說(shuō)明約束產(chǎn)生和約束檢驗(yàn)。參考圖2,賦值語(yǔ)句表明將把類B的一個(gè)新實(shí)例存儲(chǔ)在類類型A的變量var中。在一種面向?qū)ο蟮恼Z(yǔ)言中,這種賦值需要B是類A的一個(gè)子類型,如表達(dá)式B<=A代表的。這在BAR驗(yàn)證期間是未知的,除非在那時(shí)裝載了B。如果裝載了B并且B是A的子類,那么A也必須裝載(因?yàn)橐b載B必須裝載A)。因此,倒置是真,也就是說(shuō),如果裝載了B和未裝載A,那么B不是A的一個(gè)子類;賦值語(yǔ)句引起了造成類BAR驗(yàn)證失敗的子類型失配。如果A和B都裝載了,如圖3中所示的急切裝載,那么可以跟蹤B的超類的指示符,以查看A是否在某處是B的一個(gè)超類。如果是,那么B是A的子類,并且這個(gè)賦值通過(guò)驗(yàn)證。如果通過(guò)跟隨超類指示符在分層結(jié)構(gòu)中向上搜尋未發(fā)現(xiàn)A,那么B不是A的一個(gè)子類,賦值語(yǔ)句造成子類型失配,并且類BAR驗(yàn)證失敗。
利用現(xiàn)有JVM規(guī)范,如果類B尚未裝載,驗(yàn)證程序?qū)⒀b載類B并檢驗(yàn)它的類型,具體講,檢驗(yàn)它是否是類A的子類型。
根據(jù)本發(fā)明,為了取得完全遲緩裝載,或逐類驗(yàn)證,或二者,希望不裝載類B。因此,根據(jù)本發(fā)明的這個(gè)實(shí)施例,不裝載B,而是寫(xiě)入約束B(niǎo)<=A??梢栽谏厦媪谐龅挠糜趯?xiě)入約束的任何步驟中(例如,650,750,889,885)寫(xiě)入該約束。以后在執(zhí)行BAR.FOO時(shí),如果不執(zhí)行這個(gè)帶有賦值語(yǔ)句的支路,并且B同樣也不可能被其它執(zhí)行的指令引用,那么不會(huì)裝載類B。但是,如果執(zhí)行包括這個(gè)賦值語(yǔ)句的支路,并且B尚未裝載,那么此時(shí)裝載類B,并且在此時(shí)裝載了類B之后,進(jìn)行類B是否滿足約束B(niǎo)<=A的檢驗(yàn)。這種檢驗(yàn)可以在,例如,上面列出的用于檢驗(yàn)約束的步驟中(例如,673,788,888)進(jìn)行。這將很容易進(jìn)行,因?yàn)槿绻怋確實(shí)是類A的一個(gè)子類,并且從類A繼承了它的屬性,那么類A必須是已經(jīng)裝載的。因此,這種類型的約束允許完全遲緩裝載,逐類預(yù)驗(yàn)證,或二者。
根據(jù)本發(fā)明,存在有關(guān)非局部類的類類型的另一種檢驗(yàn),其可以在逐類預(yù)驗(yàn)證中以不同于完全遲緩裝載實(shí)現(xiàn)中的處理方式處理。這是對(duì)受保護(hù)成員的接收方訪問(wèn)檢驗(yàn)在JAVATM虛擬機(jī)中,如果并且僅在下列條件下一個(gè)類或接口D才能訪問(wèn)受保護(hù)成員R1.D與聲明R的類C在同一個(gè)運(yùn)行時(shí)間封裝中,OR BOTH2.D是聲明R的類C的子類,AND3.如果R是一個(gè)實(shí)例成員,那么T,被訪問(wèn)的實(shí)例R的靜態(tài)類型,是D的子類型。
要求3稱為接收方受保護(hù)檢驗(yàn)。
在現(xiàn)有JAVATM虛擬機(jī)中,在D的鏈接期間當(dāng)決定從D到R的引用時(shí)檢驗(yàn)頭兩個(gè)要求,而第三個(gè)要求是在D的驗(yàn)證期間檢驗(yàn)的。在驗(yàn)證期間,聲明R的類C可能尚未裝載。在這種情況下,顯然C不是D的超類(否則,C必然已經(jīng)裝載,因?yàn)檠b載一個(gè)類意味著裝載了它的所有超類)。在這種情況下,只有C和D在同一運(yùn)行時(shí)間封裝中時(shí)訪問(wèn)才是合法的。驗(yàn)證程序可以樂(lè)觀地假設(shè)這是成立的。當(dāng)決定引用時(shí)要檢驗(yàn)上述要求。因此,如果C已經(jīng)裝載,驗(yàn)證程序僅需要進(jìn)行受保護(hù)的接收方檢驗(yàn)。在這種場(chǎng)合,完全可以確定R是否是一個(gè)受保護(hù)成員。如果R不受保護(hù),則不需要受保護(hù)的接收方檢驗(yàn)。如果R是受保護(hù)的,驗(yàn)證程序可以測(cè)試,以確定D是否與C在相同的運(yùn)行時(shí)間封裝中。如果是這種情況,那么訪問(wèn)是合法的,并且也不需要受保護(hù)的接收方檢驗(yàn)。如果D和C不在同一運(yùn)行時(shí)間封裝中,那么驗(yàn)證程序檢驗(yàn)D是否是C的子類,和T,被訪問(wèn)的實(shí)例的靜態(tài)類型,是否是D的子類型。如果不是,則產(chǎn)生一個(gè)錯(cuò)誤。應(yīng)當(dāng)注意,檢驗(yàn)T<=D可能需要裝載T,如果它尚未裝載的話。
在帶有完全遲緩裝載的驗(yàn)證中,當(dāng)驗(yàn)證D時(shí),假設(shè)已經(jīng)裝載了它的超類。除了一個(gè)例外之外,控制以與非遲緩情況相同的方式進(jìn)行。如果確定需要一個(gè)是否T<=D的檢驗(yàn)并且T未裝載,那么必須避免裝載。而是給T施加裝載約束T<=D。
在逐類驗(yàn)證中,情況不同。既未裝載D的超類,也未裝載聲明R的類C。因此,不進(jìn)行受保護(hù)的接收方檢驗(yàn)。不能作出如果C是D的一個(gè)超類則它必須已經(jīng)裝載的假設(shè),因此不能檢查R的聲明。其結(jié)果是,甚至不能確定R是否是受保護(hù)的。作為替代,必須產(chǎn)生將在以后執(zhí)行程序時(shí)檢驗(yàn)的適當(dāng)?shù)募s束。這一問(wèn)題可以通過(guò)產(chǎn)生條件約束來(lái)解決If(D<=X)then{if(X.m protected)then{T<=D}else{true}}else{true}用于每個(gè)以下形式的指令invoke o,X.m,其中o具有類型T。把類似的策略應(yīng)用于域引用。在D的初始化之前檢查這個(gè)約束。在該點(diǎn),可以決定D<=X(由于D和它的所有超類已經(jīng)裝載)。如果D<=X不是真,那么不需要進(jìn)一步的行動(dòng)。如果D不是X的一個(gè)子類,那么D不可能是聲明m的類C的子類。其原因是C必須是X的超類。其結(jié)果是,只有在m是不受保護(hù)的或C與D在同一運(yùn)行時(shí)間封裝中時(shí)對(duì)X.m的引用才是合法的。這將在決定了對(duì)X.m的引用時(shí)檢驗(yàn)。如果D<=X是真,那么可以檢驗(yàn)X.m是否是受保護(hù)的。如果X.m不是受保護(hù)的,那么不進(jìn)行受保護(hù)的接收方檢驗(yàn)。否則,可以進(jìn)行判斷是否T<=D的測(cè)試,如上所述,這將會(huì)造成T被裝載。
當(dāng)把完全遲緩驗(yàn)證與逐類驗(yàn)證組合在一起時(shí),遵循逐類驗(yàn)證過(guò)程,除了在評(píng)價(jià)以下條件約束時(shí)之外If(D<=X)then{if(X.m protected)then{T<=D}else{true}}else{true}如果必須評(píng)價(jià)T<=D和如果T未裝載,那么應(yīng)當(dāng)如在遲緩場(chǎng)合中那樣,把裝載約束T<=D施加于T。
當(dāng)驗(yàn)證在一語(yǔ)句檢查操作數(shù)堆棧的狀態(tài)時(shí),可以使用另外的約束,所述語(yǔ)句是幾個(gè)以前執(zhí)行的語(yǔ)句的后繼語(yǔ)句,也就是說(shuō),在兩個(gè)或多個(gè)支路的匯聚處。在這點(diǎn),驗(yàn)證當(dāng)前被設(shè)計(jì)為合并操作數(shù)堆棧和來(lái)自當(dāng)前指令是其后繼指令的前驅(qū)指令的局部變量的快照。如果要引用在尚未裝載的類中定義的類型,這總是逐類預(yù)驗(yàn)證中的情況并且在一些時(shí)候是完全遲緩裝載中的情況,則類型點(diǎn)陣不可用并且不知道LUB。遵循上述對(duì)圖6B的步驟638的LUB的符號(hào)表示,可以用如下用符號(hào)表示的一個(gè)列表中的一個(gè)約束來(lái)代替“the LUB<=class T”這樣的約束X1^X2^…Xn<=T這可以通過(guò)提取公因子而成為各個(gè)類Xi的一系列約束X1<=T,X2<=T,…Xn<=T。
當(dāng)執(zhí)行裝載的類的當(dāng)前方法并且通過(guò)需要例如類X2的決定的支路時(shí),裝載類X2,并且可以在此時(shí)檢驗(yàn)約束X2<=T。作為選擇,如果在裝載X2時(shí)X2通過(guò)檢驗(yàn),那么可以重寫(xiě)列表上的一個(gè)約束,從列表刪除X2。
如上所述,在幾個(gè)步驟(例如,650,750,889,885)中任何一個(gè)期間寫(xiě)入約束,并且隨后在幾個(gè)檢驗(yàn)步驟(例如,673,788,888)中的任何一個(gè)中檢驗(yàn)約束。
利用LUB的這種符號(hào)表示,實(shí)際計(jì)算可能要用較長(zhǎng)的時(shí)間到達(dá)收斂。但是,保證了處理過(guò)程收斂,因?yàn)镴VM的一個(gè)類文件的常數(shù)池是有限的。因此,一個(gè)方法僅能直接或間接地引用有限數(shù)量的類型。結(jié)果,一個(gè)LUB的符號(hào)表示必然是類名的有限序列,X1^…^Xn。這又表示對(duì)于JVM來(lái)說(shuō)通過(guò)類型推理算法的重復(fù)次數(shù)是有限的,因?yàn)橹貜?fù)將一直繼續(xù)直到?jīng)]有新類型可以加入到LUB中。
盡管已經(jīng)對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明和圖示,但是應(yīng)當(dāng)清楚地知道這只是圖示和舉例的方式,而不能認(rèn)為是限制的方式,本發(fā)明的精神和范圍僅受所附權(quán)利要求的限制。
權(quán)利要求
1.一種用于對(duì)計(jì)算機(jī)程序模塊中的指令進(jìn)行一次一模塊地可信驗(yàn)證的方法,該方法包括判斷在驗(yàn)證第一模塊中的指令時(shí)是否要求與第一模塊不同的參考模塊的信息;并且若需要該種信息,則對(duì)參考模塊寫(xiě)入一約束,而不必訪問(wèn)該參考模塊,并將寫(xiě)入的約束加以數(shù)字標(biāo)記。
2.一種用于在計(jì)算機(jī)程序的模塊中進(jìn)行指令可信驗(yàn)證的方法,該方法包括判斷將要裝載的可疑模塊是否來(lái)自不可信的來(lái)源;若是來(lái)自非置信源,則裝載該可疑模塊,并且在鏈接前對(duì)可疑模塊執(zhí)行一次一模塊的預(yù)驗(yàn)證;并且若該可疑模塊通過(guò)所述的預(yù)驗(yàn)證,則在可信的高速緩沖存儲(chǔ)器中存儲(chǔ)所述的模塊。
3.權(quán)利要求2的方法,所述的一次一模塊的預(yù)驗(yàn)證包括判斷在驗(yàn)證可疑模塊時(shí)所需的指令是否需要與可疑模塊不同的參考模塊中的信息;若需要該信息,則在可信的高速緩沖存儲(chǔ)器中為該參考模塊寫(xiě)入一約束,而不必訪問(wèn)該參考模塊;并且如果該約束滿足,則驗(yàn)證指令。
4.一種用于在鏈接過(guò)程中對(duì)計(jì)算機(jī)程序模塊中的指令進(jìn)行可信驗(yàn)證的方法,該方法包括判斷第一模塊是否已通過(guò)一次一模塊的預(yù)驗(yàn)證;若第一模塊已通過(guò)預(yù)驗(yàn)證,則判斷結(jié)果是否可信;若結(jié)果可信,如果在被約束模塊中有預(yù)驗(yàn)證約束,則讀取該約束;若有預(yù)驗(yàn)證約束,則判斷該被約束模塊是否被裝載;和若該被約束模塊被裝載,則執(zhí)行預(yù)驗(yàn)證約束。
5.權(quán)利要求4的方法,其中所述判斷結(jié)果是否可信的步驟包括驗(yàn)證數(shù)字標(biāo)記。
6.權(quán)利要求4的方法,所述判斷結(jié)果是否可信的步驟包括在可信的高速緩沖存儲(chǔ)器中尋找約束。
7.權(quán)利要求4的方法,進(jìn)一步包括,若參考模塊未通過(guò)預(yù)驗(yàn)證約束,則寫(xiě)入一出錯(cuò)信息。
8.一種用于一次一模塊地對(duì)計(jì)算機(jī)程序模塊的指令進(jìn)行可信驗(yàn)證的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì);存儲(chǔ)于所述計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)中的計(jì)算機(jī)控制命令,用于判斷在驗(yàn)證第一模塊中的指令時(shí)是否需要與第一模塊不同的參考模塊的信息,并且,若需要該信息,則對(duì)該參考模塊寫(xiě)入約束,而不必訪問(wèn)參考模塊,并在寫(xiě)入的約束中以數(shù)字方式增加標(biāo)記。
9.一種用于計(jì)算機(jī)程序模塊中指令的可信驗(yàn)證的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì);存儲(chǔ)于計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)中的計(jì)算機(jī)控制命令,用于判斷將被裝載的可疑模塊是否來(lái)自非置信源,并且,若該可疑模塊來(lái)自非置信源,則裝載該可疑模塊,并在鏈接前于可疑模塊中執(zhí)行一次一模塊的預(yù)驗(yàn)證,并且,若該可疑模塊通過(guò)所述的預(yù)驗(yàn)證,則將所述的可疑模塊存儲(chǔ)于可信的高速緩沖存儲(chǔ)器中。
10.權(quán)利要求9的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包括存儲(chǔ)于計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)中的計(jì)算機(jī)控制命令,用于通過(guò)判斷在驗(yàn)證可疑模塊中的指令時(shí)是否需要與可疑模塊不同的參考模塊中的信息、和通過(guò)在需要該信息時(shí)在可信的高速緩沖存儲(chǔ)器中寫(xiě)入該參考模塊的約束而不必訪問(wèn)該參考模塊,來(lái)執(zhí)行所述的一次一模塊預(yù)驗(yàn)證。
11.一種在鏈接過(guò)程中用于計(jì)算機(jī)程序中模塊的指令可信驗(yàn)證的計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì);存儲(chǔ)于計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)中的計(jì)算機(jī)控制命令,用于判斷第一模塊是否已通過(guò)一次一模塊預(yù)驗(yàn)證;若第一模塊已通過(guò)預(yù)驗(yàn)證,用于判斷結(jié)果是否可信;若有的話,用于在約束模塊中讀入預(yù)驗(yàn)證約束;若結(jié)果可信,若在約束模塊中有預(yù)驗(yàn)證約束則將其讀入,以判斷被約束模塊是否裝載;并且若被約束模塊裝載,則用于執(zhí)行預(yù)驗(yàn)證約束。
12.權(quán)利要求11的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包括存儲(chǔ)于計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)中的計(jì)算機(jī)控制命令,用于通過(guò)驗(yàn)證數(shù)字標(biāo)記判斷結(jié)果是否可信。
13.權(quán)利要求11的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包括存儲(chǔ)于計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)中的計(jì)算機(jī)控制命令,用于通過(guò)尋找可信的高速緩沖存儲(chǔ)器中的約束來(lái)判斷結(jié)果是否可信。
14.權(quán)利要求11的計(jì)算機(jī)程序產(chǎn)品,進(jìn)一步包括存儲(chǔ)于計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì)中的計(jì)算機(jī)控制命令,用于在參考模塊未通過(guò)預(yù)驗(yàn)證約束時(shí)寫(xiě)入一出錯(cuò)信息。
15.一種可信預(yù)驗(yàn)證裝置,用于一次一模塊地對(duì)計(jì)算機(jī)程序中模塊的指令進(jìn)行可信驗(yàn)證,該裝置包括用于存儲(chǔ)計(jì)算機(jī)程序模塊的計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì);模塊被裝載其中的存儲(chǔ)器;一處理器,被配置來(lái)判斷在第一模塊指令驗(yàn)證中是否需要與第一模塊不同的參考模塊的信息,并且,若需要該信息,則對(duì)參考模塊寫(xiě)入一約束,并在寫(xiě)入的約束中以數(shù)字方式增加一標(biāo)記,而不必訪問(wèn)參考模塊。
16.一種用于計(jì)算機(jī)程序一模塊指令可信驗(yàn)證的可信的驗(yàn)證裝置,該可信的驗(yàn)證包括用于存儲(chǔ)計(jì)算機(jī)程序模塊的計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì);可將模塊裝載于其中的存儲(chǔ)器;處理器,配置成判斷將被裝載的可疑模塊是否來(lái)自非置信源,并且,若來(lái)自非置信源,則裝載該可疑模塊,并在鏈接前于可疑模塊上執(zhí)行一次一模塊的預(yù)驗(yàn)證,并且,若可疑模塊通過(guò)所述的預(yù)驗(yàn)證,則將所述的模塊存儲(chǔ)于可信的高速緩沖存儲(chǔ)器中。
17.權(quán)利要求9的可信驗(yàn)證的計(jì)算機(jī)程序產(chǎn)品,其中的處理器被進(jìn)一步配置成通過(guò)判斷在驗(yàn)證可疑模塊中的指令時(shí)是否需要與可疑模塊不同的參考模塊的信息、和當(dāng)信息需要時(shí)通過(guò)在可信的高速緩沖存儲(chǔ)器中對(duì)參考模塊寫(xiě)入一約束,而不必訪問(wèn)該參考模塊,來(lái)執(zhí)行所述的一次一模塊預(yù)驗(yàn)證。
18.一種用于動(dòng)態(tài)鏈接過(guò)程中模塊的可信驗(yàn)證的動(dòng)態(tài)鏈接裝置,該裝置包括用于存儲(chǔ)計(jì)算機(jī)程序模塊的計(jì)算機(jī)可讀的存儲(chǔ)介質(zhì);可將模塊裝載其中的存儲(chǔ)器;處理器,被配置來(lái)判斷第一模塊是否已通過(guò)一次一模塊預(yù)驗(yàn)證;判斷若第一模塊已通過(guò)預(yù)驗(yàn)證時(shí)結(jié)果是否可信;若結(jié)果可信,若在被約束模塊中有預(yù)驗(yàn)證約束,則讀取該預(yù)檢驗(yàn)約束;若讀入預(yù)驗(yàn)證約束,則判斷被約束模塊是否被裝載;若被約束模塊被裝載,則執(zhí)行預(yù)驗(yàn)證約束。
19.權(quán)利要求18的動(dòng)態(tài)鏈接裝置,其中的處理器進(jìn)一步被配置成用于通過(guò)驗(yàn)證數(shù)字標(biāo)記來(lái)判斷結(jié)果是否可信。
20.權(quán)利要求18的動(dòng)態(tài)鏈接裝置,其中的處理器進(jìn)一步被配置成用于通過(guò)尋找可信的高速緩沖存儲(chǔ)器中的約束來(lái)判斷結(jié)果是否可信。
21.權(quán)利要求18的動(dòng)態(tài)鏈接裝置,其中的處理器進(jìn)一步被配置,用于當(dāng)參考模塊未通過(guò)預(yù)驗(yàn)證約束時(shí)寫(xiě)入一出錯(cuò)信息。
22.一種信號(hào)傳輸,包括在通信線路上的載波;和通過(guò)所述載波傳送的表示計(jì)算機(jī)控制命令的信號(hào),用于判斷在第一模塊指令驗(yàn)證中是否需要與第一模塊不同的參考模塊的信息,并且,若需要該信息,則對(duì)該參考模塊寫(xiě)入一約束,并在被寫(xiě)入的約束中以數(shù)字方式增加標(biāo)記,而不必訪問(wèn)該參考模塊。
23.一種信號(hào)傳輸,包括在通信線路上的載波;和通過(guò)所述載波傳送的表示計(jì)算機(jī)控制命令的信號(hào),用于判斷將要裝載的可疑模塊是否來(lái)自非置信源,并且,若其來(lái)自非置信源,則裝載該可疑模塊,并在鏈接前在該可疑模塊上執(zhí)行一次一模塊預(yù)驗(yàn)證,并且,若該可疑模塊通過(guò)所述的預(yù)驗(yàn)證時(shí),將所述的模塊存儲(chǔ)于可信的高速緩沖存儲(chǔ)器中。
24.權(quán)利要求23的信號(hào)傳輸,進(jìn)一步包括通過(guò)載波傳送的計(jì)算機(jī)控制命令,用于通過(guò)判斷驗(yàn)證可疑模塊指令時(shí)是否需要與所述可疑模塊不同的參考模塊的信息、并當(dāng)需要該信息時(shí),通過(guò)對(duì)可信的高速緩沖存儲(chǔ)器中的參考模塊寫(xiě)入一約束而不必訪問(wèn)該參考模塊,來(lái)執(zhí)行所述的一次一模塊預(yù)驗(yàn)證。
25.一種信號(hào)傳輸,包括在通信線路上的載波;和通過(guò)所述載波傳送的表示計(jì)算機(jī)控制命令的信號(hào)指示,用于判斷第一模塊是否已通過(guò)一次一模塊的預(yù)驗(yàn)證;用于當(dāng)?shù)谝荒K已通過(guò)預(yù)驗(yàn)證時(shí)判斷結(jié)果是否可信;若結(jié)果可信,則如果在被約束模塊中有預(yù)驗(yàn)證約束就讀取該預(yù)驗(yàn)證約束;若讀入預(yù)驗(yàn)證約束,則判斷被約束模塊是否被裝載;若該被約束模塊被裝載,則執(zhí)行預(yù)驗(yàn)證約束。
26.權(quán)利要求25的信號(hào)傳輸,進(jìn)一步包括通過(guò)所述載波傳送的計(jì)算機(jī)控制命令,用于通過(guò)驗(yàn)證數(shù)字標(biāo)記來(lái)判斷結(jié)果是否可信。
27.權(quán)利要求25的信號(hào)傳輸,進(jìn)一步包括通過(guò)所述載波傳送的計(jì)算機(jī)控制命令,用于通過(guò)在可信的高速緩沖存儲(chǔ)器中尋找約束來(lái)判斷結(jié)果是否可信。
28.權(quán)利要求25的信號(hào)傳輸,進(jìn)一步包括通過(guò)所述載波傳送的計(jì)算機(jī)控制命令,用于當(dāng)參考模塊未通過(guò)預(yù)驗(yàn)證約束時(shí)寫(xiě)入一出錯(cuò)信息。
29.一種可信預(yù)驗(yàn)證系統(tǒng),包括網(wǎng)絡(luò);用于存儲(chǔ)計(jì)算機(jī)程序模塊的、與網(wǎng)絡(luò)相連接的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì);用于在單個(gè)處理器控制下存儲(chǔ)模塊和約束的、與網(wǎng)絡(luò)相連接的可信的高速緩沖存儲(chǔ)器;與網(wǎng)絡(luò)相連接、可將模塊裝載其中的存儲(chǔ)器;與網(wǎng)絡(luò)相連接的處理器,其被配置成判斷將被裝載的可疑模塊是否來(lái)自非置信源,并且,若來(lái)自非置信源,則裝載該可疑模塊,并在鏈接前在該可疑模塊上執(zhí)行一次一模塊的預(yù)驗(yàn)證,并且,若該可疑模塊通過(guò)所述的預(yù)驗(yàn)證時(shí),將所述的模塊存儲(chǔ)于可信的高速緩沖存儲(chǔ)器中;與網(wǎng)絡(luò)相連接的處理器,被配置成通過(guò)判斷驗(yàn)證可疑模塊中的指令是否需要與可疑模塊不同的參考模塊中的信息、并在需要該信息時(shí)通過(guò)在可信的高速緩沖存儲(chǔ)器中寫(xiě)入該參考模塊的約束而不必訪問(wèn)該參考模塊,來(lái)執(zhí)行所述的一次一模塊的預(yù)驗(yàn)證;和與網(wǎng)絡(luò)相連接的處理器,被配置成判斷第一模塊是否已通過(guò)一次一模塊預(yù)驗(yàn)證;并當(dāng)?shù)谝荒K已通過(guò)預(yù)驗(yàn)證時(shí)判斷結(jié)果是否可信;若結(jié)果可信,則如果在被約束模塊中有預(yù)驗(yàn)證約束,就讀取該預(yù)驗(yàn)證約束;若讀入預(yù)驗(yàn)證約束,則判斷被約束模塊是否被裝載;若被約束模塊被裝載,則執(zhí)行預(yù)驗(yàn)證約束;其中,可信驗(yàn)證在鏈接過(guò)程中與減少的驗(yàn)證一次一模塊地執(zhí)行。
30.權(quán)利要求1的方法,其中的約束具有如此的形式,即其在參考模塊被定義的類型是一特定類型的子類型。
31.權(quán)利要求1的方法,進(jìn)一步包括執(zhí)行指令所要求的內(nèi)部模塊驗(yàn)證;返回以判斷驗(yàn)證第一模塊中的指令時(shí)是否需要一參考模塊中的信息,直到在第一模塊中需要的指令已經(jīng)過(guò)所述的判斷;并且當(dāng)所有需要的指令都通過(guò)內(nèi)部模塊驗(yàn)證時(shí),以數(shù)字方式對(duì)第一模塊增加標(biāo)記。
32.權(quán)利要求4的方法,所述的判斷結(jié)果是否可信的步驟包括在可信的高速緩沖存儲(chǔ)器中尋找第一模塊。
33.權(quán)利要求6的方法,所述的判斷結(jié)果是否可信的步驟進(jìn)一步包括在可信的高速緩沖存儲(chǔ)器中尋找第一模塊。
全文摘要
一次一模塊地預(yù)驗(yàn)證計(jì)算機(jī)程序模塊中的指令的方法、計(jì)算機(jī)程序、信號(hào)傳輸和裝置。首先確定要被裝載的可疑模塊是否來(lái)自非置信源如互聯(lián)網(wǎng),若該可疑模塊來(lái)自非置信源,則裝載該可疑模塊,并在鏈接前于可疑模塊中執(zhí)行一次一模塊的預(yù)驗(yàn)證,并且,若該可疑模塊通過(guò)所述的預(yù)驗(yàn)證,則將所述的可疑模塊存儲(chǔ)于可信的高速緩沖存儲(chǔ)器中。
文檔編號(hào)G06F9/54GK1305153SQ0011791
公開(kāi)日2001年7月25日 申請(qǐng)日期2000年5月26日 優(yōu)先權(quán)日1999年5月27日
發(fā)明者吉拉德·布拉查, 梁盛, 蒂蒙西G·林德霍爾姆 申請(qǐng)人:太陽(yáng)微系統(tǒng)公司