ics13班第九周小班課_第1頁
ics13班第九周小班課_第2頁
ics13班第九周小班課_第3頁
ics13班第九周小班課_第4頁
ics13班第九周小班課_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Linking & ECF I1600012967 石宇堃編譯系統(tǒng)鏈接必須完成兩個(gè)主要任務(wù)1.符號(hào)解析目標(biāo)文件定義和引用符號(hào)。符號(hào)解析的目的是將每個(gè)符號(hào)引用剛好和一個(gè)符號(hào)定義聯(lián)系起來。(這里的符號(hào)包括變量名和函數(shù)名)2.重定位鏈接器通過把每個(gè)符號(hào)定義和一個(gè)存儲(chǔ)器位置聯(lián)系起來,然后修改所有對(duì)這些符號(hào)的引用,使得它們指向這個(gè)存儲(chǔ)器位置,從而重定位這些節(jié)。目標(biāo)文件(ELF)三種ELF文件形式:1.可重定位目標(biāo)文件:包含二進(jìn)制代碼和數(shù)據(jù),其可以在編譯時(shí)與其他可重定位目標(biāo)文件合并起來,組成一個(gè)可執(zhí)行二進(jìn)制文件。2.可執(zhí)行目標(biāo)文件:包含二進(jìn)制代碼和數(shù)據(jù),可以被直接拷貝到存儲(chǔ)器中執(zhí)行。3.共享目標(biāo)文件:特殊

2、類型的可重定位目標(biāo)文件,可以在加載或運(yùn)行時(shí)被動(dòng)態(tài)地加載到存儲(chǔ)器,并鏈接??芍囟ㄎ荒繕?biāo)文件.text,已編譯的機(jī)器代碼。.rodata,read only data,只讀數(shù)據(jù).data,已初始化的全局C變量.bss,未初始化的全局C變量。這個(gè)節(jié)不占據(jù)實(shí)際的磁盤空間。.symtab,符號(hào)表.rel.text,一個(gè).text節(jié)中位置的列表,一般調(diào)用外部函數(shù)和使用全變量的指令需要修改。(可執(zhí)行文件通常省略).rel.data,被模塊引用或定義的任何全局變量的重定位信息。.debug,調(diào)試符號(hào)表。.line,原始C源程序行號(hào)和.text節(jié)機(jī)器指令之間的映射關(guān)系。要求-編譯.strtab,一個(gè)字符串表,每

3、個(gè)字符串以null結(jié)尾。包括.symta和.debug中的符號(hào)表,節(jié)頭部中的節(jié)名字。符號(hào)和符號(hào)表每個(gè)可重定位目標(biāo)模塊m都有一個(gè)符號(hào)表(. symtab)由m定義并能被其他模塊引用的全局符號(hào)。對(duì)應(yīng):非靜態(tài)的C函數(shù)以及非靜態(tài)的C全局變量。只被m定義和引用的本地符號(hào)。對(duì)應(yīng):帶static的C函數(shù)和static全局變量。以及static局部變量。由其他模塊定義,并被m引用的全局符號(hào),稱為外部符號(hào)。對(duì)應(yīng):定義在其他模塊中的C函數(shù)和變量。在函數(shù)內(nèi)部定義的static變量,不在棧中管理。而是在.data和.bss中為每個(gè)定義分配空間,并且在.symtab中創(chuàng)建一個(gè)名字唯一的本地符號(hào)。符號(hào)解析符號(hào)解析是鏈接的

4、兩個(gè)主要任務(wù)之一,方法是將每個(gè)引用和一個(gè)確切的定義聯(lián)系起來。那么如果多個(gè)目標(biāo)文件同時(shí)定義了相同的符號(hào)怎么辦哩?1.強(qiáng)、弱符號(hào)強(qiáng)符號(hào):函數(shù)和已初始化的全局變量。弱符號(hào):未初始化的全局變量。2. Unix鏈接器使用如下規(guī)則來處理多重定義的符號(hào):不允許有多個(gè)強(qiáng)符號(hào)一個(gè)強(qiáng)符號(hào),多個(gè)弱符號(hào),選強(qiáng)符號(hào)只有多個(gè)弱符號(hào),隨便選一個(gè)重定位重定位由兩步組成1.重定位節(jié)和符號(hào)定義這一步鏈接器將所有相同類型的節(jié)合并為同一類型的新的聚合節(jié)。例如來自輸入模塊的.data節(jié)全部被合并成一個(gè)節(jié),這個(gè)節(jié)成為輸出的可執(zhí)行目標(biāo)文件中的.data節(jié)。這一步完成時(shí),程序中的每一個(gè)指令和全局變量都有唯一的運(yùn)行時(shí)存儲(chǔ)器地址了。2.重定位節(jié)

5、中的符號(hào)引用鏈接器修改代碼節(jié)和數(shù)據(jù)節(jié)中對(duì)每個(gè)符號(hào)的引用,使它們指向正確的運(yùn)行時(shí)地址。這一步依賴于代碼和數(shù)據(jù)的重定位條目。.rel.text和.rel.data節(jié)。前者存放代碼的重定位條目,后者存放已初始化數(shù)據(jù)的重定位條目。重定位重定位PC相對(duì)引用、重定位絕對(duì)引用可執(zhí)行文件靜態(tài)鏈接E(Elocatable):可重定位對(duì)象文件的集合。U(Unresolved):未解析符號(hào)的集合(例如被引用,但是還未找到定義的符號(hào))。D(Defined):在之前輸入文件中已定義的符號(hào)。鏈接器按照輸入文件在driver的參數(shù)列表中出現(xiàn)的順序,從左向右,依次掃描每個(gè)可重定位對(duì)象文件或靜態(tài)鏈接庫archive。靜態(tài)鏈接過

6、程如下:1.若輸入文件f是對(duì)象文件,則將f加入E,并將f中的符號(hào)引用和定義分別更新到U和D。2.若輸入文件f是鏈接庫,則嘗試將f中各個(gè).o定義的符號(hào)與U中未解析的符號(hào)匹配。如果m.o中的符號(hào)能匹配上U中的某個(gè)符號(hào),則將m加入E,并更新U和D。未匹配U中任何符號(hào)的.o直接被丟棄。3.若最終U不為空,則鏈接器報(bào)錯(cuò)。否則合并E中的所有.o生成可執(zhí)行文件。動(dòng)態(tài)鏈接靜態(tài)鏈接雖然實(shí)現(xiàn)了標(biāo)準(zhǔn)庫函數(shù)與編譯器解耦、只拷貝被引用的代碼以節(jié)省空間這兩個(gè)問題,但它卻有兩個(gè)重要的缺點(diǎn):1.每次靜態(tài)鏈接庫修改,都要重新鏈接生成可執(zhí)行文件;2.盡管只包含了應(yīng)用程序引用的函數(shù),但像printf這種最常用的標(biāo)準(zhǔn)庫函數(shù)若不能共享

7、,那么每個(gè)程序的進(jìn)程中都會(huì)包含一份printf的代碼,還是極大的浪費(fèi)了硬盤和內(nèi)存資源。動(dòng)態(tài)鏈接庫能在以下兩方面實(shí)現(xiàn)“共享”,針對(duì)的就是靜態(tài)鏈接的兩個(gè)缺陷:1.對(duì)于一個(gè)特定的函數(shù)庫,文件系統(tǒng)中只有對(duì)應(yīng)的一份.so文件,而不會(huì)拷貝或嵌入到任何引用它的應(yīng)用程序的可執(zhí)行文件中。2.對(duì)于一個(gè)特定的函數(shù)庫,拷貝到內(nèi)存中的.text section也同樣只有一份,并且能被不同的進(jìn)程共享。.so中的代碼和數(shù)據(jù)不會(huì)被拷貝到可執(zhí)行文件中,而是拷貝一些使libvector.so中的代碼和數(shù)據(jù)在運(yùn)行時(shí)能被正確解析的重定位和符號(hào)表信息。加載時(shí)鏈接運(yùn)行時(shí)鏈接位置無關(guān)代碼實(shí)現(xiàn)多個(gè)進(jìn)程共享內(nèi)存中相同的代碼的方法。利用了一個(gè)事

8、實(shí):一個(gè)目標(biāo)模塊在代碼任意位置時(shí),數(shù)據(jù)段和代碼段距離是一個(gè)運(yùn)行時(shí)常量。全局偏移量表GOT 和 過程鏈接表PLTGOT:每個(gè)元素在加載時(shí)會(huì)進(jìn)行重定位,使其包含正確的地址PLT:每個(gè)元素是一條代碼延遲綁定:把函數(shù)地址的解析推遲到實(shí)際被調(diào)用的地方。打樁打樁實(shí)際上就是用自己編寫的函數(shù)來替換本來調(diào)用的函數(shù)達(dá)到調(diào)試代碼等目地。編譯時(shí)打樁:-I參數(shù)告訴編譯器優(yōu)先在當(dāng)前目錄查找默認(rèn)目錄前優(yōu)先在當(dāng)前目錄查找malloc.c 此時(shí)已對(duì)malloc.c進(jìn)行了修改(需要訪問程序源代碼)鏈接時(shí)打樁:-Wl fun 告訴鏈接器對(duì) fun 的引用解析成 _wrap_fun, 對(duì)_real_fun的引用解 析成fun(需要訪

9、問程序的可重定位對(duì)象文件)運(yùn)行時(shí)打樁:基于動(dòng)態(tài)鏈接器LD_PRELOAD環(huán)境變量。加載和實(shí)行時(shí)解析未定義引用時(shí)優(yōu) 先在LD_PRELOAD庫搜索。異常定義和場(chǎng)景現(xiàn)代系統(tǒng)通過使控制流發(fā)生突變來對(duì)這些情況做出反應(yīng)。異常發(fā)生在計(jì)算機(jī)系統(tǒng)的各個(gè)層次,比如:硬件層,硬件檢測(cè)到的事件會(huì)出發(fā)控制突然轉(zhuǎn)移到異常處理程序。操作系統(tǒng)層,內(nèi)核通過上下文轉(zhuǎn)換將控制從一個(gè)用戶進(jìn)程轉(zhuǎn)移到另一個(gè)用戶進(jìn)程。應(yīng)用層,一個(gè)進(jìn)程可以發(fā)送信號(hào)到另一個(gè)進(jìn)程,信號(hào)接收者會(huì)將控制突然轉(zhuǎn)移到它的一個(gè)信號(hào)處理程序。應(yīng)用程序通過陷阱(trap)或者系統(tǒng)調(diào)用(system call)的ECF形式,向操作系統(tǒng)請(qǐng)求服務(wù)。異常的執(zhí)行異常處理程序在執(zhí)行結(jié)

10、束后,會(huì)發(fā)生以下三種情況之一:1. 返回應(yīng)用程序當(dāng)前指令I(lǐng)curr2. 返回應(yīng)用程序的下一條指令I(lǐng)next3. 異常處理程序終止被中斷的應(yīng)用程序異常的處理1.系統(tǒng)中的美中類型異常都分配了一個(gè)唯一的非負(fù)整數(shù),作為異常號(hào)。系統(tǒng)啟動(dòng)時(shí)會(huì)初始化一張異常表,異常表的起始地址存在一個(gè)特殊的CPU寄存器里,異常表基址寄存器。2.異常處理程序運(yùn)行在內(nèi)核模式,這意味著它們對(duì)所有的系統(tǒng)資源都有完全的訪問權(quán)限。3.中斷是異步的,不由任何一條指令造成。其他三種異常是同步的,是執(zhí)行當(dāng)前指令的結(jié)果。中斷來自處理器外部I/O設(shè)備的信號(hào)的結(jié)果。硬件中斷不是由任何一條專門的指令造成的。I/O設(shè)備通過向處理器芯片上的一個(gè)引腳發(fā)信

11、號(hào),并將異常號(hào)放到系統(tǒng)總線上,以觸發(fā)中斷,這個(gè)異常號(hào)標(biāo)識(shí)了引起中斷的設(shè)備。陷阱和系統(tǒng)調(diào)用1.陷阱是有意的異常,是執(zhí)行一條指令的結(jié)果。最重要的用途是在用戶程序和內(nèi)核之間提供一個(gè)接口,稱為系統(tǒng)調(diào)用。2.從程序員角度,系統(tǒng)調(diào)用和普通函數(shù)調(diào)用是一樣的,然而它們的實(shí)現(xiàn)不同。普通函數(shù)運(yùn)行在用戶模式,用戶模式限制了函數(shù)可以執(zhí)行的指令類型,而且它們只能訪問與調(diào)用函數(shù)相同的棧。系統(tǒng)調(diào)用運(yùn)行在內(nèi)核模式,內(nèi)核模式允許系統(tǒng)調(diào)用執(zhí)行指令,并訪問定義在內(nèi)核中的棧。故障1.故障時(shí)由于指令執(zhí)行發(fā)生了錯(cuò)誤。這個(gè)錯(cuò)誤可能被修復(fù),若處理程序修復(fù)了,則返回重新執(zhí)行這條指令,否則返回到內(nèi)核中的abort例程(當(dāng)做內(nèi)核對(duì)外提供的一個(gè)服務(wù)

12、即可),abort例程會(huì)終止引起該故障的應(yīng)用程序。2.一個(gè)經(jīng)典的故障是缺頁異常,當(dāng)指令引用一個(gè)虛擬地址,而該虛擬地址相對(duì)應(yīng)的物理頁面不在存儲(chǔ)器(包含緩存,主存等)中,因此必須從磁盤中取時(shí),就會(huì)發(fā)生故障。當(dāng)缺頁處理程序加載好后,就將控制返回給應(yīng)用程序。此時(shí)原指令再次執(zhí)行,由于相應(yīng)頁面已經(jīng)被加載到存儲(chǔ)器中,因此此次執(zhí)行不會(huì)引起故障。終止終止時(shí)由于不可恢復(fù)的致命錯(cuò)誤造成的結(jié)果。通常是一些硬件錯(cuò)誤。終止處理程序直接將控制返回給abort例程,abort例程去終止這個(gè)應(yīng)用程序。系統(tǒng)調(diào)用系統(tǒng)調(diào)用是異常的一種,屬于陷阱,有意的異常。IA32系統(tǒng)上,系統(tǒng)調(diào)用通過一條稱為int n的陷阱指令來提供。Linux提

13、供上百種系統(tǒng)調(diào)用。每個(gè)系統(tǒng)調(diào)用都有一個(gè)唯一的整數(shù)號(hào),對(duì)應(yīng)于一個(gè)到內(nèi)核中跳轉(zhuǎn)表的偏移量。進(jìn)程1.進(jìn)程是一個(gè)執(zhí)行中的程序的實(shí)例。系統(tǒng)中的每個(gè)程序都是運(yùn)行在某個(gè)進(jìn)程的上下文中。上下文由程序正確運(yùn)行所需的狀態(tài)組成。這個(gè)狀態(tài)包括,存放在存儲(chǔ)器中的代碼和數(shù)據(jù),它的棧,通用目的寄存器內(nèi)容,程序計(jì)數(shù)器,環(huán)境變量,以及打開文件描述符的集合。2.每次用戶向shell運(yùn)行一個(gè)可執(zhí)行目標(biāo)文件,shell會(huì)創(chuàng)建一個(gè)新的進(jìn)程,然后再這個(gè)新進(jìn)程的上下文中運(yùn)行這個(gè)程序。應(yīng)用程序也可以自己創(chuàng)建進(jìn)程,并在創(chuàng)建的新進(jìn)程中運(yùn)行自己的代碼或其他應(yīng)用程序。3. 進(jìn)程為每個(gè)應(yīng)用程序提供一個(gè)假象,好像它獨(dú)占地使用系統(tǒng)地址空間。一般而言,和這

14、個(gè)進(jìn)程地址空間中的某個(gè)地址相關(guān)聯(lián)的存儲(chǔ)器字節(jié),是不能被其他進(jìn)程讀寫的。從這個(gè)意義上說,這個(gè)地址空間是私有的。4.地址空間的頂部是保留給內(nèi)核的。這個(gè)部分包含內(nèi)核的代碼、數(shù)據(jù)、堆、棧等。上下文切換1.發(fā)生時(shí)機(jī)當(dāng)程序切換到內(nèi)核模式執(zhí)行系統(tǒng)調(diào)用時(shí),可能發(fā)生。如果系統(tǒng)調(diào)用因?yàn)槟硞€(gè)等待的時(shí)間發(fā)生而阻塞,那么內(nèi)核可以讓當(dāng)前進(jìn)程休眠,切換到另一個(gè)進(jìn)程。比如,一個(gè)read系統(tǒng)調(diào)用請(qǐng)求一個(gè)磁盤訪問,內(nèi)核可以選擇執(zhí)行上下文切換,運(yùn)行另一個(gè)進(jìn)程,而不是等待數(shù)據(jù)從磁盤到達(dá)。另一個(gè)示例是sleep系統(tǒng)調(diào)用,它顯式的請(qǐng)求讓調(diào)用進(jìn)程休眠。2.中斷也可能引發(fā)上下文切換。每次發(fā)生定時(shí)器中斷時(shí),內(nèi)核就判定當(dāng)前進(jìn)程已經(jīng)運(yùn)行了足夠長(zhǎng)的

15、時(shí)間,并切換到一個(gè)新的進(jìn)程。并發(fā)并發(fā)不等于并行, 不同CPU上的并發(fā)進(jìn)程才是并行。A & C, A & B 是并發(fā)B & C 不是進(jìn)程控制進(jìn)程ID1.每個(gè)進(jìn)程都有一個(gè)唯一的正數(shù)ID,稱為PID。2.可以用getpid()來獲取。getppid()可以返回它父進(jìn)程的PID。創(chuàng)建、終止進(jìn)程。1.相同、獨(dú)立的地址空間。子進(jìn)程得到與父進(jìn)程用戶級(jí)虛擬地址空間相同,但是獨(dú)立的一份拷貝。包括文本、數(shù)據(jù)和bss段、堆以及用戶棧。對(duì)比一下第七章講的進(jìn)程存儲(chǔ)2.子進(jìn)程還獲得和父進(jìn)程任何打開的文件描述符相同的拷貝。這就意味著調(diào)用fork后,子進(jìn)程可以讀寫fork之前父進(jìn)程打開的任何文件。3.阻塞,進(jìn)程的執(zhí)行被暫時(shí)掛起(suspend)。當(dāng)收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU信號(hào)時(shí),進(jìn)程就會(huì)阻塞掛起,直到它收到一個(gè)SIGCONT信號(hào)才會(huì)繼續(xù)。信號(hào)是一種軟件中斷的形式。4.終止,進(jìn)程永遠(yuǎn)停止。進(jìn)程會(huì)因?yàn)槿N原因終止:1.收到一個(gè)信號(hào),信號(hào)的默認(rèn)行為是終止進(jìn)程。(比如: kill -9)2.從主程序(main)返回3.調(diào)用exit函數(shù)。exit函數(shù)以status退出狀態(tài)來終止進(jìn)程(另一種設(shè)置退出狀態(tài)的是從主程序返回一個(gè)數(shù)值進(jìn)程控制創(chuàng)建進(jìn)程 fork()調(diào)用一次 返回兩次 (父進(jìn)程返回子進(jìn)程pi

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲(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)論