程序的重定位问题(程序装入)
在多道程序環境下,要使程序運行,必須先為程序創建進程。而創建進程的第一件事就是:將程序和數據裝入內存。如何將一個用戶源程序變成可在內存中執行的程序,通常都要進過幾個步驟:1.編譯:由compiler將源程序編譯成若干個目標模塊(Object Module);2.鏈接:由Linker將編譯后形成的一組目標模塊以及他們所需要的庫函數連接在一起,形成一個完整的裝入模塊(Load Module);3;裝入:由Loader將裝入模塊裝入內存。
程序的裝入方式一本可分為以下3種:
1.絕對裝入方式(Abosolute Loading Mode)
? ? ? ?在編譯時,如果程序知道將駐留在內存的什么位置,那么,編譯程序將產生絕對地址的目標代碼。絕對裝入方式按照裝入模塊中的地址,將程序和數據裝入內存。裝入模塊被裝入內存后,由于程序中的邏輯地址和實際內存地址完全相同,所以不需要對程序和數據的地址進行修改。
2.可重定位裝入方式(Relocation Loading Mode)
? ? ? ?絕對裝入方式能將目標模塊裝入到內存中事先指定的位置。在多道程序環境下,編譯程序不可能預知所編譯的模塊應該放在內存的何處,因此,絕對裝入方式只適用于單道程序環境。在多道程序環境下,所得到的目標模塊起始地址通常從0開始,程序中的其他地址都是相對于起始地址0計算的,此時應該采用可重定位裝入方式,根據內存當時的情況,將裝入模塊裝入到內存的合適位置。
? ? ? ?值得注意的是:在采用重定位裝入方式將程序裝入內存后,會使裝入模塊中的所有邏輯地址和內存的物理地址不同,解決方法是:在裝入的時候,將裝入模塊中指令和數據的邏輯地址修改為物理地址,這一過程就叫重定位。又因為地址變換是在裝入時一次性完成的,以后不會再改變,所以稱為靜態重定位。
3.動態運行時裝入方式(Dynamic Run-time Loading)
? ? ? ? 靜態重定位方式可將裝入模塊裝入到內存中任何允許的位置,所以可以用于多道程序環境;但是這種裝入方式并不允許程序運行時在內存中移動位置。因為程序一旦移動的話,就必須修改程序和數據的絕對地址。然而,實際情況是,程序在運行的過程中在內存的位置可能經常要改變,此時就應該采用動態重定位的方式。 ? ? ? ? 動態重定位的裝入程序在把模塊裝入內存后,并不會立即把模塊中的相對地址轉換為物理地址,而是把這種地址轉換推遲到程序真正要執行時才進行。因此,裝入內存后的所有地址仍然是相對地址,為了使地址轉換不影響指令的執行速度,這種方式需要一個重定位寄存器來存儲模塊在內存中的起始地址。總結
以上是生活随笔為你收集整理的程序的重定位问题(程序装入)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内存管理详解
- 下一篇: 可执行程序加载到内存的过程