用戶程序要在系統中運行,必須先將它裝入內存,然后再將其轉變為一個可以執行的程序,通常都要經過以下幾個步驟: (1) 編譯,由編譯程序(Compiler)對用戶源程序進行編譯,形成若干個目標模塊(Object Module); (2) 鏈接,由鏈接程序(Linker)將編譯后形成的一組目標模塊以及它們所需要的庫函數鏈接在一起,形成一個完整的裝入模塊(Load Module); (3) 裝入,由裝入程序(Loader)將裝入模塊裝入內存。
程序的裝入有三種裝入裝入方式:1. 絕對裝入方式(Absolute Loading Mode) 當計算機系統很小,且僅能運行單道程序時,完全有可能知道程序將駐留在內存的什么位置。此時可以采用絕對裝入方式。用戶程序經編譯后,將產生絕對地址(即物理地址)的目標代碼。 在編譯時,知道程序將駐留在內存的什么位置→產生絕對地址的目標代碼→將程序和數據裝入內存。 不需要對程序和數據的地址進行修改,邏輯地址即物理地址。2. 可重定位裝入方式(Relocation Loading Mode) 在多道程序環境下,編譯程序不可能預知經編譯后所得到的目標模塊應放在內存的何處。 對於用戶程序編譯所形成的若干個目標模塊,它們的起始地址通常都是從0開始的,程序中的其它地址也都是相對於起始地址計算的。 采用可重定位裝入方式,它可以根據內存的具體情況將裝入模塊裝入到內存的適當位置。3. 動態運行時的裝入方式(Dynamic Run-time Loading) 可重定位裝入方式並不允許程序運行時在內存中移動位置。然而,實際情況是,在運行過程中它在內存中的位置可能經常要改變,此時就應采用動態運行時裝入的方式。 把地址轉換的工作推遲到程序執行時進行。 裝入后的所有地址都仍是相對地址。 這種方式需要重定位寄存器的支持。
程序的鏈接:
1. 靜態鏈接(Static Linking)方式 在程序運行之前,先將各目標模塊及它們所需的庫函數鏈接成一個完整的裝配模塊,以后不再拆開。將幾個目標模塊裝配成一個裝入模塊時,須解決一下兩個問題: (1) 對相對地址進行修改。 (2) 變換外部調用符號。
2. 裝入時動態鏈接(Load-time Dynamic Linking) 指將用戶源程序編譯后所得到的一組目標模塊,在裝入內存時,采用邊裝入邊鏈接的鏈接方式。即在裝入一個目標模塊時,若發生一個外部模塊調用事件(即裝入系統發現目標模塊中有對其他目標模塊的調用),將引起裝入程序去找出相應的外部目標模塊,並將它裝入內存,還要修改目標模塊中的相對地址。裝入時動態鏈接方式有以下優點:(1) 便於修改和更新:由於各目標模塊是分開存放的,所以要修改或更新各目標模塊是件非常容易的事。 (2) 便於實現對目標模塊的共享:OS很容易將一個目標模塊鏈接到幾個應用模塊上,實現多個應用程序對該模塊的共享。