原由:
多道程序環境下,程序是並發執行的,所以要使程序運行,必須先為之創建進程,而創建進程的第一件事就是將程序和數據裝入內存

目的:

用戶程序到內存可執行程序的步驟:

即

下面開始將程序“鏈接”和“裝入”的具體情況:
程序的鏈接:
源程序經過編譯后,得到一組目標模塊,再利用“鏈接程序”將這組目標模塊鏈接起來,形成一個完整的裝入模塊(即可執行文件)
如下圖:源程序編譯后得到三個目標模塊A、B、C,長度分別為L、M、N,鏈接后形成右側的裝入模塊:

鏈接時需要做兩個工作:
Ø 相對地址進行修改(變化以后還是相對地址),地址都變為相對最上層模塊的起始地址來計算。
Ø 變化外部調用符號,如CALL B------> JSR“L”
CALL B為調用B模塊,JSR“L”為跳轉到L行
鏈接前A和B為兩個不同的模塊,在A模塊中想執行B模塊,要使用調用(CALL)語句;鏈接后A和B為同一模塊,若想達到同樣地效果,只需在本模塊中使用跳轉語句(JSR)跳轉到想執行的地方即可。
程序的裝入:
即將鏈接好的模塊裝入內存
邏輯地址與物理地址
用戶程序編譯為目標模塊后,會對每個模塊內部(程序數據等)進行編址,此時編好的地址叫做邏輯地址或相對地址(下面的絕對裝入方式除外),都是相對於本模塊的起始地址(一般從0開始)計算的。進行鏈接后某些模塊的相對地址會發生變化,地址都變為相對於裝入模塊的起始地址進行計算。
通常將內存的實際地址稱為物理地址
![]()

分類
Ø 絕對裝入方式
Ø 可重定位裝入方式(靜態重定位)
Ø 動態運行時裝入方式(動態重定位)
解析
(1)絕對裝入方式
程序編譯時,如果知道程序將駐留在內存的什么位置(起始地址),那么編譯生成的目標代碼,將采用絕地地址進行編址,即起始地址不從0開始,從上面所知的內存起始地址開始編址。
例如:事先已知用戶程序(進程)駐留在從1000號單元處開始的位置,則編譯程序所產生的目標模塊(即裝入模塊)便從1000處開始向上擴展:

由於采用的是絕對地址,所以將裝入模塊直接裝入內存即可,無需進行地址變換。
(2)可重定位裝入方式(靜態重定位)
Ø 出現:
編譯時將程序裝入指定的內存空間,必須需要程序員熟悉內存的使用情況
絕對裝入方式只能將目標模塊裝入到內存中事先指定的位置。而在多道程序環境下,編譯程序不可能預知所編譯的目標模塊應放在內存的何處
可重定位方式可根據內存的當前情況,將裝入模塊裝入到內存的適當位置
Ø 原理:
源程序編譯生成的目標模塊都采用相對地址進行編址,即每個模塊都從0開始編址,當然鏈接后的模塊也采用相對地址編址

將裝入模塊裝入內存后,模塊中的程序和數據等,在內存中都將具有一個物理地址,此物理地址是相對於內存的起始地址進行編址的,所以與原先模塊中的邏輯地址(相對於模塊的起始地址進行編址)不同,所以為了得到物理地址需要對邏輯地址進行改變。而此地址變化的過程就叫做重定位,又因為地址變換通常是在裝入時一次完成的,以后不再改變,故稱為靜態重定位。如下圖:

(3)動態運行時裝入方式(動態重定位)
只是把相對地址到絕對地址的轉換推遲到程序真正執行時才進行
總結:

