© 2007 台台台台台台台台 (Pearson Education Taiwan) 台 台 3 3 台 台台台台台台台 台 台台台台台台台
Jan 25, 2016
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
第第 33 章 載入器和連結器章 載入器和連結器
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
載入( loading ):將目的程式置入記憶體中以便執行。
重定址( relocation ):調整目的程式,以便在不同的位址上,重新載入目的程式(參見第 2.2.2 節)。
連結( linking ):將兩個或多個目的程式合併在一起,並且提供目的程式之間相互參考的資訊(參見第 2.3.5 節)。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
3.1.1 節討論「絕對載入器」( absolute loader )
3.1.2 節介紹用於 SIC/XE 的簡易「絕對載入器」的範例
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
不需要執行連結和重定址的功能 首先測試表頭記錄,來驗證是否載入正確的程
式(並且有足夠的記憶體) 當讀取每一筆「文字記錄」( Text record )
時,會將該記錄中的目的碼移到所指定的記憶體位址上
當讀取到「結束記錄」( End record )時,載入器將會跳到所示之位址,並且開始執行所載入的程式。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
「啟動載入器」會載入電腦首先必須執行的程式,通常就是作業系統
圖 3.3 展示「啟動載入器」的原始碼。開機的起始運作位址是在機器之記憶體的位址 0處,而作業系統的載入位址是始於位址 80 處。
「啟動程式」( bootstrap )的主要迴圈會將下一個載入位址存放在 X 暫存器中
GETC 則是從 F1 裝置讀入和轉換一對字元
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
3.2.1 節將討論不同的實作技術和使用的情境 3.2.2 節是從載入器的觀點,來觀察「程式連
結」 3.2.3 節將討論一個典型連結載入器(和重定
址)的資料結構
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
可以為程式重新定址的載入器,稱之為「重定址載入器」或「相對載入器」
使用修正記錄來描述當程式進行重定址時,其目的碼所需修改的部份
在組譯後的程式中,只有第 15 、 35 和 65行的延伸格式指令包含實際位址。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
重定址位元匯集起來形成的「位元遮罩」( bit mask ),是跟隨在文字記錄裡的「長度指示」( length indicator )之後。
有些電腦提供「硬體重定址」( hardware relocation )的功能,以減輕載入器在執行重定址上的一些工作負擔。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
程式之間外部引用( external reference ) 重定址與連結之間的關係 在第一個程式( PROGA )中, REF1 僅僅是
引用到程式中的一個標籤( label )。 REF2 引用標記的處理方式也是類似。 REF3 是一個立即運算元( immediate
operand ),其值是 ENDA 和 LISTA 的差
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
採用修正記錄( Modification records )來處理重定址,以使連結和重定址的功能皆是運用相同的機制。
連結載入器的主要資料結構是一個 ESTAB 的外部符號表,用於儲存控制段之外部符號的名稱和位址。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
控制區段 符號名稱 位址 長度
PROGA LISTAENDA
400040404054
0063
PROGB LISTBENDB
406340C340D3
007F
PROGC LISTCENDC
40E241124124
0051
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
3.3.1 節將討論外部引用之「自動化函式庫」( automatic library )的搜尋程序
3.3.2 節展示一些載入和連結時的共同選項
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
許多連結載入器可以自動地將「副程式函式庫」( subroutine library )中的程式,合併到載入的程式當中。
支援「自動函式庫搜尋」的連結載入器必須在其輸入檔案中,追蹤並未定義的外部符號
一個簡單的方式,是將「引用記錄」( Refer record )中並未出現於符號表的符號,登錄到符號表( ESTAB )中,並註記這些是尚未定義的符號。當遇到其定義時,則在符號表中填入該符號的位址。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
在一些系統上,「工作控制語言」( job control language )的選項是由作業系統來處理。
INCLUDE program-name(library-name) 指示載入器從函式庫中讀取所選定的目的程式
DELETE csect-name 可以指示載入器,由載入的程式中刪除特定名稱的控制區段。
CHANGE name 1, name2 可以將目的程式中的外部符號,由 name1更改為 name2 。
LIBRARY MYLIB 通常在「標準系統函式庫」之前,會進行此類「使用者指定
的函式庫」的搜尋。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
3.4.1 節將討論「連結編輯器」,它在許多電腦系統中可以取代或結合「連結載入器」。
3.4.2 節介紹「動態連結」,它是運用於首次呼叫副程式時,利用作業系統的機制來載入和連結副程式。
3.4.3 節將討論「開機載入器」
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
執行所有的連結和重定址的動作,包含自動函式庫的搜尋(如有指定),和載入已連結的程式到記憶體中以供執行。
如果一個程式需要執行許多次,而不想每次都重新組譯時,使用「連結編輯器」可以降低所需進行的工作。
假如事前可以知道程式之載入的實際位址,「連結編輯器」就可以執行所有的重定址動作。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
INCLUDE PLANNER(PROGLIB) DELETE PROJECT {DELETE 從現行的
PLANNER} INCLUDE PROJECT(NEWLIB) {INCLUDE 新版
本 ) REPLACE PLANNER(PROGLIB)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
INCLUDE READR(FTNLIB) INCLUDE WRITER(FTNLIB) INCLUDE BLOCK(FTNLIB) INCLUDE DEBLOCK (FTNLIB) INCLUDE ENCODE(FTNLIB) INCLUDE DECODE(FTNLIB) . . . SAVE FTNIO(SUBLIB)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
動態連結( dynamic linking )、動態載入( dynamic loading )或呼叫時載入( load on call ) 延遲連結的功能,直到執行時間的方法:當副程
式首次被呼叫時,才載入並且完成連結。 通常用於多個程式共享同一個副程式或函式庫
的時候 在物件導向的系統中,動態連結經常用於引用
一些軟體的物件。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
當第一次載入程式時,可以明確指定絕對位址。通常這個程式是作業系統,它將佔用記憶體中的特定位址。
絕對載入器」是永遠常駐在唯讀記憶體裡( ROM )中。
利用一個內建的硬體機制(或一個非常短的ROM 程式),讀取一些設備上固定長度的記錄,將其置於記憶體的固定位置。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
3.5.1 MS-DOS連結器 3.5.2 SunOS連結器 3.5.3 Cray MPP連結器
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
大部分MS-DOS 的編譯器( compiler )和組譯器(包含 MASM )可以產生目的模組,它是不可執行的機器語言程式。
MS-DOS LINK 是一種「連結編輯器」,它可以結合一個或多個目的模組,以產生一個的完整可執行程式。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
THEADR 記錄可以指出目的模組的名稱 PUBDFF 記錄包含了一些定義於此目的模組
之外部符號的列表 SEGDEF 記錄描述目的模組中的一些區段 LEDATA 記錄包含了由原始程式所轉譯的指令
和資料 FIXUPP 記錄是用於解決外部引用
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
第一階段所建構的符號表中,每個區段(使用LNAMES 、 SEGDEF 和 GRPDEF 記錄)和每個外部符號(使用 EXTDKF 和 PUBDEF 記錄)都會有一個對應的位址。
在第二階段中, LINK 會由目的模組中取出已轉譯的指令和資料,並在記憶體中建構一個可執行程式的影像檔。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
二種不同的連結器 「連結編譯器」( link-editor )
編譯一個程式,將一個或多個組譯器和編譯器所產生的目的模組,組合形成一個輸出模組
「執行時間連結器」( run-time linker ) 可以在執行時,繫結動態的可執行程式,並且分享物件。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
1. 重定址的目的模組( relocatable object module):可供進ㄧ步的連結編譯處理。
2. 靜態可執行的模組( static executable module):所有符號引用皆已繫結( bound ),並準備執行。
3. 動態可執行的模組( dynamic executable module ):在執行時有些符號引用尚需要繫結。
4. 分享物件( shared object ):在執行時可以提供服務,以繫結一個或多個動態可執行的模組。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
連結器可以決定動態可執行程式所需的分享物件,並且確保這些物件都會引入進來。此外也檢查那些分享物件,以偵測和處理其它分享物件上之任何額外的相依關係
程序呼叫( procedure call )的繫結通常是延遲到程式執行之時。在連結編輯期間,全域程序的呼叫將轉換成程序連結表的引用。
「懶惰的繫結」( lazy/binding )
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
一個 T3E 系統中包含了大量的處理元件( PEs )。
每一個 PE 皆有其所屬的本地記憶體。此外,任何一個 PE都可以存取所有其他 PEs 的記憶體(有時候稱之為遠端記憶體)。
一個 T3E 系統通常會為ㄧ個應用程式分配數個 PEs ,稱之為一個分割( partition )
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
假設程式中包含一個迴圈,以處理陣列中的 256 個元素。 PE0可以執行此迴圈的中註標( subscript )為 1 到 16 的部份, PE1 可以執行迴圈中註標為 17 到 32 的部份,以此類推。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)
當載入一個程式後,每個 PE 會取得一份程式的可執行碼、私有資料和部分的分享資料。
MPP 連結器會根據目的程式,將程式碼或資料區塊組織成為一些列表。
每個列表中的區塊都會集合在一起,並且分配給每個區塊一個位址,以及執行重定址和連結的動作。
© 2007 台灣培生教育出版 (Pearson Education Taiwan)