在多道程序環境下,要使程序運行,必須先為程序創建進程。而創建進程的第一件事就是:將 程序和數據 裝入內存。如何將一個用戶源程序變成可在內存中執行的程序,通常都要進過幾個步驟: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)
靜態重定位方式可將裝入模塊裝入到內存中任何允許的位置,所以可以用於多道程序環境;但是這種裝入方式並 不允許程序運行時在內存中移動位置 。 因為程序一旦移動的話,就必須修改程序和數據的絕對地址。然而,實際情況是,程序在運行的過程中在內存的位置可能經常要改變,此時就應該采用 動態重定位 的方式。
動態重定位的裝入程序在把模塊裝入內存后,並不會立即把模塊中的相對地址轉換為物理地址,而是 把這種地址轉換推遲到程序真正要執行時才進行 。因此,裝入內存后的所有地址仍然是相對地址,為了使地址轉換不影響指令的執行速度,這種方式需要一個 重定位寄存器來存儲模塊在內存中的起始地址 。