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