註:對於Segment,Section,Virtual Memory,Page這些詞我們肯定不會陌生。但是在我們閱讀一些書籍和文章的時候,不知道是那些作者的緣故還是自己的原因,我們不能正確區分他們之間的區別。我不得不承認,真要100%弄清楚這些概念並不是一件容易的事情,因為他們涉及到很多不同方面的內容(例如編譯/串連,彙編,作業系統),同時這些內容本身就不太容易掌握。但是我想寫這篇文章,一方面是為了總結我對這些內容的分析和理解,另一方面在以後的學習中我可以對這篇檔案進行修改和完善,最終可以很深入的理解這些內容。
接觸過PE檔案格式的都知道,在PE檔案中,檔案的不同內容被分成不同的部分,一個部分對應一個方面的內容,這裡的部分被稱為"Section"。這樣的劃分即是"物理"的,也是"邏輯"的:不同的內容被劃分成不同的section並給予一個有提示性意義的section name,通過這個名字我們就可以大致猜測到這部分內容是什麼;當可執行檔被作業系統的Loader裝載到記憶體中的時候,可執行檔在記憶體的鏡像(image)和PE檔案的物理布局基本是相同的。
接下來讓我們把討論的重點zoom in到可執行檔在記憶體中的鏡像。和PE檔案一樣,記憶體鏡像也被劃分成不同的部分,劃分的依據和PE檔案中劃分section的依據一致。這時候這些被劃分的部分被成為segment。這裡的segment很容易將我們把它和記憶體的"分段"式管理聯絡起來。在老的CPU體繫結構中,記憶體是以"段(segment)"的形式管理的。在新的CPU體繫結構中,記憶體是以虛擬記憶體的形式管理的。在以虛擬記憶體管理佔主流的今天仍然使用segment,我覺得,無非是為了相容老的CPU型號,同時也是照顧那些從老的CPU體繫結構一直走過來的程式員。所以我們需要注意區分這裡的segment和記憶體"分段"管理中的segment。
在一個以虛擬記憶體方式管理記憶體的系統中(現在大部分主流的系統都是以這種方式管理記憶體的),一個可執行檔的記憶體鏡像被映射到一個進程的部分虛擬記憶體空間內(註:另外一部分的虛擬記憶體空間被作業系統佔用)。虛擬記憶體本身又被劃分成"頁(page)",頁是虛擬內中最小的記憶體單元。
記錄
05/06/2007 v1.0
原文的第一版