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