程式的重定位問題(程式裝入)

2022-07-21 12:15:16 字數 901 閱讀 7719

摘自csdn部落格

原文  

程式的裝入方式一般可分為以下3種:

在編譯時,如果程式知道將駐留在記憶體的什麼位置,那麼,編譯程式將產生絕對位址的目標**。絕對裝入方式按照裝入模組中的位址,將程式和資料裝入記憶體。裝入模組被裝入記憶體後,由於程式中的邏輯位址和實際記憶體位址完全相同,所以不需要對程式和資料的位址進行修改。

絕對裝入方式能將目標模組裝入到記憶體中事先指定的位置。在多道程式環境下,編譯程式不可能預知所編譯的模組應該放在記憶體的何處,因此, 絕對裝入方式只適用於單道程式環境。 在多道程式環境下,所得到的目標模組起始位址通常從0開始,程式中的其他位址都是相對於起始位址0計算的,此時應該採用可重定位裝入方式,根據記憶體當時的情況,將裝入模組裝入到記憶體的合適位置。

值得注意的是:在採用重定位裝入方式將程式裝入記憶體後,會使裝入模組中的所有邏輯位址和記憶體的實體地址不同,解決方法是:在裝入的時候,將裝入模組中指令和資料的邏輯位址修改為實體地址,這一過程就叫重定位。又因為位址變換是在裝入時一次性完成的,以後不會再改變,所以稱為靜態重定位

靜態重定位方式可將裝入模組裝入到記憶體中任何允許的位置,所以可以用於多道程式環境;但是這種裝入方式並不允許程式執行時在記憶體中移動位置 。因為程式一旦移動的話,就必須修改程式和資料的絕對位址。然而,實際情況是,程式在執行的過程中在記憶體的位置可能經常要改變,此時就應該採用動態重定位的方式。

動態重定位的裝入程式在把模組裝入記憶體後,並不會立即把模組中的相對位址轉換為實體地址,而是把這種位址轉換推遲到程式真正要執行時才進行。因此,裝入記憶體後的所有位址仍然是相對位址,為了使位址轉換不影響指令的執行速度,這種方式需要乙個重定位暫存器來儲存模組在記憶體中的起始位址

程式的鏈結與裝入(動 靜態重定位)

多道程式環境下,程式是併發執行的,所以要使程式執行,必須先為之建立程序,而建立程序的第一件事就是將程式和資料裝入記憶體 源程式經過編譯後,得到一組目標模組,再利用 鏈結程式 將這組目標模組鏈結起來,形成乙個完整的裝入模組 即可執行檔案 相對位址進行修改 變化以後還是相對位址 位址都變為相對最上層模組...

程式的鏈結與裝入(動 靜態重定位)

多道程式環境下,程式是併發執行的,所以要使程式執行,必須先為之建立程序,而建立程序的第一件事就是將程式和資料裝入記憶體 即 源程式經過編譯後,得到一組目標模組,再利用 鏈結程式 將這組目標模組鏈結起來,形成乙個完整的裝入模組 即可執行檔案 相對位址進行修改 變化以後還是相對位址 位址都變為相對最上層...

程式的裝入和鏈結

編譯 鏈結 裝入 編譯 預處理 編譯 優化 彙編 靜態鏈結 動態鏈結 1 靜態鏈結 2 裝入時動態鏈結 3 執行時動態鏈結 裝入 靜態裝入 動態裝入 1 絕對裝入方式 這種方式在編譯的時候就會產生絕對位址 程式中的邏輯位址就是實際的實體地址 在裝入的時候不需要對位址和資料進行修改。缺點 只能將目標模...