深入解析Mac OS X & iOS 操作系統(tǒng) 學(xué)習(xí)筆記(七)

引導(dǎo)過程:EFI 和 iBoot

引導(dǎo)過程指的是從就計算機(jī)通電那一瞬間到CPU開始執(zhí)行操作系統(tǒng)代碼時的整個過程,這個過程往往是系統(tǒng)啟動過程中被忽視的一部分。在這個非常初期的階段中等孵,CPU 執(zhí)行標(biāo)準(zhǔn)的啟動代碼窘疮。這部分代碼需要對硬件設(shè)備進(jìn)行探測,尋找最有可能啟動的操作系統(tǒng)并且根據(jù)用戶定義的參數(shù)啟動這個操作系統(tǒng)逐抑。其他的操作系統(tǒng)用的默認(rèn)(通用)的引導(dǎo)加載器(boot loader),而OS X 和 iOS 使用的則是自己的引導(dǎo)加載器杏死,引導(dǎo)加載器工作在預(yù)期的(preboot)固件環(huán)境中泵肄。

傳統(tǒng)形式的引導(dǎo):BIOS

大部分PC采用的是BIOS,用來加載一些基本的自舉(bootstrap)代碼給CPU 執(zhí)行淑翼。BIOS 有很大的局限性腐巢,無可擴(kuò)展性可言,還和MBR 分區(qū)方案緊密耦合玄括。

EFI

正因為BIOS 的局限性冯丙,蘋果采用了一種更新的32位/64位兼容的標(biāo)準(zhǔn):可擴(kuò)展固件接口(Extensible Fireware Interface,EFI)遭京。和BIOS 相比胃惜,EFI 是一個全功能的運行時系統(tǒng),在引導(dǎo)期間提供了更為強(qiáng)大的接口哪雕,設(shè)置在之后的運行時也提供了接口船殉。

EFI 程序其實是一個二進(jìn)制程序,只不過二進(jìn)制程序采用的是 便攜式可執(zhí)行(Portable Executable斯嚎,PE)格式利虫。EFI 二進(jìn)制程序都實現(xiàn)了這樣的原型:
typedef EFI_STATUS (EFIAPI *EFI_IMAGE_ENTRY_POINT) (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE SystemTable);
這個原型是說挨厚,EFI 二進(jìn)制程序從 EFI環(huán)境接受兩個參數(shù):

  • EFI句柄:引用鏡像自己,通過這個句柄可以從運行時查詢各種詳細(xì)信息
  • EFI系統(tǒng)表:指向主表(master table)的指針糠惫,從這個表中可以獲得所有EFI 標(biāo)準(zhǔn)的句柄和運行時API指針

NVRAM 變量

NVRAM 是固件接口中一個非常強(qiáng)大的功能疫剃,而且這顯然是傳統(tǒng)BIOS 沒有的功能。NVRAM 變量和 shell 變量的語義是一樣的硼讽,都是環(huán)境變量的功能巢价,但是NVRAM 是在系統(tǒng)范圍內(nèi)存在的,操作系統(tǒng)和固件本身都可以訪問固阁。
一般來說壤躲,NVRAM 變量可以分為以下幾個類別:

  • 引導(dǎo)相關(guān)的變量:用于指定要引導(dǎo)的內(nèi)核和根文件系統(tǒng),還負(fù)責(zé)向內(nèi)核傳遞參數(shù)
  • 固件內(nèi)部變量:固件使用的變量备燃,一般被操作系統(tǒng)忽略
  • 臨時變量:根據(jù)需要設(shè)置或清空柒爵,通常在重新引導(dǎo)的時候不會停留

boot.efi 的執(zhí)行流程

  1. 獲得EFI 服務(wù)指針,查詢CPUID
  2. initialConsole
  3. Lion 特有的初始化操作
  4. InitDevice Tree
  5. 為內(nèi)核調(diào)用門分配內(nèi)存
  6. 一些其他的初始化操作赚爵,如InitMemoryConfig.InitSupportedCPUTypes等函數(shù)
  7. 檢查休眠恢復(fù)
  8. 處理引導(dǎo)時的按鍵
  9. Lion:確認(rèn)CPU支持64位模式
  10. Lion:檢查Core Storage
  11. SetConsoleMode
  12. DrawBootGraphics
  13. LoadKernelCache
  14. InitBootStruct
  15. LoadDrivers
  16. LoadRamDisk
  17. StopAnimation
  18. FinalizeBootStruct
  19. 跳轉(zhuǎn)到內(nèi)核入口點

引導(dǎo)內(nèi)核

在加載了 kernelcahce 或內(nèi)核本身之后,boot.efi 退出引導(dǎo)服務(wù)法瑟,將控制權(quán)轉(zhuǎn)交給內(nèi)核冀膝。內(nèi)核被傳入一個參數(shù),一個包含BootStruct 的頁面霎挟,這個數(shù)據(jù)結(jié)構(gòu)在boot.efi 的最后階段完成填寫窝剖,內(nèi)核可以通過這個數(shù)據(jù)結(jié)構(gòu)提取出所需要的所有0數(shù)據(jù)。

內(nèi)核對 EFI 的回調(diào)

EFI 的職責(zé)是加載內(nèi)核酥夭。但是內(nèi)核仍然可以和 EFI 接口赐纱,從而使用 EFI 提供的運行時服務(wù)。

  • efi_init( ):這個函數(shù)從內(nèi)核的引導(dǎo)參數(shù)中獲得 EFI 運行時服務(wù)熬北,這個函數(shù)會調(diào)用下一個函數(shù)
  • efi_set_tables_[32|64](EFI_SYSTEM_TABLE)*:這個函數(shù)有32位和64位兩個版本疙描,接受員工指向EFI 系統(tǒng)表的指針作為參數(shù),計算器簽名和CRC讶隐,然后獲得運行時服務(wù)的指針起胰,將這個指針保存在全局變量gPEEFIRunTimesServices中
  • *hibernate_newruntime_map(void map, vm_size_t map_size, unit32t system_table_offset):系統(tǒng)從休眠中喚醒的時候通過這個函數(shù)重新初始化運行時服務(wù)表

Mach 核心很少使用EFI, 而BSD 更是對 EFI 毫不知情。 而在 I/O Kit 中巫延,大量使用EFI(及設(shè)備樹)效五。

Boot Camp

蘋果的EFI 實現(xiàn)的另一個重要的特性是Boot Camp。Boot Camp 是蘋果雙重引導(dǎo)的解決方案炉峰,這個解決方案允許在Mac 上運行非蘋果的操作系統(tǒng)(主要是Windows)畏妖。由于蘋果使用私有的硬件并且使用了 EFI,而Windows仍然使用落后的BIOS疼阔,因此蘋果在Boot Camp中提供完整的驅(qū)動程序包 戒劫,并且修改了boot.efi支持多系統(tǒng)引導(dǎo)半夷。

bless( )

對于機(jī)器上的固件,OS X 提供的非常有限的訪問能力谱仪,出了nvram( ) 命令外玻熙,提供的唯一能接觸固件的工具就是bless( ),這個工具是一個控制和修改系統(tǒng)引導(dǎo)參數(shù)的工具疯攒,實際上是定義系統(tǒng)引導(dǎo)的位置和方向嗦随。這個工具支持6種模式,如下表:

模式 用途
Folder 將制定的目錄設(shè)置為系統(tǒng)目錄
Mount 指定一個文件系統(tǒng)而不是目錄作為引導(dǎo)卷敬尺。文件系統(tǒng)參數(shù)是已掛載的文件系統(tǒng)枚尼,因此是一個名字
Device 通過/dev 表示的設(shè)備指定一個卷,這時設(shè)備中的文件系統(tǒng)還沒有掛載
NetBoot 設(shè)置引導(dǎo)的網(wǎng)絡(luò)服務(wù)器砂吞,使用-server bsdp://[interface@]a.b.c.d參數(shù)署恍,其中a.b.c.d 表示服務(wù)器的地址,interface 是可選項蜻直,在多 home 的系統(tǒng)中表示本地接口盯质。BSDP 是蘋果的“BootStrap Discovery Protocol” 是對 DHCPv4的一個擴(kuò)展,在蘋果之外沒有其他方法使用或?qū)崿F(xiàn)這個協(xié)議
Unbless 撤銷某個文件夾概而、掛載點呼巷、設(shè)備或網(wǎng)絡(luò)引導(dǎo)的“bless”
Indo 僅顯示信息

iOS 和 iBoot

蘋果的i 系列設(shè)備都不支持 EFI, 其引導(dǎo)過程是蘋果自創(chuàng)的赎瑰。是通過iOS 特有的引導(dǎo)加載器iBoot王悍。引導(dǎo)過程分多個階段,如下圖所示:

iOS 引導(dǎo)過程(高層視圖).png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末餐曼,一起剝皮案震驚了整個濱河市压储,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌源譬,老刑警劉巖集惋,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異踩娘,居然都是意外死亡芋膘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門霸饲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來为朋,“玉大人,你說我怎么就攤上這事厚脉∠按纾” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵傻工,是天一觀的道長霞溪。 經(jīng)常有香客問我孵滞,道長,這世上最難降的妖魔是什么鸯匹? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任坊饶,我火速辦了婚禮,結(jié)果婚禮上殴蓬,老公的妹妹穿的比我還像新娘匿级。我一直安慰自己,他們只是感情好染厅,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布痘绎。 她就那樣靜靜地躺著,像睡著了一般肖粮。 火紅的嫁衣襯著肌膚如雪孤页。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天涩馆,我揣著相機(jī)與錄音行施,去河邊找鬼。 笑死魂那,一個胖子當(dāng)著我的面吹牛悲龟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冰寻,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼皿渗!你這毒婦竟也來了斩芭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤乐疆,失蹤者是張志新(化名)和其女友劉穎划乖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挤土,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡琴庵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了仰美。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片迷殿。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咖杂,靈堂內(nèi)的尸體忽然破棺而出庆寺,到底是詐尸還是另有隱情,我是刑警寧澤诉字,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布懦尝,位于F島的核電站知纷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陵霉。R本人自食惡果不足惜琅轧,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望踊挠。 院中可真熱鬧乍桂,春花似錦、人聲如沸止毕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扁凛。三九已至忍疾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谨朝,已是汗流浹背卤妒。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留字币,地道東北人则披。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像洗出,于是被迫代替她去往敵國和親士复。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容