1、程序的裝入和鏈接
程序進(jìn)內(nèi)存的一般過程:
1.編譯compiler:編譯程序:將用戶源代碼編譯成若干個(gè)目標(biāo)模塊。
2.鏈接link:鏈接程序:將形成的一組目標(biāo)模塊,及它們需要的庫函數(shù)鏈接在一起,形成一個(gè)完整的裝入模塊。
3.裝入load:由裝入程序?qū)⒀b入模塊裝入內(nèi)存,構(gòu)造PCB,形成進(jìn)程,開始運(yùn)行(使用物理地址)。
1)地址的概念
2)程序裝入中的地址處理
? 絕對(duì)裝入(邏輯地址=物理地址)
? 靜態(tài)重定位裝入
? 動(dòng)態(tài)運(yùn)行時(shí)重定位裝入
3)不同的程序鏈接裝入方式(使用內(nèi)存的時(shí)機(jī))
? 靜態(tài)鏈接
? 裝入時(shí)鏈接
? 運(yùn)行時(shí)鏈接
2)程序裝入中的地址處理
邏輯地址? ======?? 物理地址:
①絕對(duì)裝入方式(absolute loading)
邏輯地址 ->重定位->物理地址:
②靜態(tài)可重定位裝入方式(relocatable loading mode)
③動(dòng)態(tài)運(yùn)行時(shí)(重定位)裝入方式(dynamic run-time loading)
① 絕對(duì)裝入方式
編譯程序生成的“目標(biāo)代碼”就是”裝入模塊”,邏輯地址直接從某個(gè)地址R處增長(zhǎng),裝入模塊直接裝入內(nèi)存地址R處。
物理地址由誰生成?
一般由編譯或匯編程序給出;或由程序員賦予(要求程序員熟悉內(nèi)存使用情況)
優(yōu)點(diǎn):裝入過程簡(jiǎn)單。不需任何地址變換,程序中的邏輯地址與實(shí)際內(nèi)存物理地址完全相同。
缺點(diǎn):過于依賴硬件結(jié)構(gòu),只適用早期針對(duì)硬件直接編程、單道環(huán)境下。
現(xiàn)在程序裝入一般都要從邏輯地址映射到物理地址:
重定位:把目標(biāo)程序中的指令和數(shù)據(jù)的邏輯地址變成內(nèi)存中的物理地址的地址變換過程。
靜態(tài)可重定位裝入方式
地址映射在程序執(zhí)行之前進(jìn)行,重定位后物理地址不再改變。
可由專門設(shè)計(jì)的重定位裝配程序完成(軟):裝入時(shí)根據(jù)所定位的內(nèi)存地址去修改每個(gè)邏輯地址,添加相應(yīng)偏移量,重定位為物理地址。
優(yōu)點(diǎn):不需硬件支持,可以裝入有限的多道程序
缺點(diǎn):軟件裝入一次完成,一個(gè)程序通常需要占用連續(xù)的內(nèi)存空間,程序裝入內(nèi)存后不能移動(dòng)。也不易實(shí)現(xiàn)共享。
動(dòng)態(tài)運(yùn)行時(shí)(重定位)裝入方式(dynamic run-time loading)
實(shí)際運(yùn)行中往往會(huì)需要程序在內(nèi)存中的各位置移動(dòng),即經(jīng)常需要重定位到不同的物理地址上。這種運(yùn)行時(shí)移動(dòng)程序要求地址變換要快速,實(shí)現(xiàn)時(shí)一般依靠硬件地址變換機(jī)構(gòu)——一個(gè)重定位寄存器。
程序裝入內(nèi)存時(shí),可多次重定位到不同位置。且可以不立即把裝入模塊中的相對(duì)地址轉(zhuǎn)換為絕對(duì)地址,而是把這種地址轉(zhuǎn)換推遲到程序真正要執(zhí)行時(shí)才進(jìn)行。
更適用于部分裝入
3)不同的程序鏈接方式
裝入是使用內(nèi)存的開始,但鏈接的不同會(huì)使內(nèi)存的使用有差別:
根據(jù)鏈接時(shí)間的不同,分成三種:
①靜態(tài)鏈接:裝入運(yùn)行前將多個(gè)目標(biāo)模塊及所需庫函數(shù)鏈接成一個(gè)整體,以后不再拆開。
②裝入時(shí)動(dòng)態(tài)鏈接:裝入內(nèi)存時(shí),邊裝入邊鏈接的鏈接方式。
運(yùn)行時(shí)動(dòng)態(tài)鏈接:對(duì)某些目標(biāo)模塊的鏈接,在執(zhí)行中需要該目標(biāo)模塊時(shí),才對(duì)它進(jìn)行鏈接