Linux的啓動、引導和登錄

系統加電後,首先BIOS啓動,Linux的啓動開始於BIOS從啓動設備上加載主引導記錄(MBR),MBR中的代碼從活動分區上讀取Linux bootloader(比如grub、lilo)。接着bootloader加載Linux內核壓縮鏡像(通常爲elf鏡像),並將控制權交付給它。內核啓動後bootloader加載Initrd(掛載作爲初始的根文件系統),來保存額外的動態可加載模塊(需要隨後用來掛載存儲真正根文件系統的硬盤分區)。因爲內核運行在應用各種不同存儲控制器的硬件平臺上,因此在內核鏡像中爲每一個特定硬盤驅動分配空間基本是不可能的。特定存儲設備的驅動打包在Initrd中並且在內核啓動後加載(但是在根文件系統掛載之前)。接着,內核自解壓縮並開始整個Linux系統的啓動。
內核第一級別的初始化是在實模式下完成的(主要是調用bios服務獲得內存映射),隨後的啓動在保護模式下完成。首先初始化cpu子系統,然後內存和進程管理就位,接着啓動外圍總線和IO設備(包括網絡協議族和IO調度器的註冊、PCI資源的建立、文件系統的掛載等)。引導的最後一步是調用所有Linux進程的父進程init。init進程執行用戶空間的腳本啓動必要的內核服務。
init爲每一個可登錄的終端設備調用fork生成一個子進程並在子進程中調用exec執行getty程序。接着getty以讀寫的方式打開設備,併爲之設置文件描述符0,1,2(應該是調用fcntl函數分別以F_DUPFD和F_SETFD的命令來完成)它最終在控制檯上衍生出終端並且現實login提示。
然後,getty輸出類似login:的提示並且等待用戶輸入用戶名,當我們輸入用戶名後,getty程序便完成了它的工作,接着調用exec執行login程序(進程空間被覆蓋,所以login和getty的進程號是一樣的)併爲它建立環境(所有子進程一般都會繼承並可能拓展)。login獲得輸入的密碼並和從系統特定文件獲得的解密密碼相匹配,如果匹配成功,login會設置我們的主目錄、uid、gid,初始化用戶環境(例如PATH,HOME),調用登錄shell等。最終,我們看到shell的輸入提示...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章