專利名稱::多核體系結(jié)構(gòu)下elf文件格式改造的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及嵌入式多核平臺下的修改可執(zhí)行文件格式以利用多核處理能力的問題,更具體的說,是涉及一種多核體系結(jié)構(gòu)下的ELF文件格式改造。
背景技術(shù):
:隨著計算機體系結(jié)構(gòu)的發(fā)展,可執(zhí)行文件的格式也在不斷地變化。最早的COM格式文件是完完全全的二進制文件,雖然簡單,但是逐步流行頁面存儲管理模式的使其無法更好地適應(yīng)程序設(shè)計的需要。因此出現(xiàn)了a.out等帶有文件頭和對文件內(nèi)的段進行分頁對齊的新的可執(zhí)行文件結(jié)構(gòu),稱為NMAGIC。由于人們對效率和空間的需求不斷提升,醒AGIC的也在不斷改進中逐步演變?yōu)镼MAGIC和Z區(qū)GIC。這些改進包括壓縮文件頭與代碼段映射到第一個頁面中以及同時映射最后一個代碼段和第一個數(shù)據(jù)段等。隨著面向?qū)ο蠹夹g(shù)的發(fā)展,a.out逐漸不能適應(yīng)程序設(shè)計的需要。因此出現(xiàn)了UNIXELF可執(zhí)行結(jié)構(gòu)和Microsoft的PE文件結(jié)構(gòu)。二者分別成為兩大平臺上的主流目標(biāo)文件格式。除此之外,曾出現(xiàn)過的目標(biāo)文件格式還有IBM360和Intel/Microsoft的0MF格式。在當(dāng)今多核平臺即將成為主流技術(shù)平臺的時代中,目標(biāo)文件格式的如果變化也面臨著一次巨大的挑戰(zhàn)。一方面是已有的目標(biāo)文件格式比如ELF和PE己經(jīng)成為許多主流平臺上的默認(rèn)目標(biāo)文件格式,而且使用起來也得到了大家的認(rèn)可,相對比較穩(wěn)定和通用。另一方面是對多核平臺如何進行高效利用的討論。因此,能夠適當(dāng)?shù)貙δ繕?biāo)文件格式進行修改,即保留其基本的穩(wěn)定性和通用性,又能夠使其更好地適應(yīng)新的多核平臺,充分發(fā)揮多核心的處理能力,是我們修改ELF文件格式的基本動機。此外,由于現(xiàn)在在多核平臺上的程序設(shè)計大多是交給編譯器來處理詳細(xì)的細(xì)節(jié)。而這些細(xì)節(jié)包括同步,任務(wù)劃分,進程創(chuàng)建等,設(shè)計開發(fā)編譯器的工作量就會非常的大,這也會使編譯器的效率降低,使其無法專注在對程序的優(yōu)化上面。另外,由于當(dāng)今多種線程庫的存在,編譯器在啟動新線程的時候需要考慮到不同平臺中線程庫的差異,因此必然要包括對多種線程庫的支持,這會使編譯器變的異常龐大。所以,我們試圖盡量采用了最少的改動,將一部分跟多進程創(chuàng)建的工作劃分出來交給操作系統(tǒng)的裝載器來完成,而裝載器是無法智能地識別不任務(wù)中可以并行的部分的,所以修改ELF目標(biāo)文件的格式就是唯一可以采取的方法。
發(fā)明內(nèi)容本發(fā)明的主要目的在于克服現(xiàn)有技術(shù)中的不足,提供一種多核體系結(jié)構(gòu)下的ELF文件格式改造的方法。為了解決上述技術(shù)問題,本發(fā)明是通過以下技術(shù)方案實現(xiàn)的。(1)用戶添加并行處理標(biāo)志用戶在所編寫的程序中加上通知編譯器可并行處理的標(biāo)簽,編譯器將原本需要順序執(zhí)行的程序段分別獨立出來,形成多個可并行執(zhí)行而且對結(jié)果的正確性沒有影響的獨立的程序代碼段;(2)把獨立的代碼裝載進ELF文件中不同的代碼段中在ELF文件中設(shè)定多個代碼段,將經(jīng)過編譯獨立出來的程序代碼分別寫入ELF文件不同的代碼段中,這種新的ELF文件格式下的多個代碼段分別用.textn的方式來標(biāo)識,n為序號,從l開始;目前的ELF文件格式中只有一個代碼段。而這里我們將經(jīng)過編譯獨立出來的程序代碼分別寫入ELF文件不同的代碼段中,因此需要ELF文件中存在多個代碼段。(3)修改ELF文件頭中的標(biāo)志位,來標(biāo)識新的ELF格式將ELF文件中的頭16個字節(jié)的最后一個字節(jié)由0x00修改為0x01,用來代表采用新的ELF文件格式;(4)增加新加的段在新線程中的起始地址修改ELF文件頭中的頭16個字節(jié)中第12,13,14,15個字節(jié)為新加的段在新線程中的起始地址;(5)修改ELF格式的裝載器-對ELF格式的裝載器的load—elf—binary函數(shù)進行修改,首先對ELF的格式進行判斷看是否是新定義的格式;如果是,則利用系統(tǒng)調(diào)用啟動一個新的進程,根據(jù)返回值的不同,父進程繼續(xù)執(zhí)行原先的裝載過程,而子進程將新的代碼段裝載進入自己的進程空間,并通過start—thread將堆棧中的記錄的程序計數(shù)器修改為新的入口地址,即可以使用默認(rèn)地址或者ELF文件頭中所記錄的地址;(6)多線程程序在不同核上的執(zhí)行將子進程通過系統(tǒng)調(diào)用sched—setaffinity來設(shè)置該進程與不同CPU之間的親緣程度,以調(diào)度該進程到特定的核上運行,充分利用多個核的處理能力;(7)不同線程結(jié)果的統(tǒng)一由編譯器在主線程中進行設(shè)置。作為一種改進,修改ELF格式的文件格式,將編譯器分解出來的邏輯上獨立的文本段寫入不同的代碼段中,在裝載的時候分別把這些代碼段裝載到不同的進程中,以利用多核平臺的處理能力。同時該改造辦法也消除了已有的多核平臺下程序設(shè)計的編譯器中需要多種底層線程庫支持的要求。與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是(1)高效性。本發(fā)明實現(xiàn)了多核體系結(jié)構(gòu)下的ELF文件格式改造,通過將多核平臺下的ELF文件格式改造成容納多個邏輯上獨立的代碼段,減少了多核心平臺下編譯器的工作量,提高了編譯器的處理效率。(2)平臺無關(guān)性。本發(fā)明中通過多核體系結(jié)構(gòu)下的ELF文件格式改造,將多核編譯器中需要多線程庫支持的部分交給操作系統(tǒng)的裝載器來執(zhí)行,消除了編譯器中需要對不同平臺的多種線程庫支持的要求,有效地了編譯器的大小,。(3)實用性。本發(fā)明提出的多核體系結(jié)構(gòu)下的ELF文件格式改造,充分利用了多核處理平臺的處理能力。同時由于處理的簡單性,該技術(shù)也可以利用在對MicrosoftPE文件格式等目標(biāo)文件格式的改造中。圖1是本發(fā)明的總體結(jié)構(gòu)框架圖。具體實施方式結(jié)合附圖,通過具體實施例對本發(fā)明進一步說明。首先解釋一下用到的名詞ELF:ExecutableandLinkableFormat,用于可執(zhí)行文件和可連接的共享庫文件。1oad—e1f_binary:裝載代碼進入程序進程空間的函數(shù)。start—thread:指定新線程的起始地址,并不實際啟動新線程,直到從系統(tǒng)調(diào)用退出時候該線程才自動啟動。sched—setaffinity:設(shè)定某個進程對某個或某些處理器核的親緣性,即保證該進程在某個或某些處理器核上運行。多核體系結(jié)構(gòu)下的ELF文件格式改造,包括以下步驟(1)用戶添加并行處理標(biāo)志用戶在所編寫的程序中加上通知編譯器可以進行并行處理的標(biāo)簽。以便編譯器將原本需要順序執(zhí)行的程序段分別獨立出來,形成可以并行執(zhí)行而且對結(jié)果的正確性沒有影響的程序代碼段。(2)編譯器把獨立的代碼裝載進ELF文件中不同的代碼段中由于邏輯上獨立的程序段已經(jīng)形成,因此可以加他們分別加載到不同的代碼段。在原始的ELF文件格式中,只有一個代碼段,包含了所有的程序代碼。所以以前為了把已經(jīng)經(jīng)過編譯過程分解出來的獨立的程序段裝載到不同的線程中同步執(zhí)行,需要使用操作系統(tǒng)或者第三方提供的線程庫來手動創(chuàng)建線程,并需要精確地放置所區(qū)分出的代碼的位置,這就帶來了重定位的問題,使設(shè)計變的非常復(fù)雜。這里我們把原始程序的代碼分成獨立的部分后,分別寫如ELF文件獨立的代碼段中。這些代碼段用.textl,.text2等來表示。(3)修改ELF文件頭中的標(biāo)志位,來標(biāo)識新的ELF格式ELF文件中的頭16個字節(jié)的數(shù)值代表了ELF文件的版本,機器類型,大小端類型,體系結(jié)構(gòu)類型等。在ELF格式的標(biāo)準(zhǔn)中,這16個字節(jié)的最后一個字節(jié)始終為0x01,這里我們修改為0x01,用來代表我們采用了新的ELF文件格式。這個標(biāo)志在以后我們修改過的裝載器中會使用。(4)增加新加的段在新線程中的起始地址修改ELF文件頭中的頭16個字節(jié)中第12,13,14,15個字節(jié)為新加的段在新線程中的起始地址。一般情況下,這個地址是沒有用的,因為新加的代碼段在裝載到線程時也可以利用ELF文件頭中存儲的默認(rèn)起始地址。這里只是提供了一種將新段加載到不同地址的一種方法。(5)修改ELF格式的裝載器由于對ELF文件格式進行了修改,因此針對ELF格式的裝載器也需要進行相應(yīng)的改動。所有的改動均發(fā)生在load—elf_binary函數(shù)中。在這里,我們首先對ELF的格式進行判斷看是否是我們新定義的格式,如果是,則利用系統(tǒng)調(diào)用啟動一個新的進程,根據(jù)返回值的不同,父進程繼續(xù)執(zhí)行原先的裝載過程。而子進程將新的代碼段裝載進入自己的進程空間并通過start—thread將堆棧屮的記錄的程序計數(shù)器修改為新的入口地址,即可以使用默認(rèn)地址或者ELF文件頭中所記錄的地址。(6)調(diào)度多個線程在不同核上的執(zhí)行剛剛創(chuàng)建好的子進程與父進程是在同一個核上運行的,這其實只是宏觀上的并行而微觀上仍然是串行的。為了利用多核的優(yōu)勢,可以將子進程通過系統(tǒng)調(diào)用sched—setaffinity來設(shè)置該進程與不同CPU之間的親緣程度,以調(diào)度該進程到特定的核上運行。這樣就充分利用了多個核的處理能力。(7)不同線程結(jié)果的統(tǒng)一結(jié)果的統(tǒng)一由編譯器在主線程中進行設(shè)置,比如通過wait來等待子進程的完成。這在已有的編譯器中已經(jīng)是成熟的技術(shù)。本發(fā)明所述的是多核體系結(jié)構(gòu)下的ELF文件格式改造的方法,修改ELF格式的文件格式,將編譯器分解出來的邏輯h獨立的文本段寫入不同的代碼段中,在裝載的時候可以分別把這些代碼段裝載到不同的進程中,以利用多核平臺的處理能力。同時該改造辦法也消除了已有的多核平臺下程序設(shè)計的編譯器中需要多種底層線程庫支持的要求。由于處理的簡單性,本框架具有很好的通用性,可以使用在多種不同的目標(biāo)文件格式中。最后,還需要注意的是,以上列舉的僅是本發(fā)明的具體實施例子。顯然,本發(fā)明不限于以上實施例子,還可以有許多變形。本領(lǐng)域的普通技術(shù)人員能從本發(fā)明公開的內(nèi)容直接導(dǎo)出或聯(lián)想到的所有變形,均應(yīng)認(rèn)為是本發(fā)明的保護范圍。權(quán)利要求1、一種多核體系結(jié)構(gòu)下ELF文件格式改造的方法,其特征在于,包括以下步驟(1)用戶添加并行處理標(biāo)志用戶在所編寫的程序中加上通知編譯器可并行處理的標(biāo)簽,編譯器將原本需要順序執(zhí)行的程序段分別獨立出來,形成多個可并行執(zhí)行而且對結(jié)果的正確性沒有影響的獨立的程序代碼段;(2)把獨立的代碼裝載進ELF文件中不同的代碼段中在ELF文件中設(shè)定多個代碼段,將經(jīng)過編譯獨立出來的程序代碼分別寫入ELF文件不同的代碼段中,這種新的ELF文件格式下的多個代碼段分別用.textn的方式來標(biāo)識,n為序號,從1開始;(3)修改ELF文件頭中的標(biāo)志位,來標(biāo)識新的ELF格式將ELF文件中的頭16個字節(jié)的最后一個字節(jié)由0x00修改為0x01,用來代表采用新的ELF文件格式;(4)增加新加的段在新線程中的起始地址修改ELF文件頭中的頭16個字節(jié)中第12,13,14,15個字節(jié)為新加的段在新線程中的起始地址;(5)修改ELF格式的裝載器對ELF格式的裝載器的load_elf_binary函數(shù)進行修改,首先對ELF的格式進行判斷看是否是新定義的格式;如果是,則利用系統(tǒng)調(diào)用啟動一個新的進程,根據(jù)返回值的不同,父進程繼續(xù)執(zhí)行原先的裝載過程,而子進程將新的代碼段裝載進入自己的進程空間,并通過start_thread將堆棧中的記錄的程序計數(shù)器修改為新的入口地址,即可以使用默認(rèn)地址或者ELF文件頭中所記錄的地址;(6)多線程程序在不同核上的執(zhí)行將子進程通過系統(tǒng)調(diào)用sched_setaffinity來設(shè)置該進程與不同CPU之間的親緣程度,以調(diào)度該進程到特定的核上運行,充分利用多個核的處理能力;(7)不同線程結(jié)果的統(tǒng)一由編譯器在主線程中進行設(shè)置。2、根據(jù)權(quán)利要求1所述的多核體系結(jié)構(gòu)下ELF文件格式改造的方法,其特征在于,修改ELF格式的文件格式,將編譯器分解出來的邏輯上獨立的文本段寫入不同的代碼段中,在裝載的時候分別把這些代碼段裝載到不同的進程中,以利用多核平臺的處理能力。全文摘要本發(fā)明提供了一種多核體系結(jié)構(gòu)下的ELF文件格式改造的方法。包括以下步驟(1)用戶添加并行處理標(biāo)志;(2)把獨立的代碼裝載進ELF文件中不同的代碼段中;(3)修改ELF文件頭中的標(biāo)志位,來標(biāo)識新的ELF格式;(4)增加新加的段在新線程中的起始地址;(5)修改ELF格式的裝載器;(6)多線程程序在不同核上的執(zhí)行;(7)不同線程結(jié)果的統(tǒng)一由編譯器在主線程中進行設(shè)置。本發(fā)明所述的多核體系結(jié)構(gòu)下的ELF文件格式改造的方法,消除了已有的多核平臺下程序設(shè)計的編譯器中需要多種底層線程庫支持的要求;由于處理的簡單性,本框架具有很好的通用性,可以使用在多種不同的目標(biāo)文件格式中。文檔編號G06F9/445GK101281470SQ20081006234公開日2008年10月8日申請日期2008年5月9日優(yōu)先權(quán)日2008年5月9日發(fā)明者馮德貴,楠張,罡王,章鐵飛,威胡,蔣冠軍,劍陳,度陳,陳天洲,項凌翔申請人:浙江大學(xué)