Linux 啓動流程

一. Linux 啓動流程 

系統初始化(BIOS)

當我們摁下電源開關到屏幕開始輸出信息(系統開機界面)之間這一步稱爲系統初始化。這一步主要用於檢測各個硬件是否正常,不正常則發出鳳鳴通知。正常則開始按照用戶制定的順序開始加載啓動加載器 (GRUB,Clover 等)

  1. (RESET) 重置 CPU

當我們按下電源開關時,電源就會開始向主板和其他設備供電,此時電壓還不太穩定,主板芯片組會向 CPU 發送並保持一個 RESET(重置)信號,讓 CPU 內部自動恢復到初始狀態,CPU 此刻不會馬上開始執行指令。當芯片組檢測到電源已經開始穩定供電(當然從不穩定到穩定只有一瞬間),芯片組便撤去 RESET 信號,CPU 馬上就從地址 FFFF0H 處開始指令。這個地址一般是跳轉到系統 BIOS 的地址範圍的地址。

  1. POST(Power-OnSelfTest)

系統 BIOS 被加載後首先要做的就是 POST(Power-OnSelfTest,加電後自檢),POST 主要任務是檢測系統中一些關鍵設備是否正常工作,例如內存和顯卡等設備。由於 POST 是最早進行的檢測過程,此時顯卡還沒有初始化,如果 POST 過程中出現致命錯誤,例如沒有找到內存或內存有問題(一般只會檢查 640K 常規內存),系統 BIOS 會直接控制喇叭發生來報告錯誤,聲音長短和次數代表錯誤類型。在正常情況下 POST 過程非常快,幾乎無法感知。POST 結束後就會調用其他組件來進行更完整的硬件檢測。

  1. 初始化設備(硬件)

系統 BIOS 將查找顯卡的 BIOS,存放顯卡 BIOS 的 ROM 芯片的起始地址通常設在 C0000H 處,系統 BIOS 在這個地址上找到顯卡 BIOS 後就調用其的初始化代碼,由顯卡 BIOS 來初始化顯卡。此時多數顯卡都會在屏幕上顯示處一些初始化信息,生產廠商,圖形芯片等內容。這個畫面幾乎一閃而過 。系統 BIOS 接着會查找其他設備的 BIOS 程序,找到之後同樣調用這些設備 BIOS 內部的初始化代碼來初始化相關設備。

  1. BIOS 信息輸出

查找完所有其他設備的 BIOS 之後,系統 BIOS 將會顯示出本身的啓動畫面,包括 BIOS 類型,序列號,版本號等內容

  1. 內存測試

系統 BIOS 將檢測和顯示 CPU 類型和工作頻率,然後開始測試所有的 RAM,並同時在屏幕上顯示內存測試進度。可以才 CMOS 設置中自行設置使用耗時長還是耗時短的測試方法。

  1. 檢測標準硬件設備

系統 BIOS 將開始檢測系統中安裝的一些標準硬件設備,包括硬盤,CD-ROM,串口,並口,軟驅等設備。大多是新版 BIOS 在此時還會設置內存定時參數等一些高級參數。

  1. 檢測即插即用設備

系統 BIOS 內部的支持即插即用的代碼將開始檢測和配置系統中安裝的即插即用設備,每找到一個設備之後,都會在屏幕上顯示處設備的名稱和型號等信息,同時爲該設備分配中斷,DMA 通道和 I/O 端口等資源。

  1. 更新 ESCD

系統 BIOS 將更新 ESCD(Extended System Configuration Data ,擴展系統配置數據)。ESCD 是系統 BIOS 用來與操作系統交換硬件配置的一種手段,這些數據被存放在 CMOS(一小塊特殊的 RAM,由主板上的電池來供電)之中。通常 ESCD 數據只在系統硬件配置發生改變後纔會更新。

  1. 啓動引導器

ESCD 更新完畢後,系統 BIOS 將會進行它最後一項工作,即根據用戶指定的啓動順序從軟盤,硬盤或光驅啓動。系統 BIOS 將會讀取並執行啓動順序中第一項的 MBR 1 主引導記錄(前 446 字節,總共 512 字節)。前 446 字節通常是啓動加載器(boot loader)GRUB 之類的程序,至此係統初始化完成。後續操作交由啓動加載器(boot loader)完成

系統初始化(UEFI)

UEFI(Unified Extensible Firmware Interface Forum) 的簡稱 ,是目前從智能手機到打印機,筆記本電腦,服務器,甚至超級計算都被廣泛應用的技術標準,其中它與傳統 BIOS 的不同之處可以用 3 句話進行概括:

1 > 規範了各種接口標準

2 > 爲不同的操作系統提供統一的接口

3 > 代碼開源

  1. SEC 階段 (安全驗證)

SEC 階段接受和處理系統的啓動,重啓,異常信號。SEC 會從 CPU 的緩存 (一級緩存, 二級緩存等) 中開闢出一段空間作爲內存使用(內存此時沒有被初始化,後面程序運行需要內存和棧空間),這個過程叫做[Cache As RAM(CAR)“。最後將可啓用的固件地址和大小還有內存和棧的地址和大小當作參數傳遞給下一階段(PEI 階段)。

  1. PEI 階段 (EFI 前期初始化)

在 PEI 階段主要爲 DXE 階段準備執行環境,主要做 CPU 相關得硬件初始化,最主要得是對於內存得初始化,將 DXE 階段所需要得參數以 HOB 列表的方式進行傳遞

  1. DXE 階段 (驅動執行環境)

在 DXE 階段已經有足夠得內存可以使用,因此可以完成大量得驅動加載和初始化工作。遍歷所有固件中的 Driver,當 Driver 所依賴得資源都滿足要求時,調度 Driver 到隊列執行,知道所有 Driver 都加載和執行完畢,系統完成初始化。

  1. BDS 階段 (啓動設備選擇)

在 BDS 階段,主要初始化控制檯設備,加載執行必要得設備驅動,根據用戶得選擇,執行相應得啓動項。

  1. TSL 階段(操作系統加載前期)

TSL 階段是 OS Loader 執行得第一個階段,爲 OS Loader 準備執行環境,OS loader 調用 ExitBootService 結束啓動服務,進入 RunTime 階段

  1. RT 階段

在 RT 階段,OS loader 已經完全取得系統控制權,因此要清理和回收一些之前被 UEFI 佔用得資源,runtime services 隨着操作系統得運行提供相應得運行時服務,這個期間一旦出錯和異常,將會進入 AL 進行修復

  1. AL 階段 (災難恢復)

各廠家自定義修復方案,無官方標準

二. Boot loader (啓動引導器)

啓動加載器必須能夠訪問內核和 initramfs 映像,否則系統將無法引導。因此,在典型設置中,它必須支持訪問 /boot。也就是說,啓動加載器需要兼容內核和 initramfs 所處的位置的文件系統。參考 GRUB 引導得 1.5 步

啓動引導器對比圖

  1. 加載並執行內核

啓動引導器啓動內核程序。內核是操作系統得核心。它運行於一個叫 [內核空間] 得底層上,負責機器硬件和應用程序之間得交流。爲了儘可能充分地壓榨 CPU 性能,內核使用調度器,通過一定優先級算法將 CPU 按照時間動態的分配給各個程序。

  1. initramfs(早期用戶空間)

在 boot loader(啓動引導器) 加載 kernel 和可用的 initramfs 文件,並執行 Kernel 之後, Kernel 將 initramfs(初始 RAM 文件系統) 壓縮包解壓縮到 (然後清空)rootfs(初始根文件系統, 特別是 ramfs 和 tmpfs)。只讀掛載 首先提取 initramfs 實在 Kernel 構建過程中嵌入 kernel 二進制 Update translation 的 initramfs,然後提取可用的外部 initramfs 文件。因此,外部的 initramfs 文件會覆蓋嵌入式 initramfs 中具有相同名稱的文件。然後 Kernel 執行 /init (在 rootfs)中作爲第一個進程。(early userspace)3 開始。

initramfs 中存放 / init 程序,執行 / init 之後開從臨時文件系統加載和真正的根文件系統所需的設備驅動程序

早期使用的是 initrd,後面就開始使用 initramfs。

initramfs 之所以存在,是爲了幫系統訪問真正的根文件系統。也就是說,硬件 IDE,SCSI,SATA,USB/FW 所要的 Kernel 模塊,如果沒有內置在 Kernel 中,就會被 initramfs 負責加載。initramfs 只要有能夠讓系統訪問真實跟文件系統的模塊就可以了,不用盡可能地包含一切模塊。當然,其它真正有用的模塊之後在 init 流程中被 udev 加載好。

三. Init 流程 

在 [早期用戶空間] 的最終環節裏,真正的根文件系統被掛在後,就會替換掉原來的僞根文件系統。接着 / sbin/init 被執行,同樣也替換掉原來 / init 的進程. 目前大多 Linux 系統選用的 init 程序是 systemd。(本文講解 systemd,SysVinit 網絡上有很多自行查看)

  1. Systemd 目標確定

首先,Systemd 掛載 / etc/fstab 中的文件系統,包括內存交換分區。據此,systemd 必須能夠訪問 / etc 目錄下的配置文件,包括它自己。systemd 藉助其配置文件 / etc/systemd/system/default.target 決定 Linux 系統應該啓動到那個狀態(target)。default.target 是一個符號鏈接,對於桌面系統,其連接到 graphical.target, 該文件相當於 SysV init 風格的 runlevel5。emergency.target 相當於單用戶模式。

SysV 和 systemd 對應表

如上圖 Systemd 啓動的 target 和 SysV init 啓動運行級別的對比。其中 runlevel0.target 類似這種的命名格式,是爲了向前兼容 SysV 而提供的。

2. Systemd 執行啓動

每個 target 有一個在其配置文件中描述的依賴集,systemd 需要首先啓動其所需要依賴,這些依賴服務是 Linux 主機運行在特定的功能級別所要求的服務。當配置文件中所有的依賴服務都加載並運行之後,即說明系統運行於該目標級別。

圖中箭頭表示各單元 (所有的服務和 target 均是 systemd 的單元) 之間的依賴關係,先後順序,圖表按照自上而下的時間順序. 以 × 號開頭的 target 是通用的啓動狀態,當達到其中的某一 target,則說明系統已經啓動完成。

systemd 也會查看老式的 systemV init 目錄中是否存在相關啓動文件,若存在,則 systemd 根據這些配置文件的內容啓動對應的服務。

sysinit.target 和 basic.target 可以視作啓動過程中的狀態檢查點。儘管 systemd 的設計初衷是並行啓動系統服務,但是部分服務或功能 target 是其他服務或 target 啓動的前提。系統將暫停於檢查點知道其所要求的服務和 target 都滿足爲止。

sysinit.target 狀態的到達是以其所依賴的所有資源模塊都正常啓動爲前提的,所有其他的單元 (unit),如果文件系統掛載,交換文件設置,設備管理器的啓動,隨機數生成器種子設置,低級別系統服務初始化,等都必須完成,但是在 sysinit.target 中這些服務與模塊是可以並行啓動的。

sysinit.target 啓動所有的低級別服務和系統初具功能所需的單元,這些都是進入下一個階段 basic.target 的必要前提。

在 sysinit.target 的條件滿足後,systemd 接下來啓動 basic.target,啓動其所要求的所有單元。basic.target 通過啓動下一 target 所需的單元提供了更多的功能,包括各種可執行文件的目錄路徑,通信 scokets 等

最後,用戶級 target(multi-user.target 或 graphical.target) 可以初始化了,應該注意的是 multi-user.target 必須在滿足圖形化 target,graphical.target 的依賴項之前達成

3. Systemd 執行 System V 啓動項 (非必須)

systemd 也會查看老式的 systemV init 目錄中是否存在相關啓動文件,若存在,則 systemd 根據這些配置文件的內容啓動對應的服務。

1 > 讀取 / etc/inittab 文件內容確定啓動級別

2 > 通常情況下先執行 / etc/rcS.d / 下的腳本,然後是 / etc/rcN.d 目錄 (N 代表啓動級別),最後是 / etc/rc.local 目錄

啓動最後的操作

  1. runlevel3

在 Systemd 將系統啓動到 multi-user.target 所定義的狀態時,systemd 會啓動每一個虛擬終端調用 getty, 虛擬終端一般有 6 個, 每個虛擬終端初始化 tty 並請求輸入用戶名和密碼。當在某虛擬終端輸入用戶名和密碼後,其 getty 會通過 / etc/passwd 檢查是否正確,正確則調用 login

login 程序會爲用戶啓動一個設置了環境變量的會話,接着根據 / etc/passwd 的配置啓動用戶專用 shell

一旦用戶專用 shell 啓動了,他會在顯示命令行提示符前,執行可執行性的配置文件,例如. bashrc

  1. runlevel5

沒有配置顯示管理器替換 getty。僅顯示管理器自啓

在 Systemd 將系統啓動到 multi-user.target 所定義的狀態時,systemd 會啓動每一個虛擬終端調用 getty, 虛擬終端一般有 6 個, 每個虛擬終端初始化 tty 並請求輸入用戶名和密碼。啓動顯示管理器 (GDM,SDDM,XDM) 等等

四. 各腳本啓動 

1 > 開機執行 / etc/rc.d/rc.local

2 > 用戶登錄時讀取 / etc/profile

3 > 特定用戶登錄時執行~/.bash_profile

MBR 主引導記錄(MBR),也被稱爲主引導扇區,是計算機開機以後訪問硬盤時所必須要讀取的第一個扇區。在深入討論主引導扇區內部結構的時候,有時也將其開頭的 446 字節內容特指爲 “主引導記錄”(MBR),其後是 4 個 16 字節的 “磁盤分區表”(DPT),以及 2 字節的結束標誌(55AA)。因此,在使用 “主引導記錄”(MBR)這個術語的時候,需要根據具體情況判斷其到底是指整個主引導扇區,還是主引導扇區的前 446 字節。

轉自:CSDN 博主

原文鏈接:https://blog.csdn.net/AtlanSI/article/details/113282559

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/_Hv-SvTko7MOVS6YD01w6g