專利名稱:本地和非本地共享數(shù)據(jù)結構間的數(shù)據(jù)對齊的制作方法
技術領域:
本發(fā)明一般涉及便于本地計算平臺內非本地程序組件的操作的技術。
背景技術:
為運行在特定計算平臺上設計的應用程序并不工作在不同的計算平臺上。一般而言,軟件不能避免地連到特定的計算平臺,它被設計以工作在該平臺上。例如,為了在運行Unix操作系統(tǒng)的小型計算機內工作而編寫和編譯的軟件不會在使用私有操作系統(tǒng)的手提電腦內起作用。
計算平臺一般包括操作系統(tǒng)(OS)和計算硬件結構。操作系統(tǒng)的例子包括以下Microsoft操作系統(tǒng)MS-DOS、WindowsXP、Windows2000、Window NT4.0、WindowsME、Windows98和Windows95。計算硬件結構的例子包括與以下Intel微處理器相關的硬件結構80286、Pentium、PentiumII、PentiumIII和ItaniumTM。
計算平臺的例子包括16位平臺(比如MicrosoftMS-DOS和Intel80286)、32位平臺(比如MicrosoftWindowsNT和IntelPentiumII)以及64位平臺(比如IntelItaniumTM和例如WindowsXP 64位版本)。計算平臺也稱為平臺、計算環(huán)境或環(huán)境。
設計了特定的應用程序版本以工作在特定的平臺下。當這些應用程序在它們特定的平臺執(zhí)行時,它們可以被稱為“本地的”。例如,MicrosoftOffice 2000是為工作在32位平臺上而設計的應用程序。換言之,MicrosoftOffice2000是與其32位平臺有關的本地應用程序。然而,當這些32位的應用程序在不同平臺下執(zhí)行時,比如64位平臺,它們可以被稱為“非本地的”。
程序模塊目標平臺(或簡稱為“目標平臺”)的例子是可執(zhí)行程序(如程序模塊、應用程序、程序)在其上運行的平臺。對于程序模塊而言,其目標平臺也是其本地平臺。例如,如果構造MicrosoftOffice應用程序運行在Windows2000 32位X86操作系統(tǒng)環(huán)境下,則對于該映射目標平臺會是32位的x86。
應用程序是這里作為術語使用的“程序模塊”的主要例子。然而,術語“程序模塊”包括可能不被標記為應用程序的其它可執(zhí)行軟件。
典型的計算機結構典型的計算機結構是多層的。從底層往上依次包括硬件層、操作系統(tǒng)(OS)層以及應用層?;蛘撸@些層可以被描述為硬件層、內核模式層以及用戶模式層。
圖1說明了典型計算機結構100的各層。層的頂部是用戶模式110。它包括應用程序,比如應用程序112a-e。這些應用程序與一組API 120通信。一般而言,該組API被視為操作系統(tǒng)的一部分,并因此是計算平臺的一部分。
該結構的下一層是內核模式130。這一般可以被稱為操作系統(tǒng)的“內核”。由于它是操作系統(tǒng)的一部分,因此它是計算平臺的一部分。
操作系統(tǒng)的內核是操作系統(tǒng)的特許部分——操作系統(tǒng)最可信的部分。它是內部代碼層。它一般運行I/O 132、安全性134、顯示控制(即對屏幕的存取)136、內存管理138以及其它特許功能139。內核通過設備驅動器142及其他硬件接口144對硬件層150內的硬件具有唯一存取。
內核API 140是內核中的那些API,它們任意存取內核功能。應用程序一般不直接調用內核,而是調用API 120,而API又可以調用內核(特別是內核API 140)。
盡管圖1未示出內核130的組件132-144之間有連接,然而這些組件可以根據(jù)需要而連接。為了簡潔從圖中省略了耦合線。
在內核模式130下是硬件層150。該層包括實際計算機的所有硬件。包括處理器、內存、磁盤I/O、其它I/O等等。平臺也包括硬件層。
因此,計算平臺包括硬件層、內核層,還一般包括用戶模式API 120。
互用性和兼容性由于計算平臺不斷發(fā)展,應用程序兼容性一直是主要問題。人們希望在理想中在他們所選的平臺下運行他們期望的應用程序。然而在現(xiàn)實中,難以使一應用程序在與它被設計所用的平臺不同的主機平臺上運行。例如,32位的x86應用程序不能在64位的Itanium(IA64)環(huán)境中運行。當人們購買了更強大的機器其中的平臺與他們以前使用的不同時,這個問題更加惡化。舊平臺的所有應用程序立即變得無用。
各平臺具有其相應的本地應用程序主體,它們被設計成在該平臺下運行。當公布了新一代平臺時,軟件開發(fā)商一般會升級他們的產品使其運行在新一代平臺下。軟件開發(fā)商這樣做有許多原因,包括市場、技術和經濟原因。
為了類似的原因,操作系統(tǒng)開發(fā)商希望他們的產品向后兼容。這樣,較舊代的應用程序可以運行在最新一代的操作系統(tǒng)(因此是最新一代的平臺)上。換言之,如果非本地應用程序可以運行在本地平臺下(包括新的操作系統(tǒng)),則因為用戶不必一定要丟棄他們目前的應用程序而購買新版本,這就鼓勵了用戶購買新的操作系統(tǒng)。這還給軟件開發(fā)商以時間來開發(fā)對其應用程序的升級。
這里,兼容性的例子是一非本地程序模塊,該模塊運行正常并且與本地計算環(huán)境(如操作系統(tǒng))內的本地程序模塊和平共處。
如這里所使用的,互用性的例子是本地和非本地程序模塊都能共享資源(比如存取彼此內存空間或共享內存空間內的數(shù)據(jù))以及/或者一起協(xié)同工作。
為了簡潔,這里使用一示例來說明非本地應用程序的不兼容性以及本地和非本地應用程序間的非互用性的問題。在該例中,非本地程序模塊被稱為32位應用程序,因為它們被設計成工作在32位平臺上。在該例中,本地應用程序被稱為64位應用程序,因為它們被設計成工作在本地平臺上,本地平臺是64位的。提供的只是一個例子而不是限制性的。本領域的普通技術人員可以理解,存在本地和非本地應用程序與本地平臺的其它組合。
在本地平臺上運行非本地應用程序設想在本地平臺上運行非本地應用程序。更具體地說,設想這個例子在64位環(huán)境中運行32位的應用程序。對于該例,假定該64位平臺是對現(xiàn)有的通用32位平臺(其上設計運行32位的應用程序)的升級。
在計算機結構中,數(shù)字位的平臺(如32位平臺)一般是指平臺可尋址內存的字長。一般而言,一個字是一個內存到處理器寄存器的單次操作內被移動的數(shù)據(jù)單位。在過去幾十年的最熟悉的結構中,一個字曾經是長度為四字節(jié),即32位。標準PC內使用的IBM的大型處理器和Intel的處理器都使用了32位的字。Intel及其他公司最近的處理器規(guī)定了64位的字。
64位平臺相對于32位平臺的一個優(yōu)點是可以尋址大得多的內存空間。首先,這是因為內存的地址在64位平臺內可以是64位長,而在32位平臺內一般是32位長的地址。
數(shù)據(jù)對齊對齊是把數(shù)據(jù)在使平臺更有效存取的地址處輸入到計算機內存中。一般而言,這是通過把數(shù)據(jù)保存在內存的字邊界而完成的。這點完成的代價是當被保存的數(shù)據(jù)長度小于一個字時浪費了一些內存。然而,對齊的好處是速度。對保存在內存中的數(shù)據(jù)進行對齊加快了這種數(shù)據(jù)的內存存取,因為最有效地使用了計算機平臺。
例如,現(xiàn)代RISC平臺以多字節(jié)的大塊從內存讀取,一般是4或8字節(jié)長,這些大塊必須在大塊大小的倍數(shù)的地址處開始。對未對齊地址的內存存取由多個對齊的存取來仿真,并且慢得多,或者會產生總線差錯并中斷程序。其它平臺可以更得體地處理未對齊的(即字節(jié)對齊的)內存存取,但這使性能降級。
本領域的普通技術人員熟悉數(shù)據(jù)對齊以及這樣做的成本和好處。
由本地和非本地共享的內存互用性和兼容性的一個問題是對非本地(如32位)應用程序和本地(如64位)應用程序間共享的內存進行管理。另一問題是對非本地(如32位)應用程序和本地(如64位)操作系統(tǒng)間共享的內存進行管理。
當本地和非本地間的內存地址對齊不相同時尤其如此。例如,在32位環(huán)境中,所有數(shù)據(jù)以四(4)字節(jié)遞增在內存中對齊,而所有數(shù)據(jù)以八(8)字節(jié)遞增對齊。在這種情況下,非本地應用程序的數(shù)據(jù)可能以本地環(huán)境的不對齊方式被保存。
圖2說明了這一點。內存塊210代表基于32位字尋址方案的內存結構。實心垂線表示字邊界。在兩個字長內存單元212和214中保存了64位的數(shù)據(jù),標為“A1”到“A8”,而在單個字長內存單元216中保存了32位的數(shù)據(jù),標為“B1”到“A4”。
圖2中,內存塊230和250表示基于64位字尋址方案的內存結構。同樣,實心垂線表示字邊界。
當塊210的A1-A8數(shù)據(jù)和B1-B4數(shù)據(jù)被轉換以用于64位內存尋址方案時,可以以內存塊230描述的方式來保存和尋址。更具體地說,該方式是不對齊的。然而,以對齊方式把相同的數(shù)據(jù)保存在內存塊250中。
因此,當面臨是否對齊數(shù)據(jù)的決定時,一個選項是忽略該問題并允許硬件來補償它。如上所述并且由圖2的內存塊230所述,通過對來自不止一個連續(xù)內存地址單元的重復數(shù)據(jù)進行尋址,硬件可以進行補償。該方法的代價是從內存存取數(shù)據(jù)所需的額外時間。只有當(多存取的)損失時間是可容忍的時該方法才是可行的。
如果為了補償內存中的數(shù)據(jù)不對齊而浪費的時間變得不可容忍那將怎么辦?
另一問題是是否總是有必要強制對齊。有時對齊自然地發(fā)生。
發(fā)明概述這里描述了一種便于本地計算平臺內非本地程序組件的操作的技術。
該技術提供了一種機制,用于(根據(jù)需要)使數(shù)據(jù)結構的參數(shù)對齊,使得不同范例的程序模塊或操作系統(tǒng)可以使用它們。使數(shù)據(jù)結構的參數(shù)數(shù)據(jù)對齊,以匹配本地范例。一般而言,這種數(shù)據(jù)結構由非本地程序模塊和本地操作系統(tǒng)(或其它程序模塊)所共享。它對齊使得本地平臺可快速且容易地訪問數(shù)據(jù)——否則將是不對齊的并且妨礙性能。
這個概述本身不限制本專利的范圍。為了更好地理解本發(fā)明,結合附圖考慮下列詳細描述和附圖。本發(fā)明的范圍在所附權利要求中指出。
附圖簡述附圖中使用了相同的數(shù)字來指代相同的元件和特征。
圖1是示出計算結構的示意框圖。
圖2是說明本地和非本地內存塊的圖。
圖3是示出適用于這里所述實施例的計算結構的示意性框圖。
圖4是適用于這里所述實施例的內核仿真器的示意性框圖。
圖5是示出這里所述的方法實施的流程圖。
圖6是能實現(xiàn)這里所述實施例(全部或部分地)的計算操作環(huán)境的示例。
優(yōu)選實施例的詳細描述在下列描述中,為了說明,給出了特定的數(shù)字、材料和配置以便提供對本發(fā)明的徹底理解。然而,對于本領域技術人員顯而易見的是,本發(fā)明可以無須特定的示例性細節(jié)而實現(xiàn)。在其它情況下,省略或簡化了公知的特征以簡化本發(fā)明示例性實施的描述,從而更好地說明了本發(fā)明。而且,為了理解容易,把特定的方法步驟描述為分開的步驟;然而,這些分開描述的步驟不必要一定為該順序,這取決于它們的性能。
下列描述提出了在本地和非本地共享數(shù)據(jù)結構間進行數(shù)據(jù)對齊的一個或多個示例性實現(xiàn)。發(fā)明人把這些示例性實現(xiàn)作為示例。發(fā)明人不認為這些示例性實現(xiàn)會限制本發(fā)明的范圍。而認為本發(fā)明可以以結合其它現(xiàn)有或將來技術以其它方式體現(xiàn)和實現(xiàn)。
本地和非本地共享數(shù)據(jù)結構間數(shù)據(jù)對齊的實施例示例可以被稱為“示例性的數(shù)據(jù)整直器”。
結合引用以下美國專利申請通過引用被結合于此美國專利申請序列號09/847,535,題為“Kernel Emulator for Non-Native Program Modules”,于2001年5月1日提交。
簡介這里所述的示例性數(shù)據(jù)整直器的一個或多個示例性實現(xiàn)可以由本地/非本地格式轉換系統(tǒng)400和/或由像圖6所示的計算環(huán)境來(全部或部分)實現(xiàn)。
這里所述的示例性數(shù)據(jù)整直器提供了一種機制,其非本地應用程序可以透明且有效地運行在本地平臺上。例如,通過使用示例性內核仿真器,32位應用程序可以運行在64位平臺上。更具體地說,這里所述的示例性數(shù)據(jù)整直器提供了一種機制,用于根據(jù)需要對不同平臺(如本地和非本地)的應用程序和/或操作系統(tǒng)所共享的數(shù)據(jù)結構進行對齊。
內核仿真綜述這里所述的示例性數(shù)據(jù)整直器可以作為(例如)內核仿真的一部分來實現(xiàn),比如在以下申請中描述的美國專利申請序列號09/847,535,題為“Kernel Emulatorfor Non-Native Program Modules”,于2001年5月1日提交(該申請通過引用被結合于此)。
在這種內核仿真中,非本地應用程序表現(xiàn)為運行在帶有其非本地內核的操作系統(tǒng)(OS)上。它們的非本地內核被仿真。非本地內核仿真器截斷由非本地應用程序作出的內核調用,并把它們轉化成本地內核調用。
適當計算機結構的例子圖3說明了適用于實現(xiàn)示例性數(shù)據(jù)整直器的計算機結構300的例子。本領域的普通技術人員可以理解可適用于實施的其它可能的計算機結構。
該結構包括一本地平臺,該平臺包括硬件350、內核模式330以及用戶模式310的一組本地API 320。結構300的頂部是用戶模式310。它包括應用程序。更具體地說,它包括本地應用程序(比如應用程序312a-c)和非本地應用程序(比如應用程序314a和314b)。
本地應用程序與一組本地API 320通信。一般而言,該組API 320被視為本地操作系統(tǒng)的一部分,因此是本地計算平臺的一部分。非本地應用程序與一組非本地API 322通信。一般而言,該組非本地API 320被視為非本地操作系統(tǒng)的一部分,因此不是本地計算平臺的一部分。
結構300的下一層是本地內核模式330。這一般被稱為本地操作系統(tǒng)的本地“內核”。由于它是本地操作系統(tǒng)的一部分,因此它是本地計算平臺的一部分。
這個本地內核330包括本地內核API 340和各種內核功能333,比如I/O、安全性、顯示控制(即對屏幕的存取)、內存管理及其他特許功能。本地內核330通過設備驅動器342及其他硬件接口344對硬件層350內的硬件具有唯一存取。本地內核API 340是在內核中的那些裁決對內核功能的存儲的API。
在內核模式330下是硬件層350。該層包括實際計算機的所有硬件。包括處理器、內存、磁盤I/O、其它I/O等等。本地平臺也包括硬件層。
因此,本地計算平臺包括硬件層350、內核層350,還一般包括用戶模式本地API 320。本地平臺不包括非本地API 322或非本地內核仿真器400。
內核仿真器的例子圖4說明了非本地內核仿真器400,它是可采用示例性數(shù)據(jù)整直器的實施例的示例性內核仿真器的實現(xiàn)。它包括非本地內核API的仿真器410,也稱為非本地CPU模擬器(或簡稱為“CPU”模擬器)。為了避免與術語混淆,這將稱為CPU模擬器410。
CPU模擬器410包括變換器412,用于把非本地指令組變換成本地CPU指令組;轉換器414,用于把非本地字長轉換成本地字長;以及內存約束器416,用于把非本地應用程序可存取的內存限制為這些應用程序能尋址的內存。
非本地應用程序對內核的調用CPU模擬器410從非本地應用程序接收內核調用。更具體地說,CPU模擬器410從非本地API接收內核調用。
內核仿真器400不執(zhí)行內核的功能,而是把非本地調用從其非本地格式變換為本地格式。然后把經變換的調用傳遞到本地內核給本地內核處理,就好像該調用來自本地應用程序。然而,為了做到這一點會不僅僅包括語言的簡單變換。它會包括非本地和本地平臺間范例的轉換。
變換器412執(zhí)行指令仿真。它處理非本地處理器的指令組的仿真。
轉換器414管理自變量格式和字長。它把自變量格式從非本地變?yōu)楸镜兀炎珠L從非本地變?yōu)楸镜亍?br>
變換器412和轉換器414一起管理32位平臺的自變量通過堆棧慣例到64位平臺的自變量通過寄存器慣例。這是自變量值怎樣傳遞的范例變化示例。CPU模擬器410用變換器412對CPU指令組的變換說明了該變化。
在另一例中,在32位平臺中,字長為32位長。因此,地址和數(shù)據(jù)一般以32位長的字被寫入內存中。在64位平臺中,字長為64位長。因此,地址和數(shù)據(jù)一般以64位長的字被寫入內存中。
參數(shù)(即自變量)一般長度為一個字。因此,64位內核API的參數(shù)長度為64位;而不是對于32位內核API的32位長。
轉換器把非本地應用程序(和API)所傳遞的32位自變量從32位展寬到64位。怎樣做到這一點的一例是通過用32個前導零填充自變量。在示例性實現(xiàn)中,轉換器414主要工作在用戶層內。
如上所述,不同的平臺一般會有不同的字長。因而,可尋址的內存空間大小也不同。因此,轉換器414把地址(尤其是指針)作為其字轉換的一部分來轉換。
例如,32位平臺的內存地址可以高達32位長;因此,最大可尋址的內存約為4GB(如果保留一位,則最大值約為2GB)。64位平臺的內存地址可以高達64位長;因此,最大可尋址的內存以兆兆字節(jié)來度量。因此,32位和64位平臺間的可尋址內存大小是不同的。
本地和非本地間共享的數(shù)據(jù)結構互用性和兼容性的一個問題是管理非本地(如32位)應用程序和本地(如64位)應用程序或本地(如64位)操作系統(tǒng)間共享的內存。特別是,當在非本地應用程序和本地應用程序或本地操作系統(tǒng)間(保存在內存中的)共享數(shù)據(jù)結構時是有問題的。
對齊數(shù)據(jù)對齊是共享數(shù)據(jù)結構成問題的一種方式。當把共享數(shù)據(jù)結構的數(shù)據(jù)從非本地格式轉換成本地格式時,期望重新定義字邊界而不是復制和移動內存中的數(shù)據(jù)。這種數(shù)據(jù)的復制和移動耗費寶貴的時間和資源。
有時,本地和非本地間的字長差異是另一方的倍數(shù)。例如,64位字平臺是32位字平臺的倍數(shù)。因而,當重新定義字邊界時,這種邊界會自發(fā)地落在已經是這種倍數(shù)的數(shù)據(jù)間(如64位長的數(shù)據(jù))。
考慮內存塊210和250以及其中包含的數(shù)據(jù),讀者可以看到一種情況,它被視為這種自發(fā)字邊界重定義的例子。換言之,如果塊210(包括數(shù)據(jù)結構212和214以及數(shù)據(jù)A1-A8)的字邊界被重新映射,它們可能作為內存塊250的數(shù)據(jù)結構252。該數(shù)據(jù)結構252包括對齊的數(shù)據(jù)262。在該情況中,內存邊界自發(fā)地降低,使數(shù)據(jù)對齊。
不對齊相反,當字邊界被重新定義時,這種邊界可以自發(fā)地落在數(shù)據(jù)內——因而使數(shù)據(jù)不對齊??紤]內存塊210和230以及其中包含的數(shù)據(jù),讀者可以看見一種情況,它被視為其中數(shù)據(jù)不對齊的這種自發(fā)字邊界重定義的例子。換言之,如果塊210(包括數(shù)據(jù)結構212和214以及數(shù)據(jù)A1-A8)的字邊界被重新映射,它們可能作為內存塊230的塊232和234。塊232和234包括不對齊的數(shù)據(jù)242。在該情況中,內存邊界自發(fā)地降低,使數(shù)據(jù)不對齊。
對齊動機因此,當面臨是否對齊數(shù)據(jù)的決定時,一個選項是忽略該問題并允許硬件來補償它。在某些情況下,硬件可以通過對來自不止一個連續(xù)內存地址單元的重復數(shù)據(jù)進行存取而進行補償。該方法的代價是從內存存取數(shù)據(jù)所需的額外時間。該方法僅當(多次存取的)損失時間是可容忍的時候才是可行的。
可容忍的不對齊代價一例是Intelx86處理器的不對齊代價。存取對齊數(shù)據(jù)的代價是一個時間單位(比如一個周期),而存取不對齊數(shù)據(jù)的代價大約為三個時間單位。因而,Intelx86平臺設計的軟件的編程者不考慮數(shù)據(jù)的不對齊,因為性能影響一般是可容忍的。
然而,存在對于存取對齊數(shù)據(jù)最佳的平臺。因此,進程在試圖存取不對齊數(shù)據(jù)時會顯著地停轉。這看來像是系統(tǒng)崩潰。在這種情況下,不對齊的代價是不可容忍的。
不對齊代價的另一例是IntelIA64處理器的不對齊代價。存取對齊數(shù)據(jù)的代價是一個時間單位(比如一個周期),而存取不對齊數(shù)據(jù)的代價大約為一萬(10000)或更多。因而,如果IntelIA64平臺設計的軟件的編程者不考慮數(shù)據(jù)的不對齊,這會產生完全不可容忍的性能影響。
在至少一方面,示例性數(shù)據(jù)整直器對本地和非本地應用程序和/或操作系統(tǒng)共享的內存中保存的數(shù)據(jù)進行強制對齊。
數(shù)據(jù)對齊子系統(tǒng)如圖4所示,非本地內核仿真器400包括數(shù)據(jù)對齊子系統(tǒng)460,該子系統(tǒng)460協(xié)調本地和非本地應用程序(或非本地應用程序和本地操作系統(tǒng)之間)之間的數(shù)據(jù)對齊。在示例性實現(xiàn)中,數(shù)據(jù)對齊子系統(tǒng)460可以是示例性數(shù)據(jù)整直器的實施例。
如上所述,轉換器414根據(jù)需要重新調整數(shù)據(jù)結構的大小,從而從非本地格式轉換成本地格式(反之亦然)。例如,塊210的塊216包括數(shù)據(jù)B1-B4。轉換器可以擴大為塊250的塊254以包括數(shù)據(jù)264。
盡管轉換器414可以成功地重新調整數(shù)據(jù)大小,然而這種數(shù)據(jù)不會被對齊。一些數(shù)據(jù)結構(如LARGE_INTEGER)可以被正確地調整大小(如64位)用于本地環(huán)境,但可能不會正確地對齊用于本地環(huán)境。圖2的內存塊210和230中示出這樣一例。強制對齊的一個選項是把數(shù)據(jù)結構復制到新位置并使其對齊。由于復制比不復制采用多得多的時間,并且由于可以正確地對齊數(shù)據(jù)結構,因此希望有一種方式來確定數(shù)據(jù)結構在復制前是否被對齊。
數(shù)據(jù)對齊子系統(tǒng)460檢查數(shù)據(jù)結構的特定預先標識的類型,以確定它是否被對齊。
如果它不對齊,則數(shù)據(jù)對齊子系統(tǒng)460把數(shù)據(jù)結構復制到對齊的內存塊,并且把本地環(huán)境指向該副本。在調用了可能作用于共享數(shù)據(jù)結構的功能之后,塊中的數(shù)據(jù)被復制回原始不對齊的空間。
然而,如果數(shù)據(jù)結構對齊,則把本地環(huán)境指向該原始空間。
根據(jù)數(shù)據(jù)對齊子系統(tǒng)460,數(shù)據(jù)結構類型被正確地調整大小(用于本地環(huán)境),但已經確定它可能是不對齊的。這種數(shù)據(jù)結構的一例是LARGE_INTEGER。
示例性數(shù)據(jù)整直器的方法實現(xiàn)圖5A示出內核仿真器400(或其某部分)所執(zhí)行的示例性數(shù)據(jù)整直器的方法實現(xiàn)。該方法實現(xiàn)可以用軟件、硬件或它們的組合來執(zhí)行。
在圖5的510處,數(shù)據(jù)對齊子系統(tǒng)460觀察特殊預先標識的數(shù)據(jù)結構類型,其中包括可能不對齊的參數(shù)。在512處,子系統(tǒng)檢查參數(shù)以確定這些參數(shù)是否是對齊的。如果是,則進程繼續(xù)到方塊530并且不執(zhí)行對齊。如果它是不對齊的,則進程繼續(xù)到方塊514。
在圖5的514處,數(shù)據(jù)對齊子系統(tǒng)460重新分配一緩存以保留該參數(shù)。在516處,子系統(tǒng)把參數(shù)(可能是整個數(shù)據(jù)結構)復制到對齊的內存塊。在518處,把本地環(huán)境指向所分配緩存中的副本。在調用了可能采用共享數(shù)據(jù)結構(因此采用參數(shù))的功能后,塊中的數(shù)據(jù)被復制回原始不對齊的空間(在520處)。進程在522結束。
然而,如果數(shù)據(jù)結構的參數(shù)是對齊的,則把本地環(huán)境指向原始空間(如方塊530中所指示)。
附加細節(jié)通常,內核仿真器(或等價物)是一中間層,它協(xié)調執(zhí)行進程,而同時非本地應用程序(如32位應用程序)需要向本地操作系統(tǒng)索求一些支持,像對磁盤上的文件信息、安全性信息、事件通知等的存取。該中間層能夠監(jiān)視在非本地應用程序(如32位應用程序)和本地操作系統(tǒng)(如64位操作系統(tǒng))間來回傳遞的任何信息。
處理回調勾連問題有時,非本地應用程序可能安裝一操作系統(tǒng)到應用程序的回調(通常稱為“勾連”),這可能影響總系統(tǒng)的穩(wěn)定性。勾連會是非本地程序模塊中的一些指令。那些非本地指令可能會有不可應用于本地代碼(如函數(shù)指針)的一些不同的信息結構。雖然從本地執(zhí)行路徑調用了它們,然而本地模塊并不知道它正在作出到非本地勾連的回調。
為了解決非本地勾連調用中的數(shù)據(jù)對齊問題,為勾連標記一屬性來標識該勾連是為一類特定的非本地應用程序而設置的。該屬性稍后會用于確定哪條執(zhí)行路徑可以執(zhí)行該勾連(即會根據(jù)所設的屬性對勾連鏈進行過濾)。這樣,不兼容的執(zhí)行路徑就不能通過特定的勾連。
有時所仿真的指令可能調用內核中的本地代碼。雖然作出那些調用,然而所仿真的指令還填充某些回調結構,其包含返回到何處的信息。那些結構在本地環(huán)境和所仿真的環(huán)境間共享,并且可能存取不對齊的數(shù)據(jù)。在形式轉換程序層中,數(shù)據(jù)對齊子系統(tǒng)460可以在作出任何內核調用前修補該結構。
共享數(shù)據(jù)結構可能有在本地操作系統(tǒng)和運行的仿真應用程序之間共享的信息。本地操作系統(tǒng)會要求這種信息為特定格式。例如,共享信息會包含某些函數(shù)指針,它們在操作系統(tǒng)作用于其上之前為8字節(jié)對齊的。然而,運行的應用程序并不關心這一點,因為4字節(jié)對齊對于非本地應用程序(如32位應用程序)就足夠了。在這種情況下,數(shù)據(jù)對齊子系統(tǒng)460會標識這種結構,并且當API來回傳遞共享信息時自動為那些信息產生形式轉換程序。
對齊問題需要對齊的數(shù)據(jù)類型的例子有LARGE_INTEGER、具有64位整數(shù)作為一個成員的共用型以及用戶模式和操作系統(tǒng)共享的可共享的64位指針。如果這種數(shù)據(jù)未正確對齊,則由于性能惡化,操作系統(tǒng)就不能接受它們。它會選擇不再運行?;蛘撸诟鼔牡那闆r下,操作系統(tǒng)會崩潰。
在內核仿真器內,數(shù)據(jù)對齊子系統(tǒng)460監(jiān)視可能屬于那些數(shù)據(jù)類型或者可能是結構中一員的任何參數(shù)。如果數(shù)據(jù)對齊子系統(tǒng)460找到這種類型,它就檢驗該對齊。如果它不對齊,數(shù)據(jù)對齊子系統(tǒng)460就重新分配緩存(即所分配的緩存)以保留該參數(shù),并且用該緩存作出OS API調用而不是傳遞為作出該調用而傳遞的原始緩存。當OS API成功地返回時,數(shù)據(jù)對齊子系統(tǒng)460把所分配緩存的輸出復制到應用程序緩存。
在上面的情況下,參數(shù)修補也許不起作用,其中應用程序把一些參數(shù)作為指針傳遞至緩存,操作系統(tǒng)會把這些參數(shù)解釋為結構的指針。在該情況下,內核仿真器尤其需要知道哪個API傳遞該類數(shù)據(jù)。在某些情況下,操作系統(tǒng)會根據(jù)API內傳遞的某些其它參數(shù)把該緩存解釋為對某些結構的指針。數(shù)據(jù)對齊子系統(tǒng)460可以根據(jù)某些規(guī)則而產生某些中間指令,這些規(guī)則可用于任何API或者需要內核仿真器內的對齊修補的特殊API。
LARGE_INTEGER個體數(shù)據(jù)的規(guī)則這是說明怎樣使數(shù)據(jù)類型重新對齊的LARGE_INTEGER例子。從該模板中產生的指令位于本地部分,而這個模板會應用于傳遞LARGE-INTEGER的所有API。非本地代碼可能傳遞4字節(jié)對齊的LARGE-INTEGER。在本地部分中,數(shù)據(jù)對齊子系統(tǒng)460保留該數(shù)據(jù)類型的一個副本,并在作出本地調用時傳遞該數(shù)據(jù)類型。在離開的路上,數(shù)據(jù)對齊子系統(tǒng)460把結果復制回客戶機空間。
<pre listing-type="program-listing"> TemplateName=LARGE_INTEGER Locals= //@ArgName(@ArgType)is an LARGE_INTEGER*(might be unaligned)@NL LARGE_INTEGER@ArgVal_Copy;@NL End= PreCall= //FIXUP_LARGE_INTEGER @NL if((SIZE_T)@ArgHostName &amp; 0x07){ @ArgName=&amp;@ArgVal_Copy; @ArgVal_Copy=*(UNALIGNED LARGE_INTEGER*)@ArgHostName; }else@ArgName=@ArgHostName; End= PostCall= if(@ArgName!=@ArgHostName) *(UNALIGNED LARGE_INTEGER*)@ArgHostName= @ArgVal_Copy; End=</pre>某些其它類型的規(guī)則可以為某些特殊的場景優(yōu)化數(shù)據(jù)的不對齊副本。例如,非本地應用程序(如32位應用程序)可能為像LARGE-INTEGER這樣的某些大數(shù)據(jù)保證有4字節(jié)對齊的數(shù)據(jù)。雖然在需要8字節(jié)對齊單元的本地操作系統(tǒng)(如64位OS)上進行仿真,而不是產生可能需要8個指令來執(zhí)行的整個不對齊副本,數(shù)據(jù)對齊子系統(tǒng)460可以用兩個指令來完成它,這兩個指令如下并且用于下列模板中
<pre listing-type="program-listing"> *(LONG*)((PBYTE)@ArgValCopy)=*(LONG*)((PBYTE)@ArgHostName);@NL *(LONG*)(4+(PBYTE)@ArgValCopy)=*(LONG*)(4+(PBYTE)@ArgHostName);@NL MacroName=PointerIN NumArgs=0Begin= @IfPointerToPtrDep(@IfIsArray( //Note:@ArgName(@ArgType)is an array of pointers to pointer dependenttypes.@NL #error Error.don′t know how to thunk an array of pointers to ptr dep.@NL)@IfNotlsArray( //Note:@ArgName(@ArgType)is a pointer to a pointer dependent type.@NL if(THE KERNEL EMULATOR_ISPTR(@ArgHostName)){@NL @Indent( @IfInt64DepUnion( //Special Case union having LARGE_INTEGER member@NL @ArgName=(@ArgType)@ArgValCopy;@NL *(LONG*)((PBYTE)@ArgValCopy)=*(LONG*)((PBYTE)@ArgHostName);@NL *(LONG*)(4+(PBYTE)@ArgValCopy)=*(LONG<br/>*)(4+(PBYTE)@ArgHostName);@NL)@IfNotlnt64DepUnion( @ArgName=(@ArgType)@ArgValCopy; @NL *((@ArgType)@ArgValCopy)=(@ArgTypelnd)*((@ArgHostTypelnd*)@ArgHostName);@NL) ) } @NL else{ @NL @Indent(@ArgName=(@ArgType)@ArgHostName; @NL ) } @NL) )</pre>API的規(guī)則在該例中,API可能具有到另一參數(shù)所定義的不同結構的指針。這種擴展能夠根據(jù)定義類型的其它參數(shù)來對那些結構進行形式轉換。
<pre listing-type="program-listing"> TemplateName=ApiNamePassingBadBuffer Case=(ParamThatDetermineType,THE_REAL_TYPE1) Case=(ParamThatDetermineType,THE_REAL_TYPE2) ..... Case=(ParamThatDetemineType,THE_REAL_TYPEn) Locals=BOOL bRealigned=FALSE;PVOID *pTempFileInfo; End= PreCall=if((SIZE_T)(FileInformation)&amp;(0x07)){ //allocate a buffer with correct alignment,to pass to the Win64 API pTempFileInfo=FileInformation; FileInformation=The kernel emulatorAllocateTemp(Length); RtlCopyMemory(FileInformation,pTempFileInfo,Length); bRealigned=TRUE;} End= Begin= @GenDebugNonPtrDepCases(@ApiName,FileInformationClass) End= PostCall=if(NT_SUCCESS(RetVal)&amp;&amp; bRealigned){ RtlCopyMemory((PVOID)pTempFileInfo,FileInformation,Length);} End=</pre>成員復制的規(guī)則在復制一些結構時,數(shù)據(jù)對齊子系統(tǒng)460添加了不對齊的標記,使得編譯器會產生正確的代碼,并且在執(zhí)行期間不引起任何對齊錯誤。
MacroName=StdH2NCopyNumArgs=0Begin=@ArgName=@IfNotlsBitfield(@UnalignedTag64)(@ArgType)(@ArgHostName);@NLEnd=示例性的計算系統(tǒng)和環(huán)境圖6說明了適當計算環(huán)境900的例子,其中可以(或完全或部分地)實現(xiàn)這里所述的示例性數(shù)據(jù)整直器。計算環(huán)境900可以用于這里所述的計算機和網絡結構。
示例性計算環(huán)境900僅僅是計算環(huán)境的一個例子,而不意圖對計算機和網絡結構的使用范圍和功能作出任何限制。計算環(huán)境900也不應被理解為具有與示例性計算環(huán)境900中所述的任一組件或組件的組合有關的任何相關性或要求。
示例性數(shù)據(jù)整直器可以用多種其它通用或專用計算系統(tǒng)環(huán)境或配置來實現(xiàn)??赡苓m合使用的公知計算系統(tǒng)、環(huán)境和/或配置的示例包括、但不限于個人計算機、服務器計算機、薄客戶機、厚客戶機、手提或便攜式設備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機頂盒、可編程用戶電子設備、網絡PC、小型計算機、大型計算機、包括任一上述系統(tǒng)的分布式計算環(huán)境等等。
示例性數(shù)據(jù)整直器可以用計算機可執(zhí)行指令的一般上下文來描述,譬如由計算機執(zhí)行的程序模塊。一般而言,程序模塊包括例程、程序、對象、組件、數(shù)據(jù)結構等,它們執(zhí)行特定任務或實現(xiàn)特定的抽象數(shù)據(jù)類型。示例性數(shù)據(jù)整直器還可以實際用于分布式計算環(huán)境中,其中由通過通信網絡連接的遠程處理設備來執(zhí)行任務。在分布式計算環(huán)境中,程序模塊可以位于本地和遠程存儲媒質中,包括內存存儲設備。
計算環(huán)境900包括形式為計算機902的通用計算設備。計算機902的組件可能包括、但不限于一個或多個處理器或處理單元904、系統(tǒng)內存906以及把包括處理器904在內的各種系統(tǒng)組件耦合至系統(tǒng)內存906的系統(tǒng)總線908。
系統(tǒng)總線908表示多種類型總線結構的任一種或多種,包括內存總線或內存控制器、外圍設備總線加速的圖像端口以及使用任一多種總線結構的處理器或和本地總線。例如,這種結構可以包括工業(yè)標準結構(ISA)總線、微通道結構(MCA)總線、增強型ISA(EISA)總線、視頻電子標準聯(lián)盟(VESA)局域總線以及外圍組件互連(PCI)總線(也稱為Mezzanine總線)。
計算機902一般包括各種計算機可讀媒質。這些媒質可以是能由計算機902訪問的任何可用媒質并包括易失性和非易失性的媒質、可移動和不可移動的媒質。
系統(tǒng)內存906包括形式為易失性內存的計算機可讀媒質,譬如隨機存取內存(RAM)910,以及/或者包括非易失性內存,比如只讀內存(ROM)912。基本輸入/輸出系統(tǒng)(BIOS)914一般被保存在ROM 912中,它包含例如啟動期間幫助在計算機902內的組件間傳輸信息的基本例程。RAM 910一般包含數(shù)據(jù)和/或程序模塊,它們可以被立即訪問并且/或者當前由處理單元904在其上操作。
計算機902還包括其它可移動和不可移動、易失性和非易失性的媒質。例如,圖6說明了對不可移動、非易失性磁性媒質(未示出)進行讀寫的硬盤驅動器916、對可移動、非易失性磁盤920(如“軟盤”)進行讀寫的磁盤驅動器918以及對可移動、非易失性光盤924進行讀寫的光盤驅動器922,譬如CD-RROM、DVD-RROM或其它光學媒質。硬盤驅動器916、磁盤驅動器918和光盤驅動器922各自通過一個或多個數(shù)據(jù)媒質接口926與系統(tǒng)總線908相連?;蛘?,硬盤驅動器916、磁盤驅動器918和光盤驅動器922可以通過一個或多個接口(未示出)與系統(tǒng)總線908相連。
驅動器和它們的相關計算機可讀媒質為計算機902提供了計算機可讀指令、數(shù)據(jù)結構、程序模塊和其它數(shù)據(jù)提供存儲。盡管該例說明了硬盤916、可移動磁盤920以及可移動光盤924,然而可以理解,為了實現(xiàn)示例性的計算系統(tǒng)和環(huán)境,也可以使用其它類型的計算機可讀媒質,它們可保存由計算機存取的數(shù)據(jù),這些媒質有磁帶盒或其它磁性存儲設備、閃存卡、CD-ROM、數(shù)字化視頻光盤(DVD)或其它光學存儲器、隨機存取內存(RAM)、只讀內存(ROM)、電可擦除可編程只讀內存(EEPROM)等等。
硬盤916、磁盤920、光盤924、ROM 912和/或RAM 910上可以存儲任何數(shù)量的程序模塊,包括例如操作系統(tǒng)926、一個或多個應用程序928、其它程序模塊930和程序數(shù)據(jù)932。這種操作系統(tǒng)926、一個或多個應用程序928、其它程序模塊930和程序數(shù)據(jù)932中的每一個(或者某些的組合)都可以包括以下的實施例攔截器、調用轉換器、自變量轉換器、變換器、共享內存管理器、指令變換器、地址變換器、數(shù)據(jù)整直器以及目標平臺確定器。
用戶可以通過諸如鍵盤934和指示設備936(如“鼠標”)這樣的輸入設備把命令和信息輸入到計算機920中。其它輸入設備938(未具體示出)可以包括麥克風、游戲桿、游戲板、衛(wèi)星式轉盤、掃描儀等等。這些和其它輸入設備通過與系統(tǒng)總線908耦合的輸入/輸出接口940與處理單元904相連,但也可能用其它接口和總線結構連接,譬如并行端口、游戲端口或通用串行總線(USB)。
監(jiān)視器942或其它類型的顯示設備也通過諸如視頻接口944這樣的接口與系統(tǒng)總線908相連。除了監(jiān)視器942之外,其它輸出外部設備可以包括如揚聲器(未示出)和打印機946這樣的組件,它們可以通過輸入/輸出接口940連接到計算機902。
計算機902可以工作在網絡化環(huán)境中,該環(huán)境使用與諸如遠程計算設備948這樣的一臺或多臺遠程計算機之間的邏輯連接。遠程計算機948可以是個人計算機、便攜式計算機、服務器、路由器、網絡PC、對等設備或其它公共網絡節(jié)點等等。作為便攜式計算機說明的遠程計算設備948可以包括上述關于計算機902描述的許多或全部元件。
計算機902和遠程計算機948之間的邏輯連接被描述為局域網(LAN)950和一般廣域網(WAN)952。這種網絡環(huán)境在辦公室、企業(yè)范圍計算機網絡、企業(yè)內部網和互聯(lián)網中是常見的。
當在LAN網絡環(huán)境中實現(xiàn)時,計算機902通過網絡接口或適配器954與局域網950相連。當在WAN網絡環(huán)境中實現(xiàn)時,計算機902一般包括用于在廣域網952上建立通信的調制解調器956或其它裝置。調制解調器956可以在計算機902內部或外部,它可以通過輸入/輸出接口940或其它適當機制與系統(tǒng)總線908相連。應該理解,所述的網絡連接是示例性的,可以采用用于在計算機902和948之間建立通信連接的其它裝置。
在網絡化環(huán)境中,比如關于計算環(huán)境900所述的網絡環(huán)境,關于計算機902所述的程序模塊或其部分可以被保存在遠程內存存儲設備中。例如,遠程應用程序958指令組遠程計算機948的內存設備上。為了說明,這里把應用程序和像操作系統(tǒng)這樣的其它可執(zhí)行程序描述為離散的塊,然而可以認識到,這種程序和組件在不同時刻駐留在計算設備902的不同存儲組件中,并且由計算機的數(shù)據(jù)處理器所執(zhí)行。
計算機可執(zhí)行指令示例性數(shù)據(jù)整直器的實現(xiàn)可以以計算機可執(zhí)行指令環(huán)境來描述,比如由一臺或多臺計算機或其它設備執(zhí)行的程序模塊。一般而言,程序模塊包括執(zhí)行特定任務或實現(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結構等等。一般而言,根據(jù)各個實施例中的期望,程序模塊的功能可以組合或分布。
示例性操作環(huán)境圖6說明了其中可實現(xiàn)示例性數(shù)據(jù)整直器的適當操作環(huán)境900的示例。特別是,這里所述的示例性數(shù)據(jù)整直器可以用圖6中的任何程序模塊928-930和/或操作系統(tǒng)926或者其中的部分來(全部或部分地)實現(xiàn)。
操作環(huán)境僅僅是適當操作系統(tǒng)的一個例子,并非對這里所述示例性數(shù)據(jù)整直器的使用范圍或功能有任何限制。其它適合使用的公知計算系統(tǒng)、環(huán)境和/或配置的示例包括、但不限于個人計算機(PC)、服務器計算機、手提或便攜式設備、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、可編程用戶電子設備、無線電話和設備、通用和專用設備、專用集成電路(ASIC)、網絡PC、小型計算機、大型計算機、包括任一上述系統(tǒng)的分布式計算環(huán)境等等。
計算機可讀媒質示例性數(shù)據(jù)整直器的實現(xiàn)可以被保存在某些形式的計算機可讀媒質上,或者在其間被發(fā)送。計算機可讀媒質可以是能由計算機存取的任何可用媒質。例如但非限制,計算機可讀媒質可以包括“計算機存儲媒質”和“通信媒質”。
“計算機存儲媒質”包括易失性和非易失性、可移動和不可移動媒質,它們以用于存儲諸如計算機可讀指令、數(shù)據(jù)結構、程序模塊或其它數(shù)據(jù)等信息的任意方法或技術來實現(xiàn)。計算機存儲媒質包括、但不限于RAM、ROM、EEPROM、閃存或其它存儲技術、CDROM、數(shù)字化視頻光盤(DVD)或其它光盤存儲器、磁帶盒、磁帶、磁盤存儲器或其它磁性存儲設備、或者用于存儲期望信息并能由計算機存取的任意其它媒質。
“通信媒質”一般在諸如載波或其它傳輸機制等已調數(shù)據(jù)信號中包含計算機可讀指令、數(shù)據(jù)結構、程序模塊或其它數(shù)據(jù)。通信媒質還包括任何信息傳送媒質。
術語“已調數(shù)據(jù)信號”意指其一個或多個特性以對信號內信息進行編碼的方式被設置或改變的信號。例如但非限制,通信媒質包括諸如有線網絡或直線連接這樣的有線媒質,還包括諸如聲、RF、紅外及其它無線媒質這樣的無線媒質。上述的任意組合也應被包括在計算機可讀媒質的范圍內。
結論雖然以對于結構特征和/或方法步驟特定的語言描述了本發(fā)明,然而應該理解,所附權利要求中定義的發(fā)明不必限于所述的特定特征或步驟。而是把特定的特征或步驟公開作為用于實現(xiàn)本發(fā)明的優(yōu)選形式。
權利要求
1.一種非本地程序模塊的仿真器,所述仿真器包括攔截器,用于攔截來自非本地程序模塊的調用;變換器,用于把用于傳遞參數(shù)的非本地程序模塊的非本地范例變換成用于傳遞參數(shù)的本地環(huán)境的本地范例;數(shù)據(jù)整直器,用于按照所述本地環(huán)境的本地范例對齊參數(shù)的格式。
2.如權利要求1所述的仿真器,其特征在于,所述數(shù)據(jù)整直器用于對齊的參數(shù)是由本地環(huán)境和非本地程序模塊所共享的數(shù)據(jù)結構的一部分。
3.如權利要求1所述的仿真器,其特征在于,所述變換器還用于把地址從非本地長度變換成本地長度。
4.如權利要求1所述的仿真器,其特征在于,所述本地環(huán)境的本地范例的字長與非本地程序模塊的非本地范例的字長不同。
5.一種計算機可讀媒質上的操作系統(tǒng),包括本地內核,用于接收來自本地程序模塊的調用;如權利要求1所述的內核仿真器,用于接收來自非本地程序模塊的調用。
6.一種數(shù)據(jù)對齊系統(tǒng),便于非本地程序模塊和本地環(huán)境的互用性和兼容性,所述系統(tǒng)包括參數(shù)檢查器,用于檢查數(shù)據(jù)結構的參數(shù)并且確定這些參數(shù)是否為了本地環(huán)境而對齊;參數(shù)整直器,用于分配一緩存用于保留不對齊參數(shù)的數(shù)據(jù);把這些參數(shù)的數(shù)據(jù)復制到所分配的緩存,使得為本地環(huán)境而對齊數(shù)據(jù)。
7.如權利要求6所述的系統(tǒng),其特征在于,所述參數(shù)是由本地環(huán)境和非本地程序模塊所共享的數(shù)據(jù)結構的一部分。
8.如權利要求6所述的系統(tǒng),其特征在于,所述數(shù)據(jù)結構的參數(shù)是在從非本地范例轉換到本地范例時不對齊的參數(shù)。
9.如權利要求6所述的系統(tǒng),其特征在于,所述參數(shù)整直器還用于把對不對齊參數(shù)的調用重新指向所分配的緩存;用來自所分配緩存的數(shù)據(jù)代替原始參數(shù)中的數(shù)據(jù)。
10.一種便于非本地程序模塊和本地環(huán)境的互用性和兼容性的方法,所述方法包括檢查數(shù)據(jù)結構的參數(shù);確定這些參數(shù)是否為了本地環(huán)境而對齊;響應于這些參數(shù)不對齊的確定而進行分配一緩存用于保留不對齊參數(shù)的數(shù)據(jù);把這些參數(shù)的數(shù)據(jù)復制到所分配的緩存,使得為本地環(huán)境而對齊數(shù)據(jù)。
11.如權利要求10所述的方法,其特征在于,響應于這些參數(shù)不對齊的確定還進行把對不對齊參數(shù)的調用重新指向所分配的緩存;用來自所分配緩存的數(shù)據(jù)代替原始參數(shù)中的數(shù)據(jù)。
12.如權利要求10所述的方法,其特征在于,所述參數(shù)是由本地環(huán)境和非本地程序模塊所共享的數(shù)據(jù)結構的一部分。
13.如權利要求10所述的方法,其特征在于,所述數(shù)據(jù)結構的參數(shù)是在從非本地范例轉換到本地范例時不對齊的參數(shù)。
14.一臺包括帶有計算機可執(zhí)行指令的一個或多個計算機可讀媒質的計算機,所述指令在由計算機執(zhí)行時執(zhí)行權利要求10所述的方法。
15.一種帶有計算機可執(zhí)行指令的計算機可讀媒質,所述指令在由計算機執(zhí)行時執(zhí)行權利要求10所述的方法。
16.帶有計算機可執(zhí)行指令的計算機可讀媒質上包含的一種操作系統(tǒng),所述指令在由計算機執(zhí)行時執(zhí)行權利要求10所述的方法。
17.一種帶有計算機可執(zhí)行指令的計算機可讀媒質,所述指令在由計算機執(zhí)行時,執(zhí)行便于非本地程序模塊和本地環(huán)境的互用性和兼容性的方法,所述方法包括檢查數(shù)據(jù)結構的參數(shù);確定這些參數(shù)是否為了本地環(huán)境而對齊;響應于這些參數(shù)不對齊的確定而進行分配一緩存用于保留不對齊參數(shù)的數(shù)據(jù);把這些參數(shù)的數(shù)據(jù)復制到所分配的緩存,使得為本地環(huán)境而對齊數(shù)據(jù)。
18.如權利要求17所述的計算機可讀媒質,其特征在于,所述方法還包括把對不對齊參數(shù)的調用重新指向所分配的緩存;用來自所分配緩存的數(shù)據(jù)代替原始參數(shù)中的數(shù)據(jù)。
全文摘要
這里描述了便于本地計算平臺內非本地程序模塊的操作的技術。該技術提供了一種機制,用于(根據(jù)需要)使數(shù)據(jù)結構的參數(shù)對齊,使得不同范例的程序模塊或操作系統(tǒng)可以使用它們。使數(shù)據(jù)結構的參數(shù)數(shù)據(jù)對齊,以匹配本地范例。一般而言,這種數(shù)據(jù)結構由非本地程序模塊和本地操作系統(tǒng)(或其它程序模塊)所共享。它對齊使得本地平臺可快速且容易地訪問數(shù)據(jù)——否則將是不對齊的并且妨礙性能。本摘要自身不限制本專利的范圍。本發(fā)明的范圍在所附權利要求中指出。
文檔編號G06F1/00GK1571956SQ02820445
公開日2005年1月26日 申請日期2002年10月22日 優(yōu)先權日2001年10月23日
發(fā)明者B·邦德, A·S·哈利德 申請人:微軟公司