從32位平臺移植到64位平臺的解決方案_第1頁
從32位平臺移植到64位平臺的解決方案_第2頁
從32位平臺移植到64位平臺的解決方案_第3頁
從32位平臺移植到64位平臺的解決方案_第4頁
從32位平臺移植到64位平臺的解決方案_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、從32位平臺移植到64位平臺的解決方案從32位平臺移植到64位平臺的解決方案從32位平臺移植到64位平臺的解決方案資料僅供參考文件編號:2022年4月從32位平臺移植到64位平臺的解決方案版本號: A修改號: 1頁 次: 1.0 審 核: 批 準: 發(fā)布日期: 從32位平臺移植到64位平臺的解決方案概述移植的原因由于高性能服務器、數(shù)據(jù)庫管理系統(tǒng)、電腦輔助設計工具,以及數(shù)字內(nèi)容創(chuàng)作工具等應用方案均需要處理大量數(shù)據(jù)及占用存儲器大量地址,因此為了滿足這類應用方案的需要,64位技術(shù)便應運而生。大約從九十年代后期起,就已經(jīng)有64位機器問世,從去年到今年,Intel體系結(jié)構(gòu)的芯片也開始出64位了.在UNI

2、X環(huán)境下,已有幾種操作系統(tǒng)支持64位環(huán)境了,據(jù)說微軟也準備將Windows升級為64位操作系統(tǒng)??梢灶A料,將來32位平臺將不再是主流,唱主角的將是64位平臺。到時,客戶環(huán)境也將全是64位平臺。因此,由于下面這樣一些原因,使得某些應用程序從32位移植到64位:(1).工程、科學、商業(yè)-需要地址空間大于32位.大數(shù)據(jù)集:需處理的數(shù)據(jù)大于32位所能處理的極限;(大文件或數(shù)據(jù)庫的內(nèi)存映射是一種常用技術(shù)-通過把文件或數(shù)據(jù)庫保存在內(nèi)存,以避免經(jīng)常的磁盤I/O操作.).計算需要程序復雜性;若是32位系統(tǒng),32位程序,則雖然也能處理需大地址空間的應用,但程序?qū)⒆兊脧碗s;應用程序的吞吐量;SMP系統(tǒng)與并行編程不

3、斷用來處理科學計算與其他問題;這意味著,在32位系統(tǒng)上,多至12個高速處理器共享不超過4GB的內(nèi)存;64位系統(tǒng)則能為每個進程提供必要的內(nèi)存與I/O資源,使得SMP能很好地進行擴展,并能提供科學,工程,商業(yè)領(lǐng)域所需的批量計算;典型的64位應用-決策支持、數(shù)據(jù)倉庫、數(shù)據(jù)挖掘、基于因特網(wǎng)的應用、電子商務應用、Web服務器、多媒體服務器、數(shù)字密集的應用、一般數(shù)據(jù)庫、大陣列操作應用.(2). 現(xiàn)存32位系統(tǒng)-資源短缺限制了總體性能與吞吐量的提高現(xiàn)存32位多用戶系統(tǒng)性能不是受限于CPU,而是受限于I/O帶寬;而由分頁引起的I/O又主要是由于內(nèi)存不足于存儲整個文件;如果有足夠的內(nèi)存可用,那么將顯著減少分頁,

4、從而顯著地改善系統(tǒng)性能.高壓力環(huán)境下的32位應用程序:基于因特網(wǎng)的應用、電子商務應用、Web服務器、多媒體服務器、一般服務器、實時系統(tǒng).(這些應用可從OS提供的大內(nèi)存獲得性能提高,因為OS會自動地為每個32位應用提供更多的內(nèi)存與I/O資源.因此,64位系統(tǒng)能運行更多的并發(fā)的,大的32位應用程序.移植原則移植后的程序既可作為64位機器上的32位程序運行,又可作為64位機器上的64位程序運行;只要覺得有需要,就可將32位程序重編譯為64位程序;在64位平臺上,不管是作為32位程序還是作為64位程序運行,其性能至少不應比32位程序在32位平臺上運行的性能差;32位進程與64位進程可同時在64位平臺上

5、運行.移植步驟將現(xiàn)有32位程序移植到64位時,由于AIX 本身對32位程序與64位程序的支持,所以絕大部分的系統(tǒng)調(diào)用與C語言程序結(jié)構(gòu)都不用改變,只要在源程序中遵守系統(tǒng)調(diào)用接口與相應的數(shù)據(jù)類型;但是,還是有一些由于數(shù)據(jù)類型長度的改變而引起的兼容性問題.因此從32位程序移植為64位程序一般必須經(jīng)過下列步驟:(1).源程序的兼容性檢查;這一步主要檢查由于數(shù)據(jù)類型長度改變而引起的兼容性問題;(2).將從第(1)步檢查出的兼容性源程序進行修改;(3).修改makefile文件;32位平臺與64位平臺平臺的定義計算機系統(tǒng)是由硬件與軟件兩部分組成的。所謂平臺也就是指硬件與相應的系統(tǒng)軟件(包括操作系統(tǒng)、編譯器

6、和與開發(fā)環(huán)境有關(guān)的應用程序(如數(shù)據(jù)庫)。64位硬件體系結(jié)構(gòu)是指:(1).能處理64位數(shù)據(jù).-即CPU可以將64位數(shù)據(jù)作為基本單元進行處理(只需一次操作就可處理),”字長”是64位的,即存儲單元是64位的.(說明:32位平臺的存儲單元是32位的)這導致結(jié)構(gòu)成員的一種以8字節(jié)為邊界的填充,即第一個成員即使不足一個8字節(jié)的基本存儲單元,那么仍占用一個基本存儲單元,而整個結(jié)構(gòu)占用的存儲空間也是8字節(jié)的倍數(shù).(2).能產(chǎn)生64位地址.-包括有效地址和物理地址.注意:虛地址概念并不是由處理器體系結(jié)構(gòu)說明的,它是由AIX的VMM(虛地址存儲管理器)說明的.它規(guī)定了應用程序可訪問的內(nèi)存空間的大小.一般來說,虛

7、地址可以與有效地址或物理地址不同.相應地,32位硬件體系結(jié)構(gòu)是指(1).能將32位數(shù)據(jù)作為基本數(shù)據(jù)單元進行處理;(2).最多只能產(chǎn)生32位地址(包括有效地址和物理地址).下列操作可從64位寄存器中得到好處:(1).64位長的串;(2).64位寄存器上的移位操作;(3).64位的整數(shù)和指針運算;(4).串或大數(shù)據(jù)的拷貝.硬件部分主要是指其字長-CPU能作為基本數(shù)據(jù)單元處理的二進制數(shù)據(jù)的位數(shù)。如32位機器其CPU能在一條指令內(nèi)處理32位數(shù)據(jù),它不能在一條指令內(nèi)處理64位數(shù)據(jù),它必須將64位數(shù)據(jù)分為兩個32位數(shù)據(jù)進行處理;而64位機器其CPU則能在一條指令內(nèi)處理64位數(shù)據(jù),它不需象32位機器一樣,將

8、64位數(shù)據(jù)拆分為兩個32位數(shù)據(jù)進行處理。32位平臺是指其硬件體系結(jié)構(gòu)是32位的,而且其操作系統(tǒng)、編譯器等系統(tǒng)軟件也只能支持32位程序.64位平臺是指其硬件體系結(jié)構(gòu)是64位的,而且其操作系統(tǒng)、編譯器等也能支持64位程序.因而,64位平臺能充分利用其64位硬件的性能,使得一些應用程序能從中得到性能的改善.現(xiàn)有AIX64位平臺的特點RS/6000 64位機器 AIX 和RS/6000 S70模型)RS/6000(RS64A)是64位體系結(jié)構(gòu),CPU的通用寄存器是64位的,一些控制寄存器也是64位的,它可以一次移動或操作64位數(shù)據(jù),而不需要象在32位處理器那樣,必須由程序員或編譯器分兩次完成. Pow

9、erPC是64位體系結(jié)構(gòu).64位環(huán)境是32位環(huán)境的超集;-即64位指令集是32位指令集的超集,換句話說,32位指令集是64位指令集的子集;.32位環(huán)境與64位環(huán)境是局部的;-即一個32位進程其環(huán)境只對這個進程有效,一個64位進程的環(huán)境只對這個64位進程有效;同時運行的32位進程與64位進程可有不同的運行環(huán)境;.不管哪種方式,都無任何模擬或仿真.-即32位進程執(zhí)行32位指令集,64位進程執(zhí)行64位指令集;而不是說,64位指令集是通過32位指令集來模擬或仿真;AIX 64位體系結(jié)構(gòu)的好處64位數(shù)據(jù)類型 某些應用程序可從64位整型硬件的性能和更高的精度獲益;不過主要的可能還是由非64位應用程序用64

10、位整型運算操縱64位指針.存取大文件-數(shù)據(jù)倉庫、科學和多媒體應用經(jīng)常需要非常大的文件和文件系統(tǒng),它們很容易由64位數(shù)據(jù)類型處理;巨大的地址空間-有些應用程序既需要用大內(nèi)存(234=16GB),也需要訪問海量虛擬存儲(280),許多科學應用就可以簡單地編程,并能比較高效地執(zhí)行.數(shù)據(jù)段和堆棧都是巨大的,存儲映射也會得到顯著改善. 支持64位程序的操作系統(tǒng)提升了4GB的系統(tǒng)內(nèi)存限制.4GB(232)是對32位PowerPC平臺的限制;.AIX 支持4GB的內(nèi)存;.AIX 在RS/6000 S70服務器上支持16GB內(nèi)存;.當內(nèi)存足夠時,AIX 會自動擴展至大內(nèi)存;.32位程序仍受限于4GB的內(nèi)存;.

11、64位程序可存取260B的內(nèi)存.應用程序地址空間可大于4GB.在S70且安裝AIX 的系統(tǒng)上被編譯為64位的程序;.對超出32位尋址范圍的應用程序.不必為擔心性能而重新編譯.在64位平臺上,將32位程序重新編譯為32位時,其性能會無任何差別,因為這會任何編譯器的改進;.32位重新編譯為64位時,會看到些微的性能差別;.默認編譯模式是產(chǎn)生32位可執(zhí)行程序.AIX 核心是32位,在64位平臺上有附加的64位擴展;.為支持完全64位功能,核心不一定要求是64位的;.32位核心維持對32位的兼容性和健壯性;.核心擴展提供了64位程序所要求的功能;.新的應用程序二進制接口(ABI);.提供了對設備驅(qū)動程

12、序的二進制兼容性;.VMM支持64位進程地址空間;.只要有必要,某些系統(tǒng)調(diào)用可修改為64位參數(shù)(如文件和內(nèi)存操作);.對某些設備驅(qū)動程序有一些前提或限制.32位與64位進程的完全互操作性進程-進程.可共享文件.內(nèi)存,IPC資源(但要注意某些共享內(nèi)存的分配方式-字節(jié)邊界問題),也可相互發(fā)信號;.可相互exec()調(diào)用;.32位與64位進程可設置非本類進程的限制;32位與64位系統(tǒng)結(jié)構(gòu).編譯器仍是32位的;.編譯器既可在32位平臺,也可在64位平臺上運行;.既可產(chǎn)生32位,也可產(chǎn)生64位可執(zhí)行文件.頭文件已被修改過,以支持兩種環(huán)境;.增強了功能的共享庫的體系結(jié)構(gòu).兩種環(huán)境下都用同樣的路徑;.只維護

13、單一的源程序,makefile文件,.管理共享庫的工具默認為32位的.32位與64位核心支持.AIX 既支持32位的虛地址空間又支持64位的虛地址空間;.包含VMM與進程調(diào)度和其他功能;.32位進程與64位進程對系統(tǒng)設備都有同等訪問權(quán)利;.默認行為都是32位兼容的;.進程調(diào)用設備驅(qū)動程序一般被核心分隔.能在32位機器上運行64位程序嗎.顯然不能;.不過,在32位機器上編譯與鏈接64位程序是可能的(假如相關(guān)的庫等等已安裝).AIX 命令與工具.絕大多數(shù)AIX命令與工具仍是32位的;.需支持64位的絕大多數(shù)工具也仍是32位的;.所有命令與工具將繼續(xù)支持32位;.編譯器與連接程序支持64位的(注意:

14、這并不意味著二者是64位的).原有32程序與新的64位程序的二進制兼容性原有32位程序可不用重編譯,即可在AIX 中繼續(xù)作為32位程序運行.(1).在AIX 中,32位程序完全的二進制兼容性;.現(xiàn)存32位程序毋須修改或重新編譯,就可在64位平臺上運行;.32位模式下,百分之百的兼容性;即在64平臺上編譯的32位程序與32位平臺上編譯的32位程序都可在64位平臺上共存運行;.32位程序無任何性能下降,即32位程序不管是在32位平臺上運行,還是在64位平臺上運行,其性能無可分辨的差別.(2). 64位與32位的共存.AIX 在64位平臺中提供兩種應用環(huán)境;這兩種應用環(huán)境是互補而非竟爭的環(huán)境;64位

15、環(huán)境是向上兼容的AIX的附加,比AIX 低的版本不支持64位程序;并不強迫所有應用都是64位的.僅僅只有一種AIX產(chǎn)品既適應于32位平臺,又適應于64位平臺;32位與64位進程的完全共存,在64位平臺上既可運行32位進程,又可運行64位進程,兩種進程各有自己的運行環(huán)境;64位編程標準有關(guān)64位編程有兩個標準,UNIX98標準與LP64協(xié)議.前者說明UNIX系統(tǒng)調(diào)用與C標準庫函數(shù)的標準接口,各庫函數(shù)接口并不隱含數(shù)據(jù)類型是32位的,而是依協(xié)議IPL32確定其類型;后者說明64位編程C語言類型.數(shù)據(jù)類型標準LP64類型從上表可看出:LP64模式中,char,short,int這三種數(shù)據(jù)類型與32位程

16、序相應的數(shù)據(jù)類型完全一樣;而long型與指針則變成64位,相應地在32位程序中,long 與指針是32位的.LP64是一個一般的64位程序數(shù)據(jù)類型標準;不過,AIX用的是IPL32+long long int;見下表:Table 6. ILP32, LP64 and C for AIX Compiler Model Type SizeDatatypeILP32 (size in bit)LP64 (size in bit)C for AIX (32-bit / 64-bit)char 8 8 Implementedshort 1616Implementedint 3232 Implemente

17、dlong32 64 Implementedlong long Not DefinedNot Defined64 / 64pointer 3264Implementedfloat32 32 Implementeddouble 6464 Implementedlong double Not Defined Not Defined64 or 128 / 64 or 128 (1)int8_tuint8_tNot DefinedNot DefinedFixed-width type (2)8 bits (1 byte)int16_tuint16_tNot DefinedNot DefinedFixe

18、d-width type (2)16 bits (2 bytes)int32_tuint32_tNot Defined Not Defined Fixed-width type (2)32 bits (4 bytes)int64_tuint64_tNot DefinedNot DefinedFixed-width type (2)64 bits (8 bytes)_int8_uint8Not DefinedNot DefinedFixed-width type (3)1 byte_int16_uint16Not DefinedNot DefinedFixed-width type (3)2 b

19、ytes_int32_uint32Not DefinedNot DefinedFixed-width type (3)4 bytes_int64_unit64Not DefinedNot Defined Fixed-width type (3)8 bytes(1) Depend on the setting of the long double option. By default, the size is 8.(2) ANSI fixed-size types.(3) Should not be used; use ANSI types instead.說明:其中粗體部分表明在32位與64位

20、程序中長度有異,AIX為使其C+與Microsoft兼容,使用了_int8/16/32/64數(shù)據(jù)類型,在UNIX環(huán)境下一般應使用ANXI C數(shù)據(jù)類型,這包括在頭文件中.很明顯,64位程序與32位程序最大的不同就是:long與指針兩種數(shù)據(jù)類型的長度不同,當然那些由long間接定義的數(shù)據(jù)類型其長度也跟著不同.在32位程序中,int ,long ,pointer三種數(shù)據(jù)類型的長度是一樣的;三者相互賦值不會有影響;但在64位程序中,int長度只有4B,而long,pointer長度卻有8B,而且有些由long typedef的數(shù)據(jù)類型也是8B,從而在int 與long或pointer之間賦值就會導致錯

21、誤,特別是有些由long typedef的數(shù)據(jù)類型常常用作函數(shù)參數(shù),如果相應參數(shù)在程序中被定義為int,無疑會導致兼容性問題.2.結(jié)構(gòu)分配問題我們知道,在32位程序中,結(jié)構(gòu)數(shù)據(jù)有一種字邊界填充的定位問題:即一個結(jié)構(gòu)的第一個成員一定位于字邊界上,即使該成員實際占用空間并不需要一個字長的存儲空間,也會分配一個字長的存儲空間,剩余空間由編譯器填充;并且整個結(jié)構(gòu)所占空間也應位于字長邊界上;如struct struc32int I;long j;char c;這個結(jié)構(gòu)長度是12B,即sizeof(struc32)=12;其最后一個成員雖只有一個字節(jié),但也分配4個字節(jié);同樣地,在64位程序中,也存在結(jié)構(gòu)填

22、充問題;只不過不是以字為邊界,而是以雙字為邊界;如struct struc64int I;long j;char *p;在32位程序中,這個結(jié)構(gòu)的長度是12B,在64位程序中,其長度是24B;第一個成員只占4B,但編譯器也給它分配8B空間.值得注意的是:在64位程序下,某些結(jié)構(gòu)只成員一樣,但成員位置不同時,其長度也會不同;如struct lilong la;int ia; li;struct liilong la;int ia;int ib; lii;struct iliint ia;long la;int ib; ili;注意ili與lii兩個結(jié)構(gòu)變量:在64位程序中,sizeof(stru

23、ct lii)=16;sizeof(struct ili)=24;在64位程序中,對結(jié)構(gòu)成員的恰當排列,有可能減少程序所占空間.OBJ文件格式1.定義 在32位程序中,經(jīng)過編譯器編譯生成的.o文件,一般是COFF格式(Common Object Format File),但AIX 為支持64位程序,其.o文件格式為XCOFF(extended Common Object Format File);它組合了COFF格式與模塊格式內(nèi)容表(TOC)兩部分;后者提供了.o文件的動態(tài)連接與單元代替.XCOFF文件格式的主要優(yōu)點就是它能提供對共享庫和其他外部.o文件的動態(tài)解析引用.而一般地,COFF格式文

24、件只能靜態(tài)引用.XCOFF格式文件定義了.o文件與可執(zhí)行文件的機器內(nèi)存映象的排列方式,它是由語言處理器(ASM與編譯器)生成的,綁定器將單個的.o文件組裝形成可執(zhí)行文件,裝載程序?qū)COFF格式的可執(zhí)行文件讀進內(nèi)存,形成程序的內(nèi)存映象,符號調(diào)試器讀這個XCOFF的可執(zhí)行文件,以提供程序內(nèi)存映象中的變量與函數(shù)的符號引用.這種文件格式只能由AIX 及以上版本才能生成及裝載;當在64位模式下編譯時,編譯器生成64位指令并產(chǎn)生64位XCOFF格式.o文件,此時綁定器只綁定64位.o文件以生成64位可執(zhí)行文件.注意,在綁定到一起的.o文件中,不管是靜態(tài)綁定還是動態(tài)綁定,都只能是同一格式的.o文件,即32

25、位的.o文件與64位的.o文件的混合綁定是不允許的.(所謂64位模式,是指生成64位指令,產(chǎn)生64位XCOFF格式文件)AIX將XCOFF作為32位與64位程序的.o文件格式,從而有XCOFF32與XCOFF64之分,在RS/6000 32位平臺或64位平臺上,AIX的編譯器默認為32位模式,即經(jīng)編譯所得的目標文件是32位的;不過,AIX的cc編譯器在調(diào)用連接程序ld生成可執(zhí)行程序時,ld將只是把同類的.o文件(包括庫文件)連接成可執(zhí)行程序,即要么是XCOFF32格式的.o文件,要么是XCOFF64格式的.o文件.AIX的cc的這個特性要求:如果庫是XCOFF32格式的文件,那么所有用到這個庫

26、的可執(zhí)行程序就只能編譯為32位的;如果共享庫的某個可執(zhí)行程序要編譯為64位的,那么與這個共享庫有關(guān)的所有可執(zhí)行程序都要編譯為64位的;不允許共享庫某個32位庫的可執(zhí)行程序編譯為32位的,而另一個共享該庫的可執(zhí)行程序卻編譯為64位的.不過,在AIX 中,有少數(shù)幾個命令既支持32位XCOFF格式同時又支持64位XCOFF格式(即混合模式),這些命令有ar,dump,.nm,lorder,ranlib,size,strip.它們都用-X標志(-X32,-X64,-X32_64)來說明.o文件格式.ar支持兩種x(X)標志.-x表示從檔案庫中抽出所指定的文件并放到當前目錄;而-X標志則指定編譯編譯 一

27、般來說,AIXAIX編譯器cc有許多編譯選項,這里只簡單介紹一些與64位有關(guān)的編譯選項.(1).-q64選項:有這個編譯開關(guān)時,所編譯生成的.o或可執(zhí)行程序?qū)⑹?4位的;否則,默認為32位的;(2).-qwarn64選項:這個編譯選項既可在32位模式下使用,也可在64位模式下使用;使用這個可用來檢查源程序中64位的兼容性,它對與64位不兼容的代碼給出警告;在從32位移植到64位時,這個編譯選項是非常有用的;(3).-除了編譯選項外,在32位模式與64位模式間轉(zhuǎn)換,還有以下方法:環(huán)境變量 OBJECT_MODE(=32 64 32_64)-分別表示32位模式、64位模式編譯;32_64表示既可接

28、受32位模式,也可接受64位模式,不過在這種模式下,AIX連接程序與裝載程序不會將這種目標程序連接成可執(zhí)行程序.配置文件 /etc/在AIX 下是/etc/,它定義了編譯器的許多編譯選項;命令行參數(shù)這三種方式中,以環(huán)境變量最優(yōu)先,其次是配置文件,最后是命令行參數(shù). ar命令用于生成庫,即將.o文件放到一個庫中,由于.o文件有兩種模式,即32位與64位,默認情況下,ar處理32位.o文件,用-X(32,64,32_64)選項可使其處理64位.o文件,即生成64位庫; 如果對同一個makefile文件,先在32位模式下運行產(chǎn)生一個32位庫,然后又想運行make產(chǎn)生一個64位庫時,這個64位庫將不會

29、被更新.因為make只認時間戳,而不區(qū)分.o文件格式是32位還是64位.而且如果將同名的一個32位和64位.o文件加到同一個庫時,會出現(xiàn)問題.32位程序與64位程序在RS/6000 AIX 中的二進制兼容性這實際上是指32位程序與64位程序在64位平臺上的二進制兼容性,因為64位程序只能在64位平臺上運行,不能在32位平臺上運行.一般來說,用在任何32位處理器或64位處理器上的AIX 編譯的64位程序在64位處理器模式上不用重新編譯就可運行;用在任何32位處理器或64位處理器上的AIX 編譯的32位程序在兩種模式下都不用重新編譯就可運行.下表列出了對32位程序與64位程序的兼容性問題.32位/

30、64位兼容性32位應用程序64位應用程序32位平臺二進制兼容*不能執(zhí)行64位平臺二進制兼容*64位唯一可運行的平臺*注:二進制兼容是指:運行于AIX 與的基于RS/6000 POWER-, POWER2-, 和PowerPC-的應用程序不須重新編譯,就可在AIX 的基于同樣的或更新的同一系統(tǒng)的處理器上.不過,不包括下列情況:(1).AIX共享庫的非共享編譯;(2).AIX V4參考手冊公開說明的不可遷移的部分;(3).文檔未說明的AIX的內(nèi)部特性;(4).X11R5服務器擴展(僅適用于AIX ;(5).用POWER2或PowerPC編譯特性編譯的程序又不是運行在POWER2或PowerPC平臺

31、上;(6).用AIX高版本編譯的程序在低版本的AIX上可能會運行不正常.從而,須運行在所有平臺上的程序必須用編譯器的公共選項.用POWER2技術(shù)編譯的程序必須運行在POWER2平臺上;用PowerPC技術(shù)編譯的程序必須運行在PowerPC平臺.64位編程的補充及注意事項(結(jié)構(gòu)以字長為 邊界的填充)(1).最好在常數(shù)后面加止后綴 在64位程序中,常數(shù)一般被編譯器默認為long型,就象在32位程序中,常數(shù)被編譯器默認為int型一樣.可在常數(shù)后面加上U或L后綴,前者使編譯器將后綴為U的常數(shù)作為unsigned int型的數(shù);后者使編譯器把后綴為L的常數(shù)作為unsigned long型的數(shù);(2).聲

32、明所有的自定義函數(shù) 一般的cc編譯器將無聲明的函數(shù)的返回類型默認為int;在64位程序中,指針占用64位內(nèi)存,因此返回指針的函數(shù)必須聲明為64位,當然如同32位程序一樣,可聲明為指針;不過,將指針與int變量互相賦值絕對會造成兼容性問題;(3).從32位數(shù)擴展為64位數(shù) 這種擴展有可能使32位的負數(shù)變成64位的正數(shù);(4).與操作系統(tǒng)有關(guān)的數(shù)據(jù)類型 size_t,ssize_t ,time_t等由int long typedef的數(shù)據(jù)類型;(5).含指針或long或unsigned long數(shù)據(jù)成員的結(jié)構(gòu)的長度的改變 這種改變一般都可由運算子sizeof自動算出;但如果用”硬編碼”(具體數(shù)字)

33、也可能造成兼容性問題;(6)對long或 unsigned long數(shù)據(jù)的移位或邏輯操作(&或|)的長度位的設定移植步驟移植步驟(一).移植步驟.將應用程序從32位移植到64位,一般有下列一些步驟,這些步驟并不意味著功能調(diào)整或擴展,只不過是如同32位程序一樣的行為在64位模式下的解釋,在這個過程之后,要用擴展性能,你可能得修改源程序:(1).程序和數(shù)據(jù)分析檢查所有類型以決定這些數(shù)據(jù)類型應該是32位還是64位;對系統(tǒng)定義類型,其長度對系統(tǒng)調(diào)用/庫調(diào)用是合適的;對用戶定義類型,32位類型應該定義為int or unsigned int或在64位模式下仍是32位的系統(tǒng)定義類型;而用戶定義的64位類型

34、應該定義為long or unsigned long或系統(tǒng)定義的64位的類型;(2).修改數(shù)據(jù)類型將那些需要改變的數(shù)據(jù)類型改變?yōu)槟闼x擇的類型,此時,要檢查所有的算術(shù)運算以確保數(shù)據(jù)值的擴展和截短都是正確的;確保沒有作出任何指針適合int類型.(3).校驗其他程序輸出的使用確保所有被處理的數(shù)據(jù)在32位范圍內(nèi);若不可能,則其他使用這些數(shù)據(jù)的程序必須移植到64位或至少能意識到64位.(4).移去存儲相關(guān)移去在下列情況下的存儲相關(guān)性:程序正文段,數(shù)據(jù)段,程序堆,程序堆棧,errno,tok_of_stack結(jié)構(gòu),共享庫數(shù)據(jù),共享庫正文,和訪管指令表;(5).不好的地址用法當傳遞一個無效的地址給一個系統(tǒng)

35、調(diào)用時,64位進程將收到信號SIGSEGV(segmentation violation)而不是EFAULT類型的錯誤號(14 無效的地址);任何依賴于系統(tǒng)調(diào)用來保護無效地址的地方都應該刪除.(6).調(diào)試與測試測試程序以確定程序與在32位平臺上的行為完全一樣;若有差別,則調(diào)試程序.返回第一步在選定數(shù)據(jù)類型時,如果你要求某些數(shù)據(jù)類型長度在32位與64位模式下保持一致,比如都是32位,那么有如下三個數(shù)據(jù)類型:_long32_t,_ulong32_t,ptr64,前兩個在頭文件/usr/include/中定義,后者在頭文件/usr/include/sys/中定義;在32位模式下,_long32_t是

36、long型,_ulong32_t是unsigned long型;在64位模式下,_long32_t是int型,_ulong32_t是uint型;它們在兩個模式下都是4B的長度.而ptr64在32位模式下,是unsigned long long 型,在64位模式下,是指針型;在兩種模式下,都是8B長度.當想在32位與64位模式下都想有完全相同的長度時,可將(1)long型用_long32_t或其他32位數(shù)據(jù)類型代替;用_ulong32_t或其他32位數(shù)據(jù)類型取代ulong類型;(2)用int或其他32位數(shù)據(jù)類型取代指針;此時,程序在64位模式下對這個字段不能用指針;(二).程序和數(shù)據(jù)分析(1).

37、long ,intlong與int類型是不可相互交換的,C的long類型(以及從它導出的類型)在64位模式下是64位的;在移植時,應考慮所有與long或unsigned long相關(guān)的類型,如size_t在AIX 中是unsigned long.(2).未加后綴的常數(shù)象95 (UINT_MAX)這樣的數(shù)在32位模式下,編譯器認為是signed long類型的;但在64位模式下,會被當作signed long類型,占8B,這會使得某些操作,如sizeof(95)返回8;糾正措施是,將95寫為95U,此時,編譯器會將它作為unsigned int類型的數(shù).在64位模式下,若是16進制的無后綴常數(shù),

38、則常常會被當作64位的;在移植程序時,要記住這一點.所有可能影響常數(shù)賦值的常數(shù)都應該明確地加上后綴,對所有數(shù)字用后綴或類型可使程序不致出現(xiàn)非期望的行為.(3).指針,int在32位模式下,int,long和指針可相互賦值;在32位擴展模式(XCOFF)中,int ,long可賦值給指針,而將指針賦值給int,long只會給出一個警告信息;在ANSI模式下,在int與指針間相互賦值將產(chǎn)生服務級消息;在64位模式下,指針變成64位,在指針與int間賦值會引起段故障,而傳遞指針給一個參數(shù)為int的函數(shù)會引起截短.下面是一個不正確賦值的例子:int i;int *p;i = (int)p;用強制轉(zhuǎn)換使

39、問題更難發(fā)現(xiàn);警告信息雖沒有了,但問題仍存在.對指針和int賦值的問題,應采取下列辦法解決:(i).消除程序中假定指針類型適合C的int類型(包括從int導出的類型)的語句;(ii).消除程序中假定long類型適合C的int類型(包括從int導出的類型)的語句;(iii).在做移位或位操作時,消除任何對long位數(shù)的假定;(iv).消除C int(包括從int導出的類型)可傳遞給一個未聲明的long或指針參數(shù)的假定;(v).消除任何未聲明的函數(shù)會返回long或指針的假定.源程序64位兼容性檢查將32位程序移植為64位程序時,其主要問題集中在程序中使用含指針和/或int類型的數(shù)據(jù)成員,以及由lo

40、ng typedef的其他數(shù)據(jù)類型,和一些含long typedef類型參數(shù)的系統(tǒng)調(diào)用,在程序中這些參數(shù)如果被定義為int類型,就一定會出現(xiàn)兼容性問題,還有一些返回指針的系統(tǒng)調(diào)用或用戶自定義函數(shù),若其返回值在程序中被賦值給int類型的變量也會造成兼容性問題.因此,在開始編譯為64位程序之前,對源程序進行兼容性檢查是非常必要的.lint t 選項檢查兼容性用lint t “源程序”可檢查有問題的賦值,從32位移植到64位時,用這個命令可檢查以下一些兼容性問題:(1).函數(shù)未聲明原型 函數(shù)原型可使編譯器和lint標志出未匹配的參數(shù);(2).將long或指針賦值給int這類賦值有可能引起截短,即使使

41、用強制轉(zhuǎn)換;(3).將int賦值給指針如果該指針被引用,有可能是無效的;(4)與long或指針有關(guān)的移位操作在64位程序中,由于指針長度已增加到64位,所以其結(jié)果將不再有效;(5).與long或指針有關(guān)的用比特”與”,”或”,”異或”運算符的掩碼操作在64位程序中,掩碼也不再足夠.例:#include +2 void main(void) +3 int foo_i;+4 long foo_l;+5 int *foo_pt;+6+7 foo_l = boo(1);+8 foo_l = foo_l 1;+9 foo_l = 0 xFFFFFFFF;+10 foo_l = (foo_l & 0 xF

42、FFFFFFF);+11 foo_l = LONG_MAX;+12 foo_l = (long)foo_i;+13 foo_i = (int) &foo_l;+14 foo_pt = (int *)foo_i;+15 +16 long boo(long boo_l) +17 return(boo_l);+18 # lint -t , line 7: warning: conversion from int may lose accuracy, line 8: warning: Left Shift involving a long, line 10: warning: bitwise AND

43、involving a long, line 12: warning: conversion from int may lose accuracy, line 13: warning: conversion from PTR long may lose accuracy, line 16: error: illegal redeclaration of boo, line 17: warning: conversion from long may lose accuracy不過,用lint t也還有一些問題不能被發(fā)現(xiàn):在32位程序與64位程序中共享數(shù)據(jù)必須有相同的長度使用long或指針的聯(lián)合可

44、能不再工作32位與64位模式,還有另外兩個差別也可能會影響程序:(1).32位模式下,long long是放在兩個通用寄存器中,而在64位模式下,它是放在一個通用寄存器中;(2).32位模式下,傳遞一個浮點參數(shù)給一個未聲明原型的函數(shù)時,這個浮點參數(shù)被放在一個浮點寄存器和兩個通用寄存器中;而在64位模式下,這個浮點數(shù)被放在一個浮點寄存器和一個通用寄存器中.cc qwarn64 編譯選項檢查兼容性-qwarn64編譯選項,檢查可能的long-to-int截短問題;這個編譯選項既可在32位模式下用,也可在64位模式下用;在32位模式下,它就象一個預覽工具一樣,能幫助你發(fā)現(xiàn)從32位移植 到64位時的兼

45、容性問題.它能顯示數(shù)據(jù)轉(zhuǎn)換會引起問題的語句.在64位編譯模式下,它能檢查下列公共性的問題:(1).由于明顯或不明顯的將long轉(zhuǎn)換為int而引起的截短;(2).由于明顯或不明顯的將int轉(zhuǎn)換為long而引起的不期望的結(jié)果;(3).由于明顯地用強制轉(zhuǎn)換符將指針轉(zhuǎn)換為int而引起的無效地址引用;(4).由于明顯地用強制轉(zhuǎn)換符將int轉(zhuǎn)換為指針而引起的無效地址引用;(5).由于明顯或不明顯地把常數(shù)轉(zhuǎn)換為long類型;(6).由于明顯或不明顯地通過強制轉(zhuǎn)換將常數(shù)轉(zhuǎn)換為指針引起的問題;(7).源程序中pragma選項arch與命令行選項沖突.例:對上述cc qwarn64 c , line : 1506

46、-743 (I) 64-bit portability: possible change of result through conversion of int type into long type., line : 1506-743 (I) 64-bit portability: possible change of result through conversion of int type into long type., line : 1506-744 (I) 64-bit portability: possible truncation of pointer through conv

47、ersion of pointer type into int type., line : 1506-745 (I) 64-bit portability: possible incorrect pointer through conversion of int type into pointer.未能由上述工具發(fā)現(xiàn)的隱藏的兼容性問題用lint t命令未能發(fā)現(xiàn)由int轉(zhuǎn)換為long或由long轉(zhuǎn)換為int引起的兼容性問題;用-qwarn64編譯器選項未能檢查移位操作;將lint t和-qwarn64編譯器選項結(jié)合起來可以進行更細致的兼容性檢查.目標文件兼容性問題AIX C語言編譯器cc的特性6

48、4位程序的編譯(包括用戶庫)(1).一些以32位程序已被取代或過期的庫不再提供給64位程序,所以這些庫的API也從64位模式中消失;(2).64位程序數(shù)據(jù)重新轉(zhuǎn)換為32位數(shù)據(jù),傳遞給核心;下圖解釋了這種情況傳遞指針調(diào)用傳遞指針調(diào)用傳遞指針對核心擴展的系統(tǒng)調(diào)用構(gòu)建傳遞指針64位庫64位應用程序32位應用程序64位庫接口例程64位數(shù)據(jù)結(jié)構(gòu)調(diào)用32位數(shù)據(jù)結(jié)構(gòu)重映射表32位數(shù)據(jù)結(jié)構(gòu)64位核心擴展接口例程系統(tǒng)調(diào)用目標-希望32位輸入?yún)?shù),32位數(shù)據(jù)結(jié)構(gòu)32位核心32位庫系統(tǒng)調(diào)用系統(tǒng)調(diào)用上圖說明:(1).AIX 核心是32位的,它增加了對64位支持的核心擴展;(2).64位進程調(diào)用系統(tǒng)API時,其數(shù)據(jù)必須經(jīng)64位庫接口例程重新映射為32位數(shù)據(jù),然后再傳遞給核

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論