可執行文件裝載和進程 筆記

裝載的兩種方法

覆蓋裝入 : 利用程序的局部性原理,將一個程序中出現頻率高的模塊在程序運行時始終放入內存中,其他的模塊,按照先後順序,依次被覆蓋。
如圖例子:
這裏寫圖片描述

mian部分在程序運行時始終佔用內存,加入main()函數調用A函數,A函數讀入內存,等到A執行結束,main調用b時,B把A所用的所有空間全部覆蓋。
A和B是兩個競爭模塊。
被調用的模塊被稱作調用它的模塊的子模塊。
任何一個模塊到根模塊(這裏是main())之間的路徑叫做調用路徑。
競爭模塊和他們各自的的子模塊之間禁止互相調用。

頁映射:內存額磁盤所有數據和指令以頁爲單位進行裝載或其它操作。利用覆蓋,把使用頻率小的頁的內容進行替換。
如圖例子:
這裏寫圖片描述
一個程序有0-7,共8個頁,但是隻分0-3 4個物理頁。加入虛擬頁0真實在物理頁2執行,虛擬頁1真實在物理頁0執行,虛擬頁3在物理頁1執行,虛擬頁5也在物理頁1執行,則虛擬頁3和5會按照一定順序對物理頁1進行內容覆蓋。

進程建立之前

進程很重要的特性:擁有獨立的虛擬地址空間。
在進程裝載相應的可執行文件並執行之前,需要做3件事情:
1 創建獨立虛擬地址空間。這裏並不是說真正創建了空間,而是創建了映射函數所需要的相應數據結構。
2 讀取可執行文件頭,建立虛擬空間和可執行文件之間的映射關係。這一步的用處:假如操作系統捕捉到了缺頁錯誤,它需要知道程序所需要的頁在可執行文件的具體位置。
3 cpu指令集存其攝製成可執行文件的入口,啓動程序。

ELF可執行文件的劃分

區分section 和segment.
section:從鏈接角度區分的,按照section,一個段一個段的存儲。
segment:從裝載角度,按照屬性區分的,幾個section是一個segment。
代碼VMA:只讀,可執行。
數據VMA:讀寫,可執行。
堆VMA:讀寫可執行。
棧VMA:讀寫,不可執行。
如果segment多且實際空間利用率低,則實際上映射過程建立時,會把各段接壤的部分共享一個物理頁面,並把該頁面分別映射兩次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章