作業系統10————存儲器管理之程式的裝入和連結
一.目錄
文章目錄
- 作業系統10————存儲器管理之程式的裝入和連結
-
-
- 一.目錄
- 二.程式的運作之前
- 三.程式的裝入
-
- 1. 絕對裝入方式(Absolute Loading Mode)
- 2. 可重定位裝入方式(Relocation Loading Mode)
- 3. 動态運作時的裝入方式(Dynamic Run-time Loading)
- 四.程式的連結
-
- 1. 靜态連結(Static Linking)方式
- 2. 裝入時動态連結(Load-time Dynamic Linking)
- 3. 運作時動态連結(Run-time Dynamic Linking)
- 五.參考資料
-
二.程式的運作之前
使用者程式要在系統中運作,必須先将它裝入記憶體,然後再将其轉變為一個可以執行的程式,通常都要經過以下幾個步驟:
- 編譯,由編譯程式(Compiler)對使用者源程式進行編譯,形成若幹個目标子產品(Object Module);
- 連結,由連結程式(Linker)将編譯後形成的一組目标子產品以及它們所需要的庫函數連結在一起,形成一個完整的裝入子產品(Load Module);
- 裝入,由裝入程式(Loader)将裝入子產品裝入記憶體。

- 邏輯位址(虛位址):CPU所生成的位址
- 實體位址(實位址):記憶體單元所看到的位址
- 邏輯位址空間:由程式所生成的所有邏輯位址的集合
- 實體位址空間:由邏輯位址所對應的所有實體位址的集合
- 位址轉換或重定位:把邏輯位址轉換為實體位址
三.程式的裝入
為了闡述上的友善,我們先介紹一個無需進行連結的單個目标子產品的裝入過程。該目标子產品也就是裝入子產品。在将一個裝入子產品裝入記憶體時,可以有如下三種裝入方式:
1. 絕對裝入方式(Absolute Loading Mode)
當計算機系統很小,且僅能運作單道程式時,完全有可能知道程式将駐留在記憶體的什麼位置。此時可以采用絕對裝入方式。使用者程式經編譯後,将産生絕對位址(即實體位址)的目标代碼。
2. 可重定位裝入方式(Relocation Loading Mode)
絕對裝入方式隻能将目标子產品裝入到記憶體中事先指定的位置,這隻适用于單道程式環境。而在多道程式環境下,編譯程式不可能預知經編譯後所得到的目标子產品應放在記憶體的何處。是以,對于使用者程式編譯所形成的若幹個目标子產品,它們的起始位址通常都是從0開始的,程式中的其它位址也都是相對于起始位址計算的。 是以不能采用絕對裝入的方式,而應采用可重定位的裝入方式。
可重定位裝入方法就是按照記憶體的具體情況,把子產品裝入到記憶體适當位置。此時就會産生邏輯位址和實體位址的不同,将邏輯位址更改為實體位址就是重定位。
3. 動态運作時的裝入方式(Dynamic Run-time Loading)
可重定位裝入方式可将裝入子產品裝入到記憶體中任何允許的位置,故可用于多道程式環境。但該方式并不允許程式運作時在記憶體中移動位置。但是,實際情況是,在運作過程中,它在記憶體中的位置要經常變換,這種情況就應該采用動态運作時的裝入方式。
動态運作時的裝入程式再把裝入子產品裝入記憶體後,并不立即把裝入子產品的邏輯位址轉為實體位址,而是把這種位址轉換推遲到真正執行時才進行。為使位址轉換不影響指令的執行速度,這種方式需要一個重定位寄存器的支援。
四.程式的連結
源程式經過編譯後,可得到一組目标子產品,連結程式的功能是将這組目标子產品以及他所需要的庫函數裝配成一個完整裝入子產品。在對目标子產品進行連結時,根據進行連結時間不同,可把連結分為下面三種。
1. 靜态連結(Static Linking)方式
在程式運作之前,先将各目标子產品及它們所需的庫函數連結成一個完整的裝配子產品,以後不再拆開。在下圖中示出了經過編譯後所得到的三個目标子產品A、B、C,它們的長度分别為L、M和N。在子產品A中有一條語句CALL B,用于調用子產品B。在子產品B中有一條語句CALL C,用于調用子產品C。B和C都屬于外部調用符号,在将這幾個目标子產品裝配成一個裝入子產品時,須解決以下兩個問題:
- 對相對位址進行修改
- 變換外部調用符号。
作業系統10————存儲器管理之程式的裝入和連結作業系統10————存儲器管理之程式的裝入和連結
2. 裝入時動态連結(Load-time Dynamic Linking)
這是指将使用者源程式編譯後所得到的一組目标子產品,在裝入記憶體時,采用邊裝入邊連結的連結方式。即在裝入一個目标子產品時,若發生一個外部子產品調用事件,将引起裝入程式去找出相應的外部目标子產品,并将它裝入記憶體,還要按照圖上圖所示的方式修改目标子產品中的相對位址。裝入時動态連結方式有以下優點:
(1) 便于修改和更新。
(2) 便于實作對目标子產品的共享。
3. 運作時動态連結(Run-time Dynamic Linking)
在許多情況下,應用程式在運作時,每次要運作的子產品可能是不相同的。但由于事先無法知道本次要運作哪些子產品,故隻能是将所有可能要運作到的子產品全部都裝入記憶體,并在裝入時全部連結在一起。顯然這是低效的,因為往往會有部分目标子產品根本就不運作。比較典型的例子是作為錯誤處理用的目标子產品,如果程式在整個運作過程中都不出現錯誤,則顯然就不會用到該子產品。
而運動時動态連結,是對上述連結的改進。即,在執行過程中,當發現一個被調用子產品為裝入記憶體是,立即由OS去找到該子產品,并将之裝入記憶體,并将連結到調用着子產品。凡在執行過程中未被用到的目标子產品,都用會被調入記憶體和被連結到裝入子產品上,這樣不僅能加快程式的裝入過程,也可以節省大量的記憶體空間
五.參考資料
《作業系統第四版》