1、程序的裝入和鏈接
程序進內存的一般過程:
編譯compiler:編譯程序:將用戶源代碼編譯成若干個目標模塊。
鏈接link:鏈接程序:將形成的一組目標模塊,及它們需要的庫函數鏈接在一起,形成一個完整的裝入模塊。
裝入load:由裝入程序將裝入模塊裝入內存,構造PCB,形成進程,開始運行(使用物理地址)。
1.1 地址的概念
邏輯地址(相對地址,虛地址)
用戶的程序經過彙編或編譯後形成目標代碼,目標代碼中的指令地址是相對地址。
一般首地址爲0,其餘指令中的地址都相對於首地址來編址。
不能用邏輯地址在內存中讀取信息
物理地址(絕對地址,實地址)
內存中存儲單元的地址。
物理地址可直接尋址被執行。
地址映射:
將用戶程序中的邏輯地址轉換爲運行時由機器直接尋址的內存物理地址的過程。
1.2 程序裝入中的地址處理
1.2.1 絕對裝入方式(absoluteloading)
邏輯地址 ====== 物理地址
1.2.2 靜態可重定位裝入方式(relocatableloading mode)
邏輯地址 ——重定位——物理地址
1.2.3 動態運行時裝入方式
邏輯地址 ——重定位——物理地址
實際運行中往往會需要程序在內存中的各位置移動,即經常需要重定位到不同的物理地址上。這種運行時移動程序要求地址變換要快速,實現時一般依靠硬件地址變換機構——一個重定位寄存器。
程序裝入內存時,可多次重定位到不同位置。且可以不立即把裝入模塊中的相對地址轉換爲絕對地址,而是把這種地址轉換推遲到程序真正要執行時才進行。
更適用於部分裝入。
裝入完了如何記錄下進程在內存哪裏?
程序作爲整體連續裝在一塊內存的,記錄下基地址即可。
程序離散裝入在不同內存位置的,需記錄下多個偏移用的基地址;
動態重定位的,這些被記錄的基地址不一定固定不變,可能會根據內存使用情況變化更新。
1.3 不同的程序鏈接方式
靜態鏈接
裝入運行前,生成可執行文件時進行的。
將多個目標模塊及所需庫函數鏈接成一個整體,以後不再拆開。
裝入時動態鏈接
由一個目標模塊開始裝入,若又涉及外部模塊調用事件,裝入程序再找出相應的外部目標模塊,並將它裝入內存,還要修改目標模塊中的相對地址。
與靜態鏈接相比,便於修改和更新,便於實現共享。
運行時動態鏈接
裝入時動態鏈接的問題
許多情況下,事先不知道某應用程序本次運行需要哪些模塊,只能全部裝入,裝入時全部鏈接在一起,效率低。
辦法:有的模塊不經常使用就暫時不裝入,運行時用到了再裝入。(如程序總不出錯,就不會用到錯誤處理模塊。)即運行時動態鏈接:運行時,將對某些模塊的鏈接推遲到執行時才鏈接裝入。
優點:程序運行裝入的內容少了,加快了裝入過程,而且節省大量的內存空間。