前提知識:
1.程式是先要放在記憶體上,才能被cpu執行的。
2.記憶體
記憶體就像酒店裡的一個個小房間,每個小房間都有編号:

假設有4個學号為1,2,3,4的同學,入住酒店時分别按學号遞增次序入住酒店房間,即 1,2,3,4的同學就入住6,7,8,9号房間。那麼1,2,3,4就是4個同學的相對位址,也叫邏輯位址,6,7,8,9是同學實際所在的地方,是絕對位址,又叫實體位址。
如果知道某個同學的邏輯位址,和起始房間号,那是可以找到這個同學的,例如B同學的學号為2,則他住的房間号就是6+2-1。
同理,記憶體也是這樣的,如下:
記憶體中,每個存儲單元(小房間)也是有固定大小的。
1.如果計算機按[位元組編址],則每個存儲單元的大小為1個位元組,即8個二進制位。
2.如果計算機按[字編址],且是字長為16位,即每個字的大小=存儲機關大小=16個二進制位。
從寫程式到程式運作:
一共會經過三個步驟:
作業系統-----程式的邏輯位址和實體位址+程式在記憶體中的編譯連結裝入方式
1.編譯:由編譯程式把源代碼編譯成目标子產品。(把進階語言轉換成機器語言)
2.連結:由連結程式把編譯好的目标子產品,以及運作所需的庫函數連結在一起,形成一個完整的可裝入子產品。
3.裝入:把連結好的子產品送入記憶體。
總結:
1.源程式編譯好後,形成的一組目标子產品裡面都是邏輯位址。
2.然後通過連結把目标子產品各自的邏輯位址整合到一塊。
3.通過裝入把完整的邏輯位址轉成在記憶體中的實體位址。
連結的三種方式:
1.靜态連結:
在程式運作前,先将各個目标子產品和需要的庫函數連結在一起,形成一個可執行檔案。之後就不分開了。
2.裝入時動态連結:
在把各個目标子產品裝入記憶體時,邊裝入邊連結。
3.運作時動态連結:(現在基本都是用這種)
當程式在運作當中,需要該目标子產品時,才對它繼續連結。優點是便于修改和更新,便于實作對目标子產品的共享。
裝入的三種方式:
(即用不同的三種方法實作邏輯位址到實體位址的轉換)
1.絕對裝入(隻适合單道程式環境)
在編譯時,程式員必須給出程式裝在記憶體的位置(實體位址),然後裝入時,直接裝入該位置。
如下圖,編譯,連結後的程式在裝入前就應該被設定好了實體位址了。
2.靜态重定位
靜态重定位:在裝入之前的可執行檔案都是邏輯位址,裝入時通過指定一個初始的實體位址位置,然後把可執行檔案整個放進記憶體裡,如果記憶體空間不夠,是無法裝入記憶體的。而且在運作過程中,是不能移動位置的,也不能再申請空間,裝入了就是裝入了。比上一種方法好的地方是不用人工指定裝入的實體位址。
3.動态重定位(現在基本都是用這種)
動态重定位即在程式運作過程中要通路資料時再進行邏輯位址與實體位址的變換。
上面2個方法都需要把程式整個裝入記憶體才能開始運作。但是動态重定位,則可以把程式的一部分放進記憶體就可以運作,其他部分當用到再放進記憶體。
總結:
絕對裝入:在編譯時就知道程式将放入記憶體中的那個位置,編譯程式将産生絕對位址的目标代碼。裝入程式按照裝入子產品中的位址,将程式和資料裝入記憶體。絕對裝入隻适用于單道程式環境。
靜态重定向:裝入子產品中的位址還是邏輯位址,直到真正裝入時将邏輯位址變換位實體位址,程式運作期間無法移動
動态重定向:現代技術機基本都用這種技術。裝入程式把裝入子產品裝入記憶體後,并不會立即把邏輯位址轉換為實體位址,而是把位址轉換推遲到程式真正執行時才發生。這種方式需要一個重定位寄存器的支援。