用于存儲(chǔ)器訪問保護(hù)的方法和系統(tǒng)的制作方法
【專利摘要】本發(fā)明提供了用于存儲(chǔ)器訪問保護(hù)的方法和系統(tǒng),具體地提供了一種用于空地址處理的方法。該方法包括在不在存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯代碼,與用于空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)存儲(chǔ)器訪問碼的第一地址,響應(yīng)于在編譯代碼的執(zhí)行期間在第一地址處發(fā)生異常,基于存儲(chǔ)信息來確定第二地址,以及執(zhí)行第二地址處的處理代碼。
【專利說明】用于存儲(chǔ)器訪問保護(hù)的方法和系統(tǒng)
[0001]通過引用結(jié)合
[0002]本公開要求2013年5月16日提交的美國(guó)臨時(shí)申請(qǐng)?zhí)?1/824,121、“Method forDelaying Null Check in Java VM”的優(yōu)先權(quán),其過引用結(jié)合被整體地通到本文中。
【技術(shù)領(lǐng)域】
[0003]本申請(qǐng)涉及存儲(chǔ)器領(lǐng)域,具體地,涉及用于用于存儲(chǔ)器訪問保護(hù)的方法和系統(tǒng)。
【背景技術(shù)】
[0004]在此提供的背景描述是出于一般地呈現(xiàn)本公開的背景的目的。目前署名的發(fā)明人的工作在其在本【背景技術(shù)】章節(jié)以及另外在提交時(shí)可能不會(huì)有資格作為現(xiàn)有技術(shù)的本描述的各方面中被描述的程度上,既然未明示地也未隱含地被承認(rèn)為針對(duì)本公開的現(xiàn)有技術(shù)。
[0005]—般地,諸如Dalvik等java虛擬機(jī)將頻繁使用的Java字節(jié)碼編譯成本地代碼(native code)以改善運(yùn)行時(shí)性能。在本地代碼中,在存儲(chǔ)器訪問之前執(zhí)行空校驗(yàn)(nullcheck)。在示例中,在訪問對(duì)象之前,本地代碼包括空校驗(yàn)碼以檢查對(duì)對(duì)象的參考是否是空的。當(dāng)參考不是空的時(shí),使用該參考來訪問對(duì)象。
【發(fā)明內(nèi)容】
[0006]本公開的各方面提供了一種用于空地址處理的方法。該方法包括:在不在存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯代碼,與用于空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)存儲(chǔ)器訪問碼的第一地址,響應(yīng)于在已編譯代碼的執(zhí)行期間在第一地址處發(fā)生異常而基于存儲(chǔ)信息來確定第二地址,以及執(zhí)行第二地址處的處理代碼。
[0007]為了與用于空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)存儲(chǔ)器訪問碼的第一地址,在一個(gè)實(shí)施方式中,該方法包括:與第二地址相關(guān)聯(lián)地將第一地址存儲(chǔ)在表格中。此外,該方法包括:在表中搜索所述第一地址;以及輸出與第一地址相關(guān)聯(lián)地存儲(chǔ)的第二地址。本公開的各方面提供了一種存儲(chǔ)用于促使處理器執(zhí)行用于空地址處理的操作的程序指令的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì)。該操作包括:在不在存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯代碼,與用于空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)存儲(chǔ)器訪問碼的第一地址,響應(yīng)于在編譯代碼的執(zhí)行期間在第一地址處發(fā)生異常而基于存儲(chǔ)信息來確定第二地址,以及執(zhí)行第二地址的處理代碼。
[0008]本公開的各方面提供了另一方法。該方法包括由Java虛擬機(jī)在不在存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯代碼,與用于空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)存儲(chǔ)器訪問碼的第一地址,響應(yīng)于在已編譯代碼的執(zhí)行期間在第一地址處發(fā)生異常而退出Java虛擬機(jī),以使得內(nèi)核基于存儲(chǔ)信息來確定第二地址,并用所確定地址返回Java虛擬機(jī)以執(zhí)行第二地址處的處理代碼。
【專利附圖】
【附圖說明】
[0009]將參考以下各圖詳細(xì)地描述作為示例而提出的本公開的各種實(shí)施方式,其中,相同的附圖標(biāo)記參考相同的元件,并且在所述附圖中:
[0010]圖1示出了根據(jù)本公開的實(shí)施方式的系統(tǒng)示例100的框圖;
[0011]圖2示出了概述根據(jù)本公開的實(shí)施方式的編譯過程200的流程圖;
[0012]圖3示出了概述本公開的實(shí)施方式的用于空地址處理的過程300的流程圖;
[0013]圖4A-4C示出了根據(jù)本公開的實(shí)施方式的代碼示例;以及
[0014]圖5示出了根據(jù)本公開的實(shí)施方式的用于內(nèi)核的偽代碼示例500。
【具體實(shí)施方式】
[0015]圖1示出了根據(jù)本公開的實(shí)施方式的系統(tǒng)示例100的框圖。系統(tǒng)100包括諸如處理模塊110、存儲(chǔ)器模塊120等硬件部件,以及諸如存儲(chǔ)于存儲(chǔ)器模塊120中的各種代碼指令的軟件部件。硬件部件根據(jù)軟件部件進(jìn)行操作以執(zhí)行各種任務(wù)。
[0016]系統(tǒng)100可以是任何適當(dāng)系統(tǒng),諸如臺(tái)式計(jì)算機(jī)、膝上型計(jì)算機(jī)、平板計(jì)算機(jī)、智能電話等。系統(tǒng)100可以包括其他適當(dāng)部件(未示出),諸如顯示器、觸摸屏、擴(kuò)音器、通信部件等。在實(shí)施方式中,系統(tǒng)100包括單個(gè)集成電路(IC)芯片,其在單個(gè)IC芯片上集成了諸如處理模塊110、存儲(chǔ)器模塊120等各種電路。在另一實(shí)施方式中,系統(tǒng)100包括多個(gè)IC芯片,諸如處理器芯片、存儲(chǔ)器芯片等。
[0017]處理模塊110包括一個(gè)或多個(gè)處理器,諸如中央處理單元(CPU) 111等,以執(zhí)行各種代碼指令以執(zhí)行各種任務(wù)。代碼指令可以是能夠被CPUlll直接地執(zhí)行的低級(jí)代碼,諸如機(jī)器代碼(本地代碼),或者可以是能夠被翻譯成機(jī)器代碼且然后執(zhí)行的高級(jí)代碼,諸如在Java語目中、在C語目中等。
[0018]能夠使用任何適當(dāng)架構(gòu)來實(shí)現(xiàn)CPU111,諸如x86、ARM等。在示例中,當(dāng)CPUlll具有x86架構(gòu)時(shí),CPUlll能夠執(zhí)行對(duì)于x86架構(gòu)而言特定的x86指令集中的機(jī)器代碼。在另一示例中,當(dāng)CPUlll具有ARM架構(gòu),CPUl 11能夠執(zhí)行對(duì)于ARM架構(gòu)而言特定的ARM指令集中的機(jī)器代碼。
[0019]存儲(chǔ)器模塊120包括為各種存儲(chǔ)需要提供存儲(chǔ)空間的一個(gè)或多個(gè)存儲(chǔ)介質(zhì)。在示例中,存儲(chǔ)器模塊120存儲(chǔ)將被處理模塊110執(zhí)行的代碼指令并存儲(chǔ)將被處理模塊110處理的數(shù)據(jù)。在另一示例中,存儲(chǔ)器模塊120包括為系統(tǒng)存儲(chǔ)分配的存儲(chǔ)空間,并且包括為用戶存儲(chǔ)分配的存儲(chǔ)空間。
[0020]存儲(chǔ)介質(zhì)包括但不限于硬盤驅(qū)動(dòng)器、光盤、固態(tài)驅(qū)動(dòng)器、只讀存儲(chǔ)器(ROM)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(DRAM)、靜態(tài)隨機(jī)存取存儲(chǔ)器(SRAM)、閃速存儲(chǔ)器等。
[0021]根據(jù)本公開的一方面,存儲(chǔ)器模塊120存儲(chǔ)各種計(jì)算機(jī)程序,諸如系統(tǒng)程序、應(yīng)用程序等。每個(gè)計(jì)算機(jī)程序包括將被執(zhí)行的用于執(zhí)行任務(wù)的代碼指令。在圖1示例中,在存儲(chǔ)器模塊120中分配存儲(chǔ)空間130以存儲(chǔ)用于內(nèi)核的程序。該內(nèi)核是使用戶應(yīng)用程序與系統(tǒng)100的硬件部件對(duì)接的用于系統(tǒng)100的操作系統(tǒng)的一部分。例如,內(nèi)核管理來自諸如用戶應(yīng)用程序等的軟件部件的輸入/輸出請(qǐng)求,并將其翻譯成數(shù)據(jù)處理指令以用于硬件部件,該硬件部件諸如處理模塊110、存儲(chǔ)器模塊120等。
[0022]此外,在圖1示例中,在存儲(chǔ)器模塊120中分配存儲(chǔ)空間140以存儲(chǔ)適合于系統(tǒng)100的Java軟件程序。Java軟件程序被安裝在系統(tǒng)100中以提供Java運(yùn)行時(shí)環(huán)境(JRE),使得能夠在系統(tǒng)100中執(zhí)行Java字節(jié)碼。在示例中,執(zhí)行Java軟件程序以啟動(dòng)系統(tǒng)100中的Java虛擬機(jī)以執(zhí)行Java字節(jié)碼。在示例中,系統(tǒng)100是安卓系統(tǒng),并且存儲(chǔ)空間140存儲(chǔ)用于安卓系統(tǒng)的Dalvik軟件程序。
[0023]在一個(gè)實(shí)施方式中,用Java語言來生成用戶應(yīng)用程序的源代碼。源代碼被編譯而生成用于應(yīng)用程序的Java字節(jié)碼。Java字節(jié)碼可由各種Java虛擬機(jī)執(zhí)行。在圖1示例中,分配存儲(chǔ)空間150以存儲(chǔ)用于用戶應(yīng)用程序的Java字節(jié)碼。為了執(zhí)行Java字節(jié)碼,系統(tǒng)100啟動(dòng)Java虛擬機(jī)。Java虛擬機(jī)為Java字節(jié)碼提供Java運(yùn)行時(shí)環(huán)境。在執(zhí)行Java字節(jié)碼之后,在本示例中終止Java虛擬機(jī)。
[0024]根據(jù)本公開的一方面,Java虛擬機(jī)將解釋和及時(shí)(JIT)編譯用于Java字節(jié)碼執(zhí)行。在示例中,Java虛擬機(jī)檢測(cè)Java字節(jié)碼中的頻繁執(zhí)行軌跡,諸如路徑、環(huán)路等,并以與不那么頻繁執(zhí)行的軌跡不同的方式來執(zhí)行頻繁執(zhí)行軌跡。例如,Java虛擬機(jī)跟蹤用于軌跡的執(zhí)行的數(shù)目。當(dāng)用于軌跡的執(zhí)行數(shù)目小于閾值(例如,2)時(shí),Java虛擬機(jī)通過解釋來執(zhí)行軌跡;并且當(dāng)用于軌跡的執(zhí)行數(shù)目等于或大于該閾值時(shí),Java虛擬機(jī)使用JIT編譯來將Java字節(jié)碼的軌跡編譯成本地代碼的軌跡,并將本地代碼的軌跡高速緩存在存儲(chǔ)器模塊120中。在圖1示例中,存儲(chǔ)空間155被分配為JIT高速緩存器以高速緩存已編譯本地代碼。然后,針對(duì)軌跡的進(jìn)一步執(zhí)行,Java虛擬機(jī)執(zhí)行存儲(chǔ)在存儲(chǔ)空間155處的高速緩存本地代碼。
[0025]一般地,在Java語言中,使用參考來訪問存儲(chǔ)器模塊120中的對(duì)象和陣列成員。為了確保安全的存儲(chǔ)器訪問,在示例中,Java虛擬機(jī)能夠在存儲(chǔ)器訪問碼之前添加本地代碼中的空校驗(yàn)碼,諸如對(duì)象訪問碼、陣列成員訪問碼等??招r?yàn)碼檢查參考是否是空的,并且代碼執(zhí)行流程根據(jù)空校驗(yàn)而分叉。在示例中,當(dāng)空校驗(yàn)為假(即參考并不是空的)時(shí),Java虛擬機(jī)遵循代碼序列以執(zhí)行存儲(chǔ)器訪問碼。當(dāng)空校驗(yàn)為真(例如,參考是空的)時(shí),Java虛擬機(jī)概念代碼序列以執(zhí)行處理空參考情況的空處理代碼。
[0026]根據(jù)本公開的一方面,添加的空校驗(yàn)碼采取額外的時(shí)鐘循環(huán)來執(zhí)行。另外,由于代碼執(zhí)行流程在空校驗(yàn)碼處分叉,所以空校驗(yàn)碼是用于指令調(diào)度的邊界。因此,添加空校驗(yàn)碼引起用于代碼優(yōu)化的代碼范圍減小。
[0027]根據(jù)本公開的方面,系統(tǒng)100中的Java虛擬機(jī)并不在存儲(chǔ)器訪問碼(諸如對(duì)象訪問碼、陣列成員訪問碼等)之前在本地代碼中添加空校驗(yàn)。替代地,Java虛擬機(jī)在空地址表中添加條目,諸如存儲(chǔ)在存儲(chǔ)器模塊120中的表格160。該條目與空處理代碼的地址相關(guān)聯(lián)地存儲(chǔ)存儲(chǔ)器訪問碼的地址。在圖1示例中,表160包括用于將存儲(chǔ)器訪問碼的地址存儲(chǔ)在本地代碼中的第一字段(PC ADDRESS)和用于存儲(chǔ)空處理代碼的地址的第二字段(NULLHANDLING ADDRESS)。
[0028]在操作期間,當(dāng)用于存儲(chǔ)器訪問碼的參考不是空時(shí),連續(xù)地執(zhí)行本地代碼。由于本地代碼并不具有空校驗(yàn)碼,則節(jié)省用于執(zhí)行空校驗(yàn)碼的時(shí)鐘循環(huán)。另外,在由于空校驗(yàn)碼而沒有調(diào)度邊界的情況下,可擴(kuò)大用于代碼優(yōu)化的代碼范圍。然后,能夠優(yōu)化較大范圍的本地代碼以進(jìn)一步改善Java虛擬機(jī)性能。
[0029]然而,當(dāng)用于存儲(chǔ)器訪問碼的參考是空或接近于空,則參考指向一般地被保護(hù)免于用戶訪問的系統(tǒng)空間,一般地,系統(tǒng)100退出應(yīng)用程序,并且進(jìn)入內(nèi)核中的異常情況處理功能。根據(jù)本公開的一方面,系統(tǒng)100的內(nèi)核確定空處理代碼的地址。然后,系統(tǒng)100在空處理代碼的地址處返回應(yīng)用程序。在實(shí)施方式中,系統(tǒng)100的內(nèi)核例如基于表160根據(jù)引起異常情況的存儲(chǔ)器訪問碼的地址(例如,系統(tǒng)100的程序計(jì)數(shù)器(PC)中的地址),來確定空處理代碼的地址。在示例中,內(nèi)核在表160中搜索存儲(chǔ)器訪問碼的地址。當(dāng)內(nèi)核在表160中找到在第一字段中具有存儲(chǔ)器訪問碼的地址的條目時(shí),內(nèi)核獲得存儲(chǔ)在條目的第二字段中的空處理代碼的地址。然后,系統(tǒng)100在所確定地址處返回應(yīng)用程序以執(zhí)行空處理代碼。
[0030]圖2示出了概述根據(jù)本公開的實(shí)施方式的用于編譯的過程示例200的流程圖。在圖1示例中,采取Java語言的應(yīng)用程序被翻譯成Java字節(jié)碼,并且該Java字節(jié)碼被存儲(chǔ)在存儲(chǔ)器模塊120中的存儲(chǔ)空間150處。在實(shí)施方式中,為了執(zhí)行Java字節(jié)碼,系統(tǒng)100執(zhí)行存儲(chǔ)于存儲(chǔ)空間140處的Java軟件程序以開始Java虛擬機(jī)。Java虛擬機(jī)提供用于執(zhí)行Java字節(jié)碼的Java運(yùn)行時(shí)環(huán)境。在示例中,Java虛擬機(jī)使用JIT編譯來將Java字節(jié)碼的頻繁使用軌跡編譯成本地代碼,并且Java虛擬機(jī)執(zhí)行已編譯本地代碼以改善性能。在示例中,Java虛擬機(jī)使用過程200來將存儲(chǔ)器訪問碼從Java字節(jié)碼編譯成本地代碼。該過程在S201處開始并前進(jìn)至S210。
[0031]在210處,接收存儲(chǔ)器訪問碼以用于編譯。在示例中,存儲(chǔ)器訪問碼在頻繁使用Java字節(jié)碼的軌跡中。
[0032]在S220處,存儲(chǔ)器訪問碼在不添加空校驗(yàn)的情況下被編譯成本地代碼。在示例中,系統(tǒng)100中的Java虛擬機(jī)將存儲(chǔ)器訪問碼從Java字節(jié)碼編譯成本地代碼,而不在本地代碼中的存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼。
[0033]在S230處,與用于在存儲(chǔ)器訪問碼處處理空的空處理代碼相關(guān)聯(lián)地存儲(chǔ)本地代碼中的存儲(chǔ)器訪問碼的地址。在圖1示例中,將本地代碼中的已編譯存儲(chǔ)器訪問碼的地址存儲(chǔ)在表160中的條目的第一字段中,并將用于在存儲(chǔ)器訪問碼處的處理空參考的空處理代碼的地址存儲(chǔ)在條目的第二字段中。然后,過程前進(jìn)至S240并終止。
[0034]應(yīng)注意的是,能夠反復(fù)地使用過程200來將Java字節(jié)碼的頻繁使用軌跡中的任何存儲(chǔ)器訪問碼編譯成本地代碼。
[0035]圖3示出了概述根據(jù)本公開的實(shí)施方式的用于運(yùn)行時(shí)間的空地址處理的過程300的流程圖。在圖1示例中,系統(tǒng)100中的Java虛擬機(jī)在不添加空校驗(yàn)的情況下將頻繁使用Java字節(jié)碼編譯成本地代碼,并且然后執(zhí)行本地代碼。過程300被系統(tǒng)100用來處理空地址情況。該過程在S301處開始并前進(jìn)至S310。
[0036]在S310處,系統(tǒng)在用戶模式下執(zhí)行本地代碼。在圖1的示例中,當(dāng)系統(tǒng)100執(zhí)行用于用戶應(yīng)用程序的代碼、諸如存儲(chǔ)在存儲(chǔ)空間150處的應(yīng)用程序時(shí),系統(tǒng)100處于用戶模式。此外,在圖1示例中,應(yīng)用程序中的Java字節(jié)碼的頻繁使用軌跡在沒有存儲(chǔ)在存儲(chǔ)空間155處的空校驗(yàn)的情況下編譯成本地代碼,并且該本地代碼在用戶模式下被系統(tǒng)100執(zhí)行。
[0037]在S320處,系統(tǒng)響應(yīng)于針對(duì)存儲(chǔ)器訪問的空參考而退出用戶模式。在圖1示例中,由于本地代碼在存儲(chǔ)器訪問碼前面不包括空校驗(yàn)碼,所以當(dāng)用于存儲(chǔ)器訪問的參考為空或接近于空時(shí),生成特定信號(hào)(例如,SIGSEGV)以向系統(tǒng)100信號(hào)通知分段違規(guī),并且系統(tǒng)100退出用戶模式,并響應(yīng)于特定信號(hào)而進(jìn)入地址異常模式。
[0038]在S330處,系統(tǒng)確定用于存儲(chǔ)器訪問碼的空處理代碼的地址。在圖1的示例中,當(dāng)系統(tǒng)100處于地址異常模式時(shí),在實(shí)施方式中,內(nèi)核針對(duì)本地代碼中的存儲(chǔ)器訪問碼的地址而搜索表160中的第一字段。當(dāng)內(nèi)核找到條目中的匹配時(shí),內(nèi)核提取該條目的第二字段中的空處理代碼的地址。在示例中,表160被存儲(chǔ)在為用戶存儲(chǔ)分配的存儲(chǔ)空間,并且該內(nèi)核使用諸如1ctlO之類的系統(tǒng)調(diào)用來訪問表160。
[0039]在S340處,系統(tǒng)100返回到用戶模式以處理空地址。在圖1示例中,將程序計(jì)數(shù)器設(shè)置成空處理代碼的地址,并且系統(tǒng)100返回至用戶模式以執(zhí)行空處理代碼以處理空地址。然后該過程前進(jìn)至S399并終止。
[0040]圖4A示出了采取Java語言的應(yīng)用程序代碼410的一部分。應(yīng)用程序代碼410包括對(duì)象訪問碼415。
[0041]圖4B示出了采取Java字節(jié)碼的應(yīng)用程序代碼420的一部分。在實(shí)施方式中,應(yīng)用程序代碼410被編譯成應(yīng)用程序代碼420。應(yīng)用程序代碼420包括對(duì)應(yīng)于圖4A中的對(duì)象訪問碼415的對(duì)象訪問碼425。在圖1的示例中,應(yīng)用程序代碼420例如被存儲(chǔ)在存儲(chǔ)空間150 處。
[0042]圖4C示出了采取本地代碼的應(yīng)用程序代碼430的一部分。在示例中,Java虛擬機(jī)在運(yùn)行時(shí)間將應(yīng)用程序代碼420的頻繁使用軌跡編譯成應(yīng)用程序代碼430。本地代碼中的應(yīng)用程序代碼430包括對(duì)應(yīng)于圖4B中的對(duì)象訪問碼425的對(duì)象訪問碼435。應(yīng)注意的是,應(yīng)用程序代碼430在對(duì)象訪問碼435之前不包括空校驗(yàn)碼(例如,cbz指令)。使用圖1中的示例,應(yīng)用程序代碼430被存儲(chǔ)在例如為JIT高速緩存器分配的存儲(chǔ)空間155處。在JIT高速緩存器中的地址(例如,0x46692012)處高速緩存對(duì)象訪問碼435。應(yīng)注意的是應(yīng)用程序代碼430包括空處理代碼445,其在JIT高速緩存器中的地址(例如,0x46692044)處開始以處理對(duì)象訪問碼435處的空地址。
[0043]根據(jù)本公開的一方面,與空處理代碼445的地址相關(guān)聯(lián)地存儲(chǔ)對(duì)象訪問碼435的地址。在示例中,在編譯時(shí),對(duì)象訪問碼435的地址被存儲(chǔ)在表160的條目中的第一字段中,并且空處理代碼445的地址被存儲(chǔ)在條目的第二字段中,如圖1中所示。
[0044]圖5示出了根據(jù)本公開的某些實(shí)施方式的Linux內(nèi)核的偽代碼示例500。在示例中,在系統(tǒng)100中使用Linux內(nèi)核。Linux內(nèi)核包括當(dāng)存儲(chǔ)器訪問碼觸發(fā)異常情況時(shí)被調(diào)用的函數(shù)“_do_user_fault”。例如,響應(yīng)于特定信號(hào)SIGSEGV而調(diào)用該函數(shù)。
[0045]根據(jù)偽代碼500,該函數(shù)檢查觸發(fā)異常情況的存儲(chǔ)器訪問碼的地址是否在諸如表160之類的空地址表中。當(dāng)該地址在空地址表中時(shí),程序計(jì)數(shù)器變成與存儲(chǔ)器訪問碼的地址相關(guān)聯(lián)地存儲(chǔ)的空處理代碼的地址。然后,該函數(shù)返回至用戶模式。
[0046]雖然已結(jié)合作為示例而提出的本公開的特定實(shí)施方式描述了本公開的各方面,但可對(duì)示例進(jìn)行替換、修改以及變更。相應(yīng)的,如在本文中所闡述的實(shí)施方式意圖是說明性而非限制性的。在不脫離下面闡述的權(quán)利要求的范圍的情況下,存在可實(shí)現(xiàn)的變更。
【權(quán)利要求】
1.一種用于空地址處理的方法,包括: 在不在存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯代碼; 與用于空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的第一地址;響應(yīng)于在已編譯的所述代碼的執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的信息來確定所述第二地址;以及 執(zhí)行所述第二地址處的處理代碼。
2.根據(jù)權(quán)利要求1所述的方法,其中,與用于空地址的所述處理代碼的所述第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的所述第一地址還包括: 與所述第二地址相關(guān)聯(lián)地將所述第一地址存儲(chǔ)在表中。
3.根據(jù)權(quán)利要求2所述的方法,其中,響應(yīng)于在已編譯的所述代碼的所述執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的所述信息來確定所述第二地址還包括: 在所述表中搜索所述第一地址;以及 輸出與所述第一地址相關(guān)聯(lián)地存儲(chǔ)的所述第二地址。
4.根據(jù)權(quán)利要求1所述的方法,其中,響應(yīng)于在已編譯的所述代碼的所述執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的所述信息來確定所述第二地址還包括: 由內(nèi)核來確定與所述第一地址相關(guān)聯(lián)的所述第二地址。
5.根據(jù)權(quán)利要求1所述的方法,其中,在不在所述存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯所述代碼還包括以下中的至少一個(gè): 在不在陣列成員訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼;以及 在不在對(duì)象訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼。
6.根據(jù)權(quán)利要求1所述的方法,其中,在不在所述存儲(chǔ)器訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼還包括: 由Java虛擬機(jī)在不在所述存儲(chǔ)器訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼。
7.根據(jù)權(quán)利要求6所述的方法,其中,與用于所述空地址的所述處理代碼的所述第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的所述第一地址還包括: 由所述Java虛擬機(jī)來與用于所述空地址的所述處理代碼的所述第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的所述第一地址。
8.根據(jù)權(quán)利要求7所述的方法,其中,響應(yīng)于在已編譯的所述代碼的所述執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的所述信息來確定所述第二地址還包括: 由內(nèi)核來確定與所述第一地址相關(guān)聯(lián)的所述第二地址。
9.根據(jù)權(quán)利要求8所述的方法,其中,執(zhí)行所述第二地址處的所述處理代碼還包括: 返回到所述Java虛擬機(jī)以執(zhí)行所述第二地址處的所述處理代碼。
10.一種存儲(chǔ)用于促使處理器執(zhí)行用于空地址處理的操作的程序指令的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),所述操作包括: 在不在存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯代碼; 與用于空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的第一地址;響應(yīng)于在已編譯的所述代碼的執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的信息來確定所述第二地址;以及 執(zhí)行所述第二地址處的所述處理代碼。
11.根據(jù)權(quán)利要求10所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,與用于空地址的所述處理代碼的所述第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的所述第一地址的所述操作還包括: 與所述第二地址相關(guān)聯(lián)地將所述第一地址存儲(chǔ)在表中。
12.根據(jù)權(quán)利要求11所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,響應(yīng)于在已編譯的所述代碼的所述執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的所述信息來確定所述第二地址的所述操作還包括: 在所述表中搜索所述第一地址;以及 輸出與所述第一地址相關(guān)聯(lián)地存儲(chǔ)的所述第二地址。
13.根據(jù)權(quán)利要求10所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,響應(yīng)于在已編譯的所述代碼的所述執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的所述信息來確定所述第二地址的所述操作還包括: 由內(nèi)核來確定與所述第一地址相關(guān)聯(lián)的所述第二地址。
14.根據(jù)權(quán)利要求10所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,在不在所述存儲(chǔ)器訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼的所述操作還包括以下中的至少一個(gè): 在不在陣列成員訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼;以及 在不在對(duì)象訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼。
15.根據(jù)權(quán)利要求10所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,在不在所述存儲(chǔ)器訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼的所述操作還包括: 由Java虛擬機(jī)在不在所述存儲(chǔ)器訪問碼之前添加所述空校驗(yàn)碼的情況下編譯所述代碼。
16.根據(jù)權(quán)利要求15所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,與用于所述空地址的所述處理代碼的所述第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的所述第一地址的所述操作還包括: 由所述Java虛擬機(jī)來與用于所述空地址的所述處理代碼的所述第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的所述第一地址。
17.根據(jù)權(quán)利要求16所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,響應(yīng)于在已編譯的所述代碼的所述執(zhí)行期間在所述第一地址處發(fā)生異常,基于存儲(chǔ)的所述信息來確定所述第二地址的所述操作還包括: 由內(nèi)核來確定與所述第一地址相關(guān)聯(lián)的所述第二地址。
18.根據(jù)權(quán)利要求17所述的非瞬態(tài)計(jì)算機(jī)可讀介質(zhì),其中,執(zhí)行所述第二地址處的所述處理代碼的所述操作還包括: 返回到所述Java虛擬機(jī)以執(zhí)行所述第二地址處的所述處理代碼。
19.一種用于空地址處理的方法,包括: 由Java虛擬機(jī)在不在存儲(chǔ)器訪問碼之前添加空校驗(yàn)碼的情況下編譯代碼; 與用于所述空地址的處理代碼的第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的第一地址; 響應(yīng)于在已編譯的所述代碼的執(zhí)行期間在所述第一地址處發(fā)生異常,退出所述Java虛擬機(jī)以基于存儲(chǔ)的信息來確定所述第二地址;以及 用確定的所述第二地址返回至Java虛擬機(jī)以執(zhí)行所述第二地址處的所述處理代碼。
20.根據(jù)權(quán)利要求19所述的方法,其中,與用于空地址的所述處理代碼的所述第二地址相關(guān)聯(lián)地存儲(chǔ)所述存儲(chǔ)器訪問碼的所述第一地址還包括: 與第二地址相關(guān)聯(lián)地將所述第一地址存儲(chǔ)在表中。
【文檔編號(hào)】G06F9/455GK104166633SQ201410204214
【公開日】2014年11月26日 申請(qǐng)日期:2014年5月14日 優(yōu)先權(quán)日:2013年5月16日
【發(fā)明者】黃海濤, 范曄 申請(qǐng)人:馬維爾國(guó)際貿(mào)易有限公司