,其中一份用于支持64位程序運(yùn)行,另一份用來支持32位程序運(yùn)行。
[0027]在兼容32位指令的64位處理器的前提下進(jìn)行步驟SI,在所述64位處理器對應(yīng)地設(shè)有64位操作系統(tǒng),在所述64位操作系統(tǒng)中設(shè)計一 32位系統(tǒng)調(diào)用接口,與該系統(tǒng)調(diào)用接口對應(yīng)的32位運(yùn)行庫、鏈接器以及程序加載器均設(shè)計于該處理器中,所述32位運(yùn)行庫、鏈接器、程序加載器以及32位系統(tǒng)調(diào)用接口共同形成32位子操作系統(tǒng)。
[0028]分別編譯得到32位與64位兩套運(yùn)行庫,一般為C語言運(yùn)行庫,由于32位與64位相同功能的運(yùn)行庫的文件名稱相同,所以32位和64位的運(yùn)行庫放于不同的文件夾,方便應(yīng)用程序運(yùn)行的時候鏈接使用,具體地,在應(yīng)用時將32位運(yùn)行庫安裝到操作系統(tǒng)當(dāng)中的/usr/lib和/Iib目錄下,將64位運(yùn)行庫放在/usr/lib64和/lib64目錄下。
[0029]所述運(yùn)行庫具有標(biāo)準(zhǔn)接口定義,由運(yùn)行庫中的函數(shù)間接地使用系統(tǒng)調(diào)用。
[0030]接下來以步驟S2進(jìn)行判斷,分別編譯得到32位鏈接器、64位鏈接器和32位裝載器、64位裝載器,32位和64位的鏈接器以及裝載器分別有相同的名字,需要將32位鏈接器和32位裝載器放置到/Iib目錄下,將64位鏈接器和64位裝載器放到/lib64目錄下。
[0031]執(zhí)行系統(tǒng)調(diào)用的另一種方法是,添加一個判斷,對-運(yùn)行的應(yīng)用程序格式進(jìn)行判斷:
(1)if(size of (long *) ==4) 32bit,由條件得出判斷結(jié)果,即判斷結(jié)果是32位應(yīng)用程序,則調(diào)用32位子操作系統(tǒng)中的32位加載器來裝載該應(yīng)用程序;
(2)if(size of (long *) ==8)64bit,由條件得出判斷結(jié)果,即判斷結(jié)果是64位應(yīng)用程序,則調(diào)用64位Linux操作系統(tǒng)中的64位加載器來裝載該應(yīng)用程序。
[0032]系統(tǒng)調(diào)用的工作過程為:當(dāng)用戶發(fā)送一個系統(tǒng)調(diào)用的請求時,該系統(tǒng)調(diào)用用一個標(biāo)準(zhǔn)的C語言運(yùn)行庫的封裝例程來引導(dǎo),在封裝例程中含有匯編指令代碼:
move v0, s0syscall
該move v0, s0將系統(tǒng)調(diào)用號載入v0寄存器,并執(zhí)行匯編指令syscall使用該系統(tǒng)調(diào)用進(jìn)入內(nèi)核:handle_sys (),由handle_sys ()找到指定的系統(tǒng)調(diào)用函數(shù),該系統(tǒng)調(diào)用被執(zhí)行,并返回執(zhí)行結(jié)果。
[0033]在64位Linux操作系統(tǒng)中,在啟用32位程序時仍然會使用syscall實現(xiàn)系統(tǒng)調(diào)用,在內(nèi)核當(dāng)中則需要將32位和64位系統(tǒng)調(diào)用分開處理,64位系統(tǒng)調(diào)用直接執(zhí)行系統(tǒng)調(diào)用所指向的內(nèi)核函數(shù),而32位系統(tǒng)調(diào)用則需先進(jìn)行處理,轉(zhuǎn)化為64位調(diào)用,在執(zhí)行行系統(tǒng)調(diào)用所指向的內(nèi)核函數(shù),即32位系統(tǒng)調(diào)用轉(zhuǎn)化后再實現(xiàn)系統(tǒng)調(diào)用并執(zhí)行。
[0034]運(yùn)行庫是程序在運(yùn)行時所需要的庫文件,通常運(yùn)行庫是以ELF文件形式提供的,運(yùn)行庫一般包括編程時常用的函數(shù),如字符串操作、文件操作、界面等內(nèi)容。其為一個經(jīng)過封裝的程序模塊,對外提供接口,只要知道接口參數(shù)就可以自由使用,如果不使用運(yùn)行庫,則程序中會有很多的重復(fù)代碼,而使用運(yùn)行庫以后,則可以大大縮小編譯后的程序的大小,如果在Linux操作系統(tǒng)中找不到相應(yīng)的運(yùn)行庫程序就無法運(yùn)行,
具體使用時,一個編譯鏈接好的C程序,在Linux上執(zhí)行的過程如下:exec會使用BRK()函數(shù)設(shè)置當(dāng)前的數(shù)據(jù)段,然后打開預(yù)告編譯時指定好的共享庫的文件,并且把共享庫加載到內(nèi)存中,因為程序在編譯的時候,默認(rèn)是使用共享庫的方式,只有加載了共享庫到內(nèi)存,才能保證程序執(zhí)行的正確性,最后執(zhí)行編寫的代碼執(zhí)行,共享庫即動態(tài)庫。共享庫是Linux系統(tǒng)最廣泛的一種程序使用方式。
[0035]它的工作原理是相同功能的代碼可以被多個程序共同使用,在程序加載的時候,內(nèi)核會檢查程序使用到的動態(tài)庫是否已經(jīng)加載到內(nèi)存,如果沒有被加載到內(nèi)存,則從系統(tǒng)庫路徑搜索并且加載相關(guān)的動態(tài)庫;如果動態(tài)庫已經(jīng)被加載到內(nèi)存,程序可以直接使用而無須加載,使用動態(tài)庫可以減小應(yīng)用程序占用的空間和加載時間。
[0036]在本實施例中,系統(tǒng)調(diào)用接口是Linux操作系統(tǒng)內(nèi)核與上層應(yīng)用程序進(jìn)行交互通信的唯一接口。從對中斷機(jī)制的說明可知,用戶程序通過直接或間接(通過庫函數(shù))調(diào)用syscall匯編指令,并在vO寄存器中指定系統(tǒng)調(diào)用功能號,即可使用內(nèi)核資源,包括系統(tǒng)硬件資源。不過通常應(yīng)用程序都是使用具有標(biāo)準(zhǔn)接口定義的C函數(shù)庫中的函數(shù)間接地使用內(nèi)核的系統(tǒng)調(diào)用。
[0037]經(jīng)過實測,龍芯平臺附帶32位子系統(tǒng)的64位Linux操作系統(tǒng)無論是在應(yīng)用32位程序還是64位程序以及在多線程的控制下,系統(tǒng)均能夠流暢運(yùn)行,真正實現(xiàn)了不同位數(shù)的應(yīng)用程序?qū)?yīng)不同的系統(tǒng)調(diào)用而不影響系統(tǒng)的穩(wěn)定性,通過簡單的方法就可以讓32位軟件完全適應(yīng)64位系統(tǒng),對64位系統(tǒng)的普及起到了重要的推動作用。
[0038]上述實施例僅僅是為清楚地說明本發(fā)明創(chuàng)造所作的舉例,而并非對本發(fā)明創(chuàng)造【具體實施方式】的限定。對于所屬領(lǐng)域的普通技術(shù)人員來說,在上述說明的基礎(chǔ)上還可以做出其它不同形式的變化或變動。這里無需也無法對所有的實施方式予以窮舉。凡在本發(fā)明的精神和原則之內(nèi)所引伸出的任何顯而易見的變化或變動仍處于本發(fā)明創(chuàng)造權(quán)利要求的保護(hù)范圍之中。
【主權(quán)項】
1.一種64位Linux操作系統(tǒng)兼容32位應(yīng)用軟件的方法,其特征在于,包括以下步驟: 步驟S1:于所述64位處理器對應(yīng)地設(shè)有64位操作系統(tǒng),在所述64位操作系統(tǒng)的內(nèi)核中設(shè)計一 32位系統(tǒng)調(diào)用接口,與該系統(tǒng)調(diào)用接口對應(yīng)的32位運(yùn)行庫、鏈接器以及程序加載器均設(shè)計于該64位操作系統(tǒng)中,所述32位運(yùn)行庫、鏈接器、程序加載器以及32位系統(tǒng)調(diào)用接口共同形成32位子操作系統(tǒng); 步驟S2:對運(yùn)行的應(yīng)用程序進(jìn)行判斷,并選擇與程序相對應(yīng)的操作系統(tǒng),調(diào)用與該程序位數(shù)相對應(yīng)的加載器、鏈接器以及運(yùn)行庫進(jìn)行執(zhí)行。2.如權(quán)利要求1所述的方法,其特征在于,進(jìn)一步地,還包括判斷步驟: 聲明一個指針判斷,對運(yùn)行的應(yīng)用程序格式進(jìn)行判斷: (1)若判斷結(jié)果是32位應(yīng)用程序,則調(diào)用32位子操作系統(tǒng)中的32位加載器來裝載該應(yīng)用程序; (2)若判斷結(jié)果是64位應(yīng)用程序,則調(diào)用64位Linux操作系統(tǒng)中的64位加載器來裝載該應(yīng)用程序。3.如權(quán)利要求1所述的方法,其特征在于,進(jìn)一步地,還包括判斷步驟: 在所述操作系統(tǒng)的內(nèi)核上一層為虛擬系統(tǒng)調(diào)用中間層,用于識別32位與64位應(yīng)用程序; 獲取運(yùn)行的應(yīng)用程序所屬的系統(tǒng)調(diào)用的格式,由該中間層對該格式進(jìn)行判斷,若判斷為32位系統(tǒng)調(diào)用,則對該系統(tǒng)調(diào)用的數(shù)據(jù)結(jié)構(gòu)進(jìn)行轉(zhuǎn)換,進(jìn)而執(zhí)行該系統(tǒng)調(diào)用; 若判斷為64位系統(tǒng)調(diào)用,則直接執(zhí)行該系統(tǒng)調(diào)用。4.如權(quán)利要求2或3所述的方法,其特征在于,所述應(yīng)用程序在裝載應(yīng)用結(jié)束后,根據(jù)該應(yīng)用程序在編譯時標(biāo)定的運(yùn)行庫位置來裝載該應(yīng)用程序所對應(yīng)的運(yùn)行庫。5.如權(quán)利要求2或3所述的方法,其特征在于,應(yīng)用程序裝載結(jié)束以后,32位應(yīng)用程序的裝載器調(diào)用32位動態(tài)鏈接器來完成內(nèi)存中的應(yīng)用程序與運(yùn)行庫的鏈接工作,64位應(yīng)用程序的裝載器調(diào)用64位動態(tài)鏈接器完成內(nèi)存中的應(yīng)用程序與所屬運(yùn)行庫的鏈接工作。6.如權(quán)利要求1所述的方法,其特征在于,所述操作系統(tǒng)采用龍芯64位處理器。7.如權(quán)利要求3所述的方法,其特征在于,所述操作虛擬系統(tǒng)調(diào)用中間層以上的運(yùn)行庫、裝載器、鏈接器均為兩份,其中一份為32位,另一份為64位。8.如權(quán)利要求7所述的方法,其特征在于,所述運(yùn)行庫具有標(biāo)準(zhǔn)接口定義,由運(yùn)行庫中的函數(shù)間接地使用系統(tǒng)調(diào)用。9.如權(quán)利要求5所述的方法,其特征在于,所述內(nèi)存為內(nèi)核的一個組成部分,應(yīng)用程序執(zhí)行時,首先裝載形成應(yīng)用程序的內(nèi)存鏡像以及運(yùn)行庫的內(nèi)存鏡像,然后由鏈接器鏈接內(nèi)存鏡像中的應(yīng)用程序以及運(yùn)行庫鏡像,同時加載共享庫到內(nèi)存中,之后執(zhí)行編寫的代碼執(zhí)行。
【專利摘要】本發(fā)明涉及一種在64位Linux操作系統(tǒng)兼容32位應(yīng)用軟件的方法,通過在龍芯平臺64位操作系統(tǒng)內(nèi)核中設(shè)計一32位子系統(tǒng),對需要運(yùn)行的程序進(jìn)行判斷進(jìn)行選擇相對應(yīng)的系統(tǒng)調(diào)用,或者通過指針長度判斷應(yīng)用程序格式,進(jìn)一步選擇與程序相對應(yīng)的系統(tǒng),調(diào)用與該程序位數(shù)相對應(yīng)的加載器、鏈接器以及運(yùn)行庫進(jìn)行執(zhí)行。本發(fā)明的有益效果為:使一些在短時間內(nèi)無法在龍芯64位Linux操作系統(tǒng)如Linux平臺上部署的應(yīng)用程序,或是從32位Linux操作系統(tǒng)向64位遷移比較繁瑣、甚至一些不適合64位平臺的應(yīng)用程序,完全運(yùn)行在64位Linux操作系統(tǒng)中的32位子兼容子系統(tǒng),從而保證了資源利用率以及運(yùn)行效率,提高了系統(tǒng)的兼容性以及可應(yīng)用程序的數(shù)量,從而推動了普及64位Linux操作系統(tǒng)的應(yīng)用。
【IPC分類】G06F9/445, G06F17/30
【公開號】CN105094870
【申請?zhí)枴緾N201410202125
【發(fā)明人】張久伶, 黨立斌
【申請人】中標(biāo)軟件有限公司
【公開日】2015年11月25日
【申請日】2014年5月13日