1. 程式人生 > >第四章 儲存器管理 程式的裝入和連結

第四章 儲存器管理 程式的裝入和連結

一,程式的裝入和連結

1,程式進記憶體的一般過程:

1)編譯compiler:編譯程式:將使用者原始碼編譯成若干個目標模組。

2)連結link:連結程式:將形成的一組目標模組,及它們需要的庫函式連結在一起,形成一個完整的裝入模組。

3)   裝入load:由裝入程式將裝入模組裝入記憶體,構造PCB,形成程序,開始執行(使用實體地址)。

2,地址的概念

1)邏輯地址(相對地址,虛地址)

使用者的程式經過彙編或編譯後形成目的碼,目的碼中的指令地址是相對地址。

一般首地址為0,其餘指令中的地址都相對於首地址來編址。 不能用邏輯地址在記憶體中讀取資訊

2)實體地址(絕對地址,實地址)

記憶體中儲存單元的地址。 實體地址可直接定址被執行。

3)地址對映:

    將使用者程式中的邏輯地址轉換為執行時由機器直接定址的記憶體實體地址的過程。

3,程式裝入中的地址處理

1)絕對裝入方式

編譯程式生成的“目的碼”就是”裝入模組” ,邏輯地址直接從某個地址R處增長,裝入模組直接裝入記憶體地址R處。

邏輯地址  =   實體地址

優點:裝入過程簡單。不需任何地址變換,程式中的邏輯地址與實際記憶體實體地址完全相同。

缺點:過於依賴硬體結構, 只適用早期針對硬體直接程式設計、單道環境下。

2)靜態可重定位裝入

重定位:把目標程式中的指令和資料的邏輯地址變成記憶體中的實體地址的地址變換過程。

地址對映在程式執行之前進行,重定位後實體地址不再改變。

可由專門設計的重定位裝配程式完成(軟):裝入時根據所定位的記憶體地址去修改每個邏輯地址,新增相應偏移量,重定位為實體地址。

優點:不需硬體支援,可以裝入有限的多道程式

缺點:軟體裝入一次完成,一個程式通常需要佔用連續的記憶體空間,程式裝入記憶體後不能移動。也不易實現共享。

3)動態執行時(重定位)裝入方式

實際執行中往往會需要程式在記憶體中的各位置移動,即經常需要重定位到不同的實體地址上。這種執行時移動程式要求地址變換要快速,實現時一般依靠硬體地址變換機構——一個重定位暫存器。 程式裝入記憶體時,可多次重定位到不同位置。且可以不立即把裝入模組中的相對地址轉換為絕對地址,而是把這種地址轉換推遲到程式真正要執行時才進行。

4,不同的程式連結方式

根據連結時間的不同,分成三種:

1)靜態連結:裝入執行前將多個目標模組及所需庫函式連結成一個整體,以後不再拆開。

裝入執行前,生成可執行檔案時進行的。 將多個目標模組及所需庫函式連結成一個整體,以後不再拆開。

2)裝入時動態連結:裝入記憶體時,邊裝入邊連結的連結方式。

由一個目標模組開始裝入,若又涉及外部模組呼叫事件,裝入程式再找出相應的外部目標模組,並將它裝入記憶體,還要修改目標模組中的相對地址。

比靜態連結好在哪裡?

(1) 靜態連結好的程式,修改部分模組後,需重新連結成可裝入程式。動態方式則便於修改和更新。

(2) 便於實現共享。靜態的N個程式都需要一個模組時,需要進行N次拷貝。

3)執行時動態連結:對某些目標模組的連結,在執行中需要該目標模組時,才對它進行連結。

 裝入時動態連結的問題 :許多情況下,事先不知道某應用程式本次執行需要哪些模組,只能全部裝入,裝入時全部連結在一起,效率低。

辦法:有的模組不經常使用就暫時不裝入,執行時用到了再裝入。(如程式總不出錯,就不會用到錯誤處理模組。)即執行時動態連結:執行時,將對某些模組的連結推遲到執行時才連結裝入。

優點:程式執行裝入的內容少了,加快了裝入過程,而且節省大量的記憶體空間。