Mach-O
Mach-O
是運(yùn)行時可執(zhí)行文件的文件類型凝颇,主要包括:
-
Executable
潘拱,可執(zhí)行文件,應(yīng)用中最重要的二進(jìn)制文件拧略,也就是應(yīng)用擴(kuò)展的主二進(jìn)制文件芦岂; -
Dylib
,動態(tài)庫垫蛆; -
Bundle
禽最,捆綁包腺怯,是一種特殊的動態(tài)庫,不能進(jìn)行鏈接川无,只能在運(yùn)行時通過dlopen()
打開呛占;
Image
,圖像懦趋,是指以上任意三種類型晾虑。
Framework
,庫仅叫,包含資源文件和頭文件的靜態(tài)庫或動態(tài)庫帜篇。
Mach-O Image File
Mach-O
圖像文件被劃分為若干個 segment
,所有的 segment
都是用大寫字母命名诫咱。每個 segment
都是 page
大小的整數(shù)倍笙隙,在 64
位操作系統(tǒng)中是 16K
,在 32
位操作系統(tǒng)中是 4K
遂跟。
下圖的例子中,__TEXT
段有 3 個頁面婴渡,__DATA
和 __LINKEDIT
分別有 1 個頁面幻锁。
segment
的子范圍是分區(qū),通常用小寫字母表示边臼。編譯器一般會忽略段內(nèi)的分區(qū)哄尔。
幾乎每個二進(jìn)制文件都包含三個 segment
-
__TEXT
,包含了Mach
的頭文件柠并,任何機(jī)器指令岭接,只讀常量,比如C
字符串就放在這里臼予; -
__DATA
鸣戴,可重寫的內(nèi)容,包含所有的全局變量粘拾; -
__LINKEDIT
窄锅,包含變量函數(shù)信息,比如名稱和地址
不同操作系統(tǒng)的 Mach-O
文件通過 Fat Header
放在一起缰雇,構(gòu)成 Mach-O
通用文件入偷。
Virtual Memory
虛擬內(nèi)存通過映射進(jìn)程的地址到物理地址來管理物理內(nèi)存。這種映射不是一對一的械哟,一個邏輯地址可以不對應(yīng)任何物理地址疏之,也可以多個邏輯地址對應(yīng)同一個物理地址。
虛擬內(nèi)存具有以下特性:
-
Page fault
暇咆,如果一個邏輯地址沒有對應(yīng)的物理地址锋爪,當(dāng)進(jìn)程在訪問該內(nèi)存時會產(chǎn)生頁面錯誤丙曙; - 當(dāng)多個進(jìn)程的邏輯地址對應(yīng)同一個物理地址時,這幾個進(jìn)程可以共享相同的頁面几缭。
-
File backed pages
河泳,不需要把整個文件讀入RAM
中,調(diào)用mmap()
函數(shù)告訴操作系統(tǒng)需要把部分文件映射到物理地址年栓, -
Copy-On-Write (COW)
拆挥,寫入時復(fù)制, - 定義
dirty pages
和clean pages
某抓, - 設(shè)置
rwx
權(quán)限纸兔;
Security
通過 ASLR
和 代碼簽名保證安全性。
ASLR
否副,就是 Address Space Layout Randomization
汉矿,把圖像文件加載到隨機(jī)地址中。
代碼簽名备禀,對整個文件進(jìn)行一個加密哈希算法洲拇,然后在文件上簽名,在運(yùn)行時進(jìn)行驗(yàn)證曲尸,所有的哈希都存儲在 __LINKEDIT
中