程序裝入和鏈接
程序進內存的一般過程:
編譯compiler:編譯程序:將用戶源代碼編譯成若干個目標模塊傀顾。
鏈接link:鏈接程序:將形成的一組目標模塊,及它們需要的庫函數鏈接在一起螃征,形成一個完整的裝入模塊俊性。
裝入load:由裝入程序將裝入模塊裝入內存略步,構造PCB,形成進程定页,開始運行(使用物理地址)趟薄。
image.png
地址
程序裝入中的地址處理
絕對裝入(邏輯地址=物理地址)
靜態(tài)重定位裝入
動態(tài)運行時重定位裝入
不同程序鏈接裝入
靜態(tài)鏈接
裝入時鏈接
運行時鏈接
邏輯地址也叫相對地址虛地址
用戶的程序經過匯編或編譯后形成目標代碼,目標代碼中的指令地址是相對地址典徊。
一般首地址為0杭煎,其余指令中的地址都相對于首地址來編址恩够。
不能用邏輯地址在內存中讀取信息
物理地址也叫絕對地址實地址
內存中存儲單元的地址。
物理地址可直接尋址被執(zhí)行岔帽。
地址映射:將邏輯地址轉化為運行時由機器直接尋址的內存物理地址的過程
程序裝入地址處理
邏輯地址==物理地址
以絕對方式裝入
邏輯地址->重定位->物理地址
靜態(tài)可重定位裝入方式(relocatable loading mode)
動態(tài)運行時(重定位)裝入方式(dynamic run-time loading)
絕對裝入方式
編譯程序生成的“目標代碼”就是”裝入模塊” 玫鸟,邏輯地址直接從某個地址R處增長,裝入模塊直接裝入內存地址R處犀勒。
物理地址由誰生成屎飘?
一般由編譯或匯編程序給出;
或由程序員賦予(要求程序員熟悉內存使用情況)
優(yōu)點:裝入過程簡單贾费。不需任何地址變換钦购,程序中的邏輯地址與實際內存物理地址完全相同。
缺點:過于依賴硬件結構, 只適用早期針對硬件直接編程褂萧、單道環(huán)境下押桃。
重定位:把目標程序中的指令和數據的邏輯地址變成內存中的物理地址的地址變換過程
靜態(tài)可重定位裝入方式
地址映射在程序執(zhí)行之前進行,重定位后物理地址不再改變导犹。
可由專門設計的重定位裝配程序完成(軟):裝入時根據所定位的內存地址去修改每個邏輯地址唱凯,添加相應偏移量,重定位為物理地址谎痢。
優(yōu)點:不需硬件支持磕昼,可以裝入有限的多道程序
缺點:軟件裝入一次完成,一個程序通常需要占用連續(xù)的內存空間节猿,程序裝入內存后不能移動票从。也不易實現共享。
動態(tài)運行時裝入方式
實際運行中往往會需要程序在內存中的各位置移動滨嘱,即經常需要重定位到不同的物理地址上峰鄙。這種運行時移動程序要求地址變換要快速,實現時一般依靠硬件地址變換機構——一個重定位寄存器太雨。
程序裝入內存時吟榴,可多次重定位到不同位置。且可以不立即把裝入模塊中的相對地址轉換為絕對地址囊扳,而是把這種地址轉換推遲到程序真正要執(zhí)行時才進行煤墙。
更適用于部分裝入
裝完了如何記錄進程內存裝在哪里?
程序作為整體連續(xù)裝在一塊內存的宪拥,記錄下基地址即可仿野。
程序離散裝入在不同內存位置的,需記錄下多個偏移用的基地址(后面內存分配里詳細討論)她君;
動態(tài)重定位的脚作,這些被記錄的基地址不一定固定不變,可能會根據內存使用情況變化更新。
不同程序鏈接方式
靜態(tài)鏈接
裝入運行前球涛,生成可執(zhí)行文件時進行的劣针。
將多個目標模塊及所需庫函數鏈接成一個整體,以后不再拆開亿扁。
裝入時動態(tài)鏈接
由一個目標模塊開始裝入捺典,若又涉及外部模塊調用事件,裝入程序再找出相應的外部目標模塊从祝,并將它裝入內存襟己,還要修改目標模塊中的相對地址。