BSD相關特性
OS X由BSD衍生而來呀洲,具有很多BSD特性紊选,包括:POSIX,系統(tǒng)調用道逗,BSD擴展兵罢,BSD強制訪問控制層等。
但OS X還增加了很多復雜的功能滓窍,比如沙盒機制:每個應用程序被孤立起來卖词,實現(xiàn)安全性。
XNU核心是Mach吏夯,但是用戶態(tài)展現(xiàn)出來的主要接口是BSD接口此蜈。OS X和iOS都提供了一組POSIX兼容的系統(tǒng)調用。還提供了一些BSD特有的調用噪生。
OS X和iOS安全機制
代碼簽名
在確認軟件的安全性之前裆赵,首先必須對軟件的來源進行真實性驗證。如果一個程序從網上下載的跺嗽,那么該程序是惡意軟件的風險就特別大战授,但是,如果能夠驗證軟件的來源桨嫁,那么風險會大大降低陈醒,同時還可以驗證程序在傳輸過程中是否被篡改。
代碼簽名就是為了實現(xiàn)這個目的瞧甩。蘋果將證書保存在了OS X和iOS的鑰匙鏈中钉跷,使得蘋果才是唯一具有root權限的實體,而且這些系統(tǒng)鑰匙鏈還能導出肚逸。
在OS X中爷辙,代碼簽名是可選的,但是iOS中卻是強制的朦促,如果某個未簽名的程序被嘗試加載膝晾,都會導致這個應用程序進程被內核殺掉。
隔離機制(沙盒化)
應用程序都必須在一個獨立的隔間中運行务冕,隔間就是一個隔離的環(huán)境血当,在該環(huán)境中所有操作都會受到限制。
iOS沙盒的限制:
- 無法突破程序目錄之外的位置。因此程序無法知曉系統(tǒng)上安裝的其他程序臊旭,因為無法訪問文件系統(tǒng)落恼。
- 無法訪問系統(tǒng)上的其他進程,即使具有同樣UID的進程离熏。應用程序會認為自己就是系統(tǒng)上唯一的進程佳谦。
- 無法直接使用任何硬件設備,只能通過蘋果提供的框架滋戳。
- 無法動態(tài)生成代碼钻蔑。mmap(2)和mprotect(2)系統(tǒng)調用的底層實現(xiàn)被修改,防止任何可寫內存頁面設置為可執(zhí)行的企圖奸鸯。
- 除了用戶mobile能執(zhí)行的操作的一個子集外咪笑,無法執(zhí)行任何其他操作。應用程序根本不可能有root權限娄涩。
進程和線程
進程是一個正在執(zhí)行的程序的實例窗怒,是UNIX的一個基本概念。該實例可以通過Process ID(PID)來唯一辨別钝满。盡管同一個可執(zhí)行程序可以并發(fā)啟動多個實例兜粘,但每一個實例都有一個不同的PID申窘。進程可以屬于進程組弯蚜。進程組的主要作用是讓用戶可以同時控制多個進程。通常是向一個進程組發(fā)送信號控制這些進程剃法,而不是單獨發(fā)送碎捺。
進程還會將和父進程的親屬關系保存在父進程ID中。父進程可以通過fork創(chuàng)建子進程贷洲,并且預期子進程會消亡收厨。
UNIX進程生命周期:運行,然后在運行結束后返回一個整數优构。子進程返回的整數由父進程手機诵叁。
線程是操作系統(tǒng)操作的基本單元。線程是一組寄存器的狀態(tài)钦椭,一個進程可以存在多個線程拧额。一個進程內的所有線程都共享虛擬內存空間,文件描述符和各種句柄彪腔。進程被抽象成一個或者多個線程的容器保存下來侥锦。
多線程的優(yōu)點:一個線程的狀態(tài)可以獨立于其他線程,當一個線程睡眠時德挣,另一個線程可以被調度到CPU上執(zhí)行恭垦。線程會在可運行、正在運行以及睡眠之間來回切換。
可以通過一個信號番挺,是一個進程停止執(zhí)行唠帝,相當于凍結了進程,同時掛起這個進程所有的線程建芙。
可執(zhí)行文件
進程是特殊文件在內存中加載得到的結果没隘。這種文件必須使用操作系統(tǒng)能夠理解的格式。這樣操作系統(tǒng)才能解析這個文件禁荸,建立所需要的依賴右蒲,初始化運行時環(huán)境開始執(zhí)行。
chmod+x命令將文件標記為可執(zhí)行文件赶熟,但其實并不能保證能執(zhí)行瑰妄,因為只是告訴系統(tǒng)這個文件讀入內存,然后尋找一個頭簽名映砖,據此確定精確的可執(zhí)行格式间坐。這個頭簽名稱為魔數magic,這是預先定義好的邑退,而且通常是任意選擇的一個常量值竹宋。魔數可以判斷二進制格式,如果是支持的格式地技,則會調用正確的加載器函數蜈七。
#!:UNIX腳本和一些解釋器使用的格式,主要用于shell腳本莫矗。內核尋找#!后面跟著的字符串飒硅,然后執(zhí)行這個字符串表示的命令。
程序崩潰
當進程異常終止時作谚,自動觸發(fā)Crash Reporter三娩,生成詳細的崩潰日志。該機制在進程消亡前進行快速簡單的分析妹懒,并且在崩潰日志中記錄重要的內容雀监。
iOS和OS X中,Crash Reporter日志都保存在用戶的library/logs/carshreporter目錄或系統(tǒng)的對應目錄下眨唬。