2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、漫談兼容內(nèi)核之九:ELF映像的裝入(二).txt我們用一只眼睛看見現(xiàn)實(shí)的灰墻,卻用另一只眼睛勇敢飛翔,接近夢(mèng)想。男人喜歡聽話的女人,但男人若是喜歡一個(gè)女人,就會(huì)不知不覺聽她的話。漫談兼容內(nèi)核之九:ELF映像的裝入(二)[align=center][size=4][b]漫談兼容內(nèi)核之九:ELF映像的裝入(二)[b][size][align][align=center]毛德操[align]上一篇漫談介紹了在通過execve()系統(tǒng)調(diào)用啟動(dòng)一

2、個(gè)ELF格式的目標(biāo)映像時(shí)發(fā)生于Linux內(nèi)核中的活動(dòng)。簡而言之,內(nèi)核根據(jù)映像頭部所提供的信息把目標(biāo)映像映射到(裝入)當(dāng)前進(jìn)程用戶空間的某個(gè)位置上;并且,如果目標(biāo)映像需要使用共享庫的話,還要(根據(jù)映像頭部所提供的信息)將所需的“解釋器”的映像也映射到用戶空間的某個(gè)位置上,然后在從系統(tǒng)調(diào)用返回用戶空間的時(shí)候就“返回”到解釋器的入口,下面就是解釋器的事了。如果目標(biāo)映像不使用共享庫,那么問題就比較簡單,返回用戶空間的時(shí)候就直接“返回”到目標(biāo)映像

3、的入口?,F(xiàn)代的應(yīng)用軟件一般都要使用共享庫,所以我們把這當(dāng)作常態(tài),而把不使用共享庫的應(yīng)用軟件作為一種簡化了的特例。映像裝入用戶空間的位置有些是固定的、在編譯連接時(shí)就確定好了的;有些則是“浮動(dòng)”的、可以在裝入時(shí)動(dòng)態(tài)決定;具體要看編譯時(shí)是否使用了fPIC選項(xiàng)。一般應(yīng)用軟件主體的映像都是固定地址的,而共享庫映像的裝入地址都是浮動(dòng)的。特別地,解釋器映像的裝入地址也是浮動(dòng)的。2ELF映像的結(jié)構(gòu)每個(gè)操作系統(tǒng)對(duì)于在其內(nèi)核上運(yùn)行的可執(zhí)行程序二進(jìn)制映像都有

4、特定的要求和規(guī)定,包括例如映像的格式,映像在用戶空間的布局(程序段、數(shù)據(jù)段、堆棧段的劃分等等),映像裝入用戶空間的地址是否可以浮動(dòng)、以及如何浮動(dòng),是否支持動(dòng)態(tài)連接、以及如何連接,如何進(jìn)行系統(tǒng)調(diào)用,等等。這些要求和規(guī)定合在一起就構(gòu)成了具體操作系統(tǒng)的“應(yīng)用(軟件)二進(jìn)制界面(ApplicationBinaryInterface)”,縮寫成ABI。顯然,ABI是二進(jìn)制映像的“生產(chǎn)者”即編譯連接工具和使用者即映像裝入啟動(dòng)手段之間的一組約定。而我

5、們一般所說的二進(jìn)制映像格式,實(shí)際上并不僅僅是指字面意義上的、類似于數(shù)據(jù)結(jié)構(gòu)定義那樣的“格式”,還包括了跟映像裝入過程有關(guān)的其它約定。所以,二進(jìn)制映像格式是ABI的主體。目前的LinuxABI是在Unix系統(tǒng)5的時(shí)期(大約在1980年代)發(fā)展起來的,其主體就是ELF,這是“可執(zhí)行映像和連接格式(ExecutableLnkingFmat)”的縮寫。讀者已經(jīng)看到,ELF映像文件的開始是個(gè)ELF頭,這是一個(gè)數(shù)據(jù)結(jié)構(gòu),結(jié)構(gòu)中有個(gè)指針(位移量),指

6、向文件中的一個(gè)“程序頭”數(shù)組(表)。各個(gè)程序頭表項(xiàng)當(dāng)然也是數(shù)據(jù)結(jié)構(gòu),這是對(duì)映像文件中各個(gè)“節(jié)(Segment)”的(結(jié)構(gòu)性)描述。從映像裝入的角度看,一個(gè)映像是由若干個(gè)Segment構(gòu)成的。有些Segment需要被裝入、即被映射到用戶空間,有些則不需要被裝入。在前一篇漫談中讀者已經(jīng)看到,只有類型為PT_LOAD的Segment才需要被裝入。所以,映像裝入的過程只“管”到Segment為止。而從映像的動(dòng)態(tài)連接、重定位(即浮動(dòng))、和啟動(dòng)運(yùn)行

7、的角度看,則映像是由若干個(gè)“段(Section)”構(gòu)成的。我們通常所說映像中的“代碼段”、“數(shù)據(jù)段”等等都是Section。所以,動(dòng)態(tài)連接和啟動(dòng)運(yùn)行的過程所涉及的則是Section。一般而言,一個(gè)Segment可以包含多個(gè)Section。其實(shí),Segment和Section都是從操作處理的角度對(duì)映像的劃分;對(duì)于不同的操作處理,劃分的方式也就可以不同。所以,讀者在后面將會(huì)看到,一個(gè)Segment里面也可以包含幾個(gè)別的Segment,這就是

8、因?yàn)樗鼈兪前床煌牟僮魈幚韯澐值?、不同意義上的Segment。Section也是一樣。●映像的程序入口地址為0x8048750。如前所述,EXEC映像的裝入地址是固定的、不能浮動(dòng)?!癯绦蝾^數(shù)組起點(diǎn)在文件中的位移為52(字節(jié)),而ELF頭的大小正好也是52,所以緊接ELF頭的后面就是程序頭數(shù)組。數(shù)組的大小為6,即映像中有6個(gè)Segment?!馭ection頭的數(shù)組則一直在后面位移位114904的地方,映像中有36個(gè)Section。于是,我

9、們接下去看程序頭數(shù)組:ProgramHeaders:TypeOffsetVirtAddrPhysAddrFileSizMemSizFlgAlignPHDR0x0000340x080480340x080480340x000c00x000c0RE0x4INTERP0x0000f40x080480f40x080480f40x000130x00013R0x1[Requestingprograminterpreter:libldlinux.so.

10、2]LOAD0x0000000x080480000x080480000x011cc0x011ccRE0x1000LOAD0x0011cc0x0804a1cc0x0804a1cc0x001580x00160RW0x1000DYNAMIC0x0011d80x0804a1d80x0804a1d80x000d80x000d8RW0x4NOTE0x0001080x080481080x080481080x000200x00020R0x4一個(gè)程序頭就

11、是關(guān)于一個(gè)Segment的說明,所以這就是6個(gè)Segment。第一個(gè)Segment的類型是PHDR,在文件中的位移為0x34、即52,這就是程序頭數(shù)組本身。其大小為0xc0、即192。前面說每個(gè)程序頭的大小為32字節(jié),而6X32=192。第二個(gè)Segment的類型是INTERP,即“解釋器”的文件路徑名,是個(gè)字符串,這里說是“l(fā)ibldlinux.so.2”。下面是兩個(gè)類型為LOAD的Segment。如前所述,只有這種類型的Segmen

12、t才需要裝入。但是,看一下前者的說明,其起點(diǎn)在文件中的位移是0,大小是0x011cc,顯然是把ELF頭和前兩個(gè)Segment也包含在里面了。再看后者,其起點(diǎn)的位移是0x011cc,所以是和前者連在一起的;其大小為0x158,這樣兩個(gè)Segment合在一起是從0到0x1324。計(jì)算一下就可知道,實(shí)際上是把所有的Segment都包括進(jìn)去了。所以,對(duì)于這個(gè)特定的映像,說是只裝入類型為LOAD的Segment,實(shí)際上裝入的卻是整個(gè)映像。那么,映

13、像中的什么內(nèi)容可以不必裝入呢?例如bss段,那是無初始內(nèi)容的數(shù)據(jù)段,就不用裝入;還有(與動(dòng)態(tài)連接無關(guān)的)符號(hào)表,那也不需要裝入。注意兩個(gè)LOAD類Segment的邊界(Alignment)都是0x1000,即4KB,那正好是存儲(chǔ)頁面的大小。還有個(gè)問題,既然兩個(gè)LOAD類的Segment是連續(xù)的,那為什么不合并成一個(gè)呢?看一下它們的特性標(biāo)志位就可以知道,第一個(gè)Segment的映像是可讀可執(zhí)行、但是不可寫;第二個(gè)則是可讀可寫、但是不可執(zhí)行,

14、這當(dāng)然不能合并。再往下看,下一個(gè)Segment的類型是DYNAMIC,那就是跟動(dòng)態(tài)連接有關(guān)的信息。如上所述,這個(gè)Segment其實(shí)是包含在前一個(gè)Segment中的,所以也會(huì)被裝入。最后一個(gè)Segment的類型是NOTE,那只是注釋、說明一類的信息了。當(dāng)然,跟動(dòng)態(tài)連接有關(guān)的信息是我們最為關(guān)心的,所以我們看一下這個(gè)Segment的具體內(nèi)容:Dynamicsegmentatoffset0x11d8contains22entries:TagTy

溫馨提示

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

評(píng)論

0/150

提交評(píng)論