白劍飛,文正國
(中國水利水電科學(xué)研究院中水科技公司,北京 100038)
H9000計算機監(jiān)控系統(tǒng)是中國水利水電科學(xué)研究院自動化所面向水利水電工程監(jiān)控與自動化應(yīng)用而研制開發(fā)的分布式計算機控制系統(tǒng),自1996年首次現(xiàn)場投運以來,不斷擴充完善,由最初的1.0版升級到4.0版,并通過了170多個水利水電工程的運行考驗,是一套成熟的水電站計算機監(jiān)控系統(tǒng)。它結(jié)合了當(dāng)代國內(nèi)外最新計算機硬件產(chǎn)品、軟件產(chǎn)品、網(wǎng)絡(luò)技術(shù)、實時工業(yè)控制產(chǎn)品與未來發(fā)展趨勢,集中體現(xiàn)了中國水利水電科學(xué)院自動化所 (北京中水科水電科技開發(fā)有限公司)在水利水電自動化領(lǐng)域20多年的研制開發(fā)經(jīng)驗,系統(tǒng)具有良好的可靠性、可變性、可擴充性和可移植性,并支持異型機互聯(lián)。
水利水電工程計算機監(jiān)控系統(tǒng)采用的主流計算機操作系統(tǒng)分為UNIX操作系統(tǒng) (如SUN的Solaris、HP的HP-UX、IBM的AIX)、WINDOWS操作系統(tǒng)以及LINUX操作系統(tǒng)等。因UNIX系統(tǒng)具有高性能、高可靠性、高安全性、網(wǎng)絡(luò)和數(shù)據(jù)庫功能強尤其是防病毒等特點,是大中型水電廠計算機監(jiān)控系統(tǒng)主機的首選,但對運行維護人員的技術(shù)水平有一定要求,通常安裝UNIX系統(tǒng)的硬件平臺價格較高,性價比不高。而中小型水電廠多采用PC和WINDOWS技術(shù)架構(gòu)的計算機作為監(jiān)控系統(tǒng)主機,價格低廉,易于使用維護,但存在易感染病毒、性能不高等缺點。LINUX操作系統(tǒng)是一種類UNIX的操作系統(tǒng),目前已在計算機監(jiān)控系統(tǒng)領(lǐng)域開始使用,但還沒有成為主流。
H9000計算機監(jiān)控系統(tǒng)針對不同的硬件平臺和操作系統(tǒng)平臺,開發(fā)了基于UNIX操作系統(tǒng)和基于Windows操作系統(tǒng)的版本,這兩個版本用戶外部界面完全相同,具有相同的性能與功能,而且軟件代碼也基本兼容。
隨著技術(shù)的進步,為了降低使用UNIX平臺的硬件使用成本,擴大UNIX的市場占有率,有些UNIX操作系統(tǒng)已實現(xiàn)從專用硬件平臺到普通PC架構(gòu)硬件平臺的移植工作,比如SUN公司將Solaris操作系統(tǒng)從只支持SPARC平臺擴展到支持X86、X64等PC架構(gòu)平臺,從而擴大了Solaris的使用范圍。如果能實現(xiàn)H9000計算機監(jiān)控系統(tǒng)從基于SUN SPARC硬件平臺UNIX操作系統(tǒng)到基于X86 PC架構(gòu)硬件平臺UNIX操作系統(tǒng)的移植,將對降低水電行業(yè)在計算機監(jiān)控系統(tǒng)方面的投資、提高基于PC硬件平臺監(jiān)控系統(tǒng)的穩(wěn)定性和可靠性以及提高監(jiān)控系統(tǒng)的市場競爭力,具有重要意義。
本文在分析基于SUN硬件平臺的UNIX操作系統(tǒng)和基于PC架構(gòu)的UNIX操作系統(tǒng)差異的基礎(chǔ)上,研究了將H9000監(jiān)控系統(tǒng)移植到基于PC架構(gòu)的UNIX操作系統(tǒng)的技術(shù)。
X86架構(gòu)是從Intel 8008處理器中發(fā)展而來的,X86是一個Intel通用計算機系列的標(biāo)準(zhǔn)編號縮寫,也標(biāo)識一套通用的計算機指令集合。Intel公司所生產(chǎn)的所有CPU以及AMD、Cyrix等廠家生產(chǎn)的能使用X86指令集的CPU,都屬于X86系列及兼容CPU陣容。X86采用馮·諾依曼體系,使用復(fù)雜指令集,面向的是通用程序設(shè)計。
SPARC是SUN和TI公司合作開發(fā)的RISC微處理器。SPARC微處理器最突出的特點是它的可擴展性。SPARC采用哈佛結(jié)構(gòu),使用精簡指令集,強調(diào)運算速度,適用領(lǐng)域廣,可以用于PC也可以用于嵌入式。
基于SUN硬件平臺的UNIX操作系統(tǒng)是Solaris操作系統(tǒng),Solaris操作系統(tǒng)是SUN公司研發(fā)的多用戶多任務(wù)的UNIX操作系統(tǒng),分為SPARC和X86兩種版本。Solaris for SPARC版本只能安裝在基于SPARC架構(gòu)處理器的服務(wù)器上,Solaris for X86版本適用于X86架構(gòu)的計算機,目前有820多種X86平臺支持Solaris操作系統(tǒng)。
不同的硬件平臺及不同操作系統(tǒng)在核心機制、實現(xiàn)方式、用戶接口等方面的差異導(dǎo)致了特定平臺應(yīng)用系統(tǒng)的內(nèi)部機制存在較大差異。從系統(tǒng)平臺、應(yīng)用軟件的角度分析,研究工作將主要涉及應(yīng)用軟件設(shè)計與運行的支撐環(huán)境,應(yīng)用軟件的實現(xiàn)機制以及跨平臺的移植方法等幾個方面。
硬件體系結(jié)構(gòu)之間的差異體現(xiàn)在字長、字節(jié)排列順序、指令集等方面。SPARC平臺與X86平臺之間的硬件設(shè)計差異如下:
(1)字節(jié)存放順序不同:X86平臺采用的是小端字節(jié)存放順序,SPARC平臺采用的是大端字節(jié)存放順序。
(2)輸入輸出體系不同:X86平臺輸入/輸出采用特殊的指令格式,SPARC平臺輸入/輸出采用與讀寫內(nèi)存相同的指令格式。
(3)數(shù)據(jù)對齊性不同:結(jié)構(gòu)體中的域成員對齊方式跨平臺不同。如SPARC處理器強制double浮點變量8字節(jié)對齊方式,而X86處理器強制double浮點變量4字節(jié)對齊方式。由于不同平臺上不同的對齊方式和數(shù)據(jù)類型大小不同,造成結(jié)構(gòu)體大小不同,所以應(yīng)考慮在程序中使用sizeof操作碼得到具體的讀或?qū)憯?shù)據(jù)的字節(jié)個數(shù)。
(4)字節(jié)長度不同:Solaris for SPARC系統(tǒng)支持32位和64位技術(shù),而Solaris for X86系統(tǒng)僅支持X86處理器的32位家族。
(5)浮點操作不同:Solaris for X86系統(tǒng)浮點數(shù)80位寬,Solaris for SPARC系統(tǒng)浮點數(shù)是64位寬。由于這種不兼容性,導(dǎo)致計算結(jié)果可能不同。
作為應(yīng)用程序的支撐平臺,操作系統(tǒng)通常提供系統(tǒng)調(diào)用和函數(shù)鏈接庫作為程序的調(diào)用接口。不同平臺內(nèi)核中的進/線程調(diào)度、資源管理、圖形支撐等運行時接口內(nèi)部機制存在差異。Solaris OSSPARC和Solaris OSX86的差異主要如下:
(1)對專業(yè)圖形接口程序(OpenGL)支持方面的不同;
(2)特殊指令集不同。
編譯器是與操作系統(tǒng)同等重要的系統(tǒng)軟件,它將程序代碼翻譯成可執(zhí)行代碼,是操作系統(tǒng)生成可執(zhí)行代碼的最后一步。Solaris for SPARC系統(tǒng)和Solaris for X86系統(tǒng)編譯器之間的不同如下:
(1)編譯器標(biāo)志不同;
(2)線程本地存儲(TLS)存在差異。
從前邊的分析可以看出,平臺差異主要表現(xiàn)在硬件體系結(jié)構(gòu)、操作系統(tǒng)和編譯器三個方面。這些差異導(dǎo)致的問題及解決方法分述如下。
Solaris for SPARC系統(tǒng)和Solaris for X86系統(tǒng)之間由硬件體系結(jié)構(gòu)造成的不同主要有字節(jié)存放順序不同、存儲數(shù)據(jù)不同、數(shù)據(jù)對齊性不同、字節(jié)長度不同、浮點操作不同等。這些不同可能導(dǎo)致的問題及解決方法如下:
2.1.1 字節(jié)存放順序不同
(1)通過網(wǎng)絡(luò)傳輸數(shù)據(jù)時,如果運行在Solaris系統(tǒng)的應(yīng)用程序使用標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議與其他系統(tǒng)通過網(wǎng)絡(luò)交換數(shù)據(jù)時,可以在大端字節(jié)順序系統(tǒng)和小端字節(jié)順序系統(tǒng)之間實現(xiàn)通訊。如果應(yīng)用程序未使用任何協(xié)議而直接通過網(wǎng)絡(luò)傳送數(shù)據(jù),可能會出現(xiàn)因字節(jié)順序不同而導(dǎo)致數(shù)據(jù)傳輸出現(xiàn)問題。這種情況下,可以使用標(biāo)準(zhǔn)C庫提供的函數(shù)實現(xiàn)網(wǎng)絡(luò)字節(jié)順序和本機字節(jié)順序之間的轉(zhuǎn)換。
(2)用指針訪問數(shù)值數(shù)據(jù)的個別字節(jié)時,可能由于底層平臺字節(jié)順序的不同得到不同的結(jié)果。這種情況下,在代碼從Solaris SPARC操作系統(tǒng)移到x86操作系統(tǒng)需要注意。為使代碼適用于多平臺,使用字節(jié)類型變量來存儲值而不使用數(shù)值數(shù)據(jù)類型;或者使用具有獨立域的結(jié)構(gòu)變量來存儲每個值,使用結(jié)構(gòu)體域名來獲得和設(shè)置這些值。
(3)應(yīng)用程序數(shù)據(jù)存儲時,一般文件系統(tǒng)對字節(jié)順序是中立的。在Solaris SPARC和x86之間交換文件不是問題。應(yīng)用程序存儲各平臺之間共享的原始數(shù)據(jù)可能會因字節(jié)順序出現(xiàn)問題。如:Solaris SPARC平臺上運行的數(shù)據(jù)將以二進制數(shù)據(jù)存儲到文件的程序,這些文件中存儲的數(shù)據(jù)是字節(jié)順序依賴的。以二進制數(shù)據(jù)存儲的文件在SPARC和x86平臺之間是不可遷移的??梢杂靡韵聝煞N方法之一解決平臺之間共享數(shù)據(jù)的字節(jié)順序問題:①用文本和字符串將數(shù)據(jù)存儲成字節(jié)順序中立的格式;②在需要時進行字節(jié)順序轉(zhuǎn)換。
(4)共享內(nèi)存實現(xiàn)方面:在字節(jié)順序相反的設(shè)備或處理器之間共享內(nèi)存進行數(shù)據(jù)輸入和輸出時,為了避免附加系統(tǒng)調(diào)用的開銷,當(dāng)通過操作系統(tǒng)傳送數(shù)據(jù)到高速設(shè)備時,可以在外處理器上直接將存儲區(qū)映射到應(yīng)用程序地址區(qū)。共享內(nèi)存映射到應(yīng)用地址空間的最常見例子是圖形采集器用幀緩存器在本機和圖形處理器之間共享內(nèi)存。如果處理器的字節(jié)順序不同,以圖像采集器的共享內(nèi)存問題來說,對從相反字節(jié)順序設(shè)備傳送來的多字節(jié)數(shù)據(jù),在存儲之前或加載之后進行字節(jié)交換。
2.1.2 存儲順序不同
設(shè)定了特殊存儲順序的代碼是不可移植的。要使代碼可移植,需單獨比較結(jié)構(gòu)體中變量,使其不依賴于存儲順序。
2.1.3 數(shù)據(jù)對齊性不同
(1)讀/寫結(jié)構(gòu)體時:大部分程序使用標(biāo)準(zhǔn)C函數(shù)讀和寫數(shù)據(jù)到永久存儲體中,這些函數(shù)需要所讀或所寫數(shù)據(jù)的字節(jié)長度值。由于不同平臺下數(shù)據(jù)對齊性以及數(shù)據(jù)類型字節(jié)長度不同,結(jié)構(gòu)體的長度在不同的平臺下字節(jié)值不同,因此在給出讀或?qū)懙淖止?jié)長度時,需使用操作符sizeof。
(2)double和longdouble對齊性不同:double和long double浮點變量的對齊方式不同可能導(dǎo)致接口問題。SPARC處理器double變量采用8字節(jié)對齊方式,x86處理器double變量采用4字節(jié)對齊方式。
(3)補位:由于不同平臺結(jié)構(gòu)體中變量的對齊方式不同,引起補位不同,使結(jié)構(gòu)體字節(jié)長度不同。編譯器在結(jié)構(gòu)體中添加補位字節(jié)以使數(shù)據(jù)恰當(dāng)對齊,補位字節(jié)長度與結(jié)構(gòu)體、處理器和編譯器三者有關(guān)。
2.1.4 浮點操作不同
Solaris for X86系統(tǒng)浮點數(shù)80位寬,Solaris for SPARC系統(tǒng)浮點數(shù)是64位寬。由于位寬不同,算術(shù)運算的中間結(jié)構(gòu)精度差異可能導(dǎo)致運算結(jié)果不同。在程序中加入-fstore編譯標(biāo)志可以最小化差異,但使用-fstore標(biāo)志會帶來運行效率的降低。
如前1.2所述,Solaris OS SPARC和Solaris OS x86的主要差別表現(xiàn)在兩個方面:
一是對專業(yè)圖形接口程序的支持方面。Solaris SPARC支持OpenGL,Solaris x86不支持OpenGL,為了實現(xiàn)移植建議圖庫使用MesaGL;二是某些特殊指令集不同,一些應(yīng)用程序使用SPARC平臺上的特殊指令集來獲得綁定CPU的高性能事務(wù)。如使用快速傅立葉算法來處理語音識別和其他多媒體軟件的應(yīng)用程序。這些應(yīng)用程序從Solaris x86移植到SPARC平臺上時,需要找到可用于Solaris x86的替代算法。如可用MMX/SSE指令集 (多媒體指令集)來代替,該指令集可用于Solaris x86。
如前所述,Solaris SPARC和Solaris x86的差別主要表現(xiàn)在編譯器標(biāo)志和線程本地存儲方面。
2.3.1 編譯器標(biāo)志不同
Sun Studio編譯器包括C,C++編譯器。編譯器包括前端部分和后端部分。
前端部分包括源語言的語法和語義分析模塊,后端部分包括為特定硬件結(jié)構(gòu)設(shè)置的代碼優(yōu)化和代碼開發(fā)模塊。前端部分在SPARC和x86兩種平臺下是一樣的。后端部分依賴于平臺,在SPARC平臺和x86平臺下不同。Sun Studio編譯器對SPARC平臺和x86平臺的后端編譯器可提供不同的選項。當(dāng)代碼從一種平臺移植到另一種平臺時,選擇可用的相同選項。為成功實現(xiàn)從SPARC平臺向x86平臺的移植,HP推薦使用Sun Studio8編譯器集。
2.3.2 線程本地存儲
線程本地存儲(TLS)是一種機制,經(jīng)由它,程序可以擁有全局變量,但處于“每一線程各不相同”的狀態(tài)。在編譯時使用OS特定指令_thread可以聲明線程本地變量。在Solaris OS SPARC版本里邊,在代碼中全局變量初始化時添加_thread,該全局變量可被不同線程更改。Solari OSx86編譯器不支持具有_thread的代碼編譯。
在x86平臺上解決線程本地變量問題的方法是修改多線程共享全局變量處的代碼??梢允褂肞OSIX和Solaris線程API調(diào)用來代替上述全局變量。
H9000系統(tǒng)是由標(biāo)準(zhǔn)C語言編寫的。由上述分析,要實現(xiàn)H9000系統(tǒng)從Solaris for SPARC系統(tǒng)到Solaris for x86系統(tǒng)的移植,需從硬件平臺、操作系統(tǒng)和編譯器三個方面分析考慮。
由前邊的分析,SPARC和x86硬件平臺的差異主要表現(xiàn)在字節(jié)順序、存儲順序、數(shù)據(jù)對齊性和浮點操作方面,結(jié)合前邊提到的由于這些差異導(dǎo)致的問題和相應(yīng)的解決方式,H9000系統(tǒng)在進行平臺移植時應(yīng)考慮:
(1)字節(jié)數(shù)的動態(tài)讀取;
(2)字節(jié)序列化的規(guī)范化程式;
(3)浮點操作使用-fstore flag,以保持計算精度,使平臺移植后結(jié)果差異最??;
(4)避免使用-xarch=v9 flag,造成可能的潛在錯誤。
H9000系統(tǒng)圖庫用gtk實現(xiàn),因此不存在前邊所述的采用OpenGL所產(chǎn)生的移植問題。
考慮到部分特殊指令集平臺之間的不兼容性,將H9000系統(tǒng)中使用的特殊指令集全部由通用指令集替換。
由于SPARC和x86 Solaris的C編譯器不同,在進行選項配置的時候,編譯器flag的配置要選用既可用于SPARC平臺,又可用于x86平臺的flag。
[1]張凱龍,谷建華,等.Win32應(yīng)用到Linux的跨平臺移植技術(shù)研究[J]. 微電子學(xué)與計算機,2004,21(11).
[2]Amjad Khan.Guide to Adding Support for SolarisOS on x86 Platform to Existing ApplicationsAvailable on SPARC Platform[Z].August 2003.
[3]王德寬,袁宏,等.H9000 V4.0計算機監(jiān)控系統(tǒng)技術(shù)特點概要[J].水電自動化與大壩監(jiān)測,2007,31(3):16-18.