原文:http://bbs.pediy.com/showthread.php?t=76876
以下介紹程序是如何裝入內存,從而變成在計算機內可執行的形式的。
在用匯編語言或高級語言編寫的程序中,是通過符號名來訪問子程序和數據的,我們把程序中符號名的集合叫做“名字空間”。匯編語言源程序經過匯編,或者高級語言源程序經過編譯,得到的目標程序是以“0”作為參考地址的模塊,然后多個目標模塊由連接程序連接成一個具有統一地址的裝配模塊,以便最后裝入內存中執行。我們把目標模塊obj中的地址稱為相對地址(或邏輯地址),而把相對地址的集合叫做“相對地址空間”或簡單地叫做“地址空間”。
裝配模塊雖然具有統一的地址空間,但它仍是以“0”作為參考地址,即是浮動的。要把它裝入內存執行,就要確定裝入內存的實際物理地址,並修改程序中與 地址有關的代碼,這一過程叫做地址重定位。
地址空間的程序和數據經過地址重定位處理后,就變成了可由CPU直接執行的絕對地址程序。我們把這一地址集合稱為“絕對地址空間”或“存儲空間”。
地址重定位完成的相對地址轉換成內存的絕對地址工作又稱為地址映射(map)、按照重定位的時機,可分為靜態重定位和動態重定位。
一、靜態重定位
靜態重定位是在程序執行之前進行重定位,它根據裝配模塊將要裝入的內存起始位置,直接修改裝配模塊中的有關使用地址的指令。
例如,一個以“0”作為參考地址的裝配模塊,要裝入以100為起始地址的存儲空間。顯然,在裝入之前要做某些修改,程序才能正確執行。例如,MOV EAX,[500]這條指令的意義,是把相對地址為500的存儲單元內容1234裝入EAX號累器。現在內容為1234的存儲單元的實際地址為1500, 即為相對地址(500)加上裝入的地址(1000),因此,MOV EAX,[500]這條指令中的直接地址碼也要相應地加上起始地址,而成為MOV EAX,[1500]。
程序中涉及直接地址的每條指令都要進行這樣的修改。需要修改的位置稱為重定位項,所做的加實際裝入模塊起始地址修改中的塊起始地址稱為重定位因子。
為支持靜態重定位,連接程序在生成統一地址空間和裝配模塊時, 應產生一個重定位項表,連接程序此時還不知道裝配模塊將要裝入的實際位置,故重定位表 所給出的需修改位置是相對地址所表示的位置。
操作系統的裝入程序要把裝配模塊和重定位項表一起裝入內存。由裝配模塊的實際裝入起始地址得到重定位因子,然后實施如下兩步:
(1)取重定位項,加上重定位因子而得到欲修改位置的實際地址;
(2)對實際地址中的內容再做加重定位因子的修改,從而完成指令代碼的修改。
對所有的重定位項實施上述兩步操作后,靜態重定位才完成,爾后可啟動程序執行。使用過的重定位項表內存副本隨即被廢棄。
靜態重定位有着無需硬件支持的優點,但存在着如下的缺點:一是程序重定位之后就不能在內存中搬動了;二是要求程序的存儲空間是連續的,不能把程序放在若干個不連續的區域內。
二、動態重定位
動態重定位是指,不是在程序執行之前而是在程序執行過程中進行地址重定位。更確切地說,是在CPU每次訪問內存單元前才進行地址變換。動態重定位可使裝配模 塊不加任何修改而裝入內存,但是它需要硬件——定位寄存器的支持。
程序的目標模塊裝入內存時,與地址有關的各項均保持原來的相對地址不進行任何修改。如MOV 1,[500]這條指令仍是相對地址500。當此模塊被 操作系統調度到處理機上執行時,操作系統將把此模塊裝入的實際起始起始地址減去目標模塊的相對基地址,然后將其差值裝入定位寄存器中。當CPU取得一條訪 問內存的指令時,地址變換硬件邏輯自動將指令中的相對地址與定位寄存器中的值相加,再依此和值作為內存絕對地址去訪問該單元中的數據。
由此可見,進行動態重定位的時機是在指令執行過程中,每次訪問內存前動態地進行。采取動態重定位可帶來兩個好處:
(1)目標模塊裝入內存時無需任何修改,因而裝入之后再搬遷也不會影響其正確執行,這對於存儲器緊縮、解決碎片問題是極其有利的;
(2)一個程序由若干個相對獨立的目標模塊組成時,每個目標模塊各裝入一個存儲區域,這些存儲區域可以不是順序相鄰的,只要各個模塊有自己對應的定位寄存器就行。
動態重定位技術所付出的代價是需要硬件支持。
總結:
靜態地址重定位:即在程序裝入內存的過程中完成,是指在程序開始運行前,程序中的各個地址有關的項均已完成重定位,地址變換通常是在裝入時一次完成的,以后不再改變,故成為靜態重定位。
優點:無需硬件支持
缺點:1)程序重定位之后就不能在內存中搬動了;2)要求程序的存儲空間是連續的,不能把程序放在若干個不連續的區域中。
動態地址重定位:不是在程序執行之前而是在程序執行過程中進行地址重定位。更確切的說,是在每次訪問內存單元前才進行地址變換。動態重定位可使裝配模塊不加任何修改而裝入內存,但是它需要硬件一定位寄存器的支持。
優點:1)目標模塊裝入內存時無需任何修改,因而裝入之后再搬遷也不會影響其正確執行,這對於存儲器緊縮、解決碎片問題是極其有利的;2)一個程序由若干個相對獨立的目標模塊組成時,每個目標模塊各裝入一個存儲區域,這些存儲區域可以不是順序相鄰的,只要各個模塊有自己對應的定位寄存器就行。
缺點:需要硬件支持。