# 系統開機流程 : step1. 載入 BIOS 的硬體資訊與進行自我測試,並依據設定取得第一個可開機的裝置; step2. 讀取並執行第一個開機裝置內 MBR 的 boot Loader (亦即是 grub, spfdisk 等程式); step3. 依據 boot loader 的設定載入 Kernel ,Kernel 會開始偵測硬體與載入驅動程式; step4. 在硬體驅動成功後,Kernel 會主動呼叫 init 程式,而 init 會取得 run-level 資訊; step5. init 執行 /etc/rc.d/rc.sysinit 檔案來準備軟體執行的作業環境 (如網路、時區等); step6. init 執行 run-level 的各個服務之啟動 (script 方式); step7. init 執行 /etc/rc.d/rc.local 檔案; step8. init 執行終端機模擬程式 mingetty 來啟動 login 程式,最後就等待使用者登入啦; ## 進入BIOS後(以Linux核心為例) 上電 -> 電腦硬體讀取BIOS : 載入硬體資訊及進行硬體系統的自我測試 -> 系統會主動去尋找第一個可開機的裝置 (由 BIOS 設定的),接著做讀取的動作 -> 讀取開機管理程式(Boot Loader) 開機管理程式之行動 : 1. 可以指定使用哪個核心檔案來開機 2. 實際載入核心到記憶體當中解壓縮與執行 3. 透過步驟1、2,使核心能夠開始在記憶體內活動,並偵測所有硬體資訊與載入適當的驅動程式來使整部主機開始運作 4. 等核心偵測硬體與載入驅動程式完畢後,輪到作業系統開始在 PC 上執行 4-1. Linux 會呼叫外部程式開始準備軟體執行的環境 4-2. 載入所有系統運作所需要的軟體程式,最後系統開始等待使用者的登入與操作 ## BIOS(Basic Input Output System)介紹 BIOS 啟動電腦之後,BIOS 會啟始螢幕和鍵盤並測試主記憶體。在此階段中,機器不會存取大量儲存媒體。接著,並且藉由 CMOS 內的設定值取得主機的各項硬體設定,並載入目前日期、時間和最重要的周邊,如 : 1. 設定 CPU 與周邊設備的溝通時脈 2. 開機裝置的搜尋順序 3. 硬碟的大小與類型 3. 系統時間 4. 各周邊匯流排的是否啟動 Plug and Play (PnP, 隨插即用裝置) 5. 各周邊設備的 I/O 位址 6. CPU 溝通的 IRQ 岔斷 7. etc 在取得這些資訊後,BIOS 還會進行開機自我測試 (Power-on Self Test, POST) (註1)。 然後開始執行硬體偵測的初始化,並設定 PnP 裝置,之後再定義出可開機的裝置順序, 接下來就會開始進行開機裝置的資料讀取了 (MBR 相關的任務開始)。 # 識別第一個硬碟及其規格之後,系統控制將會從 BIOS 轉到開機載入程式。如果 BIOS 支援網路開機,則也可以設定提供開機載入程式的開機伺服器。在 x86 系統上,需要 PXE 開機。其他架構通常使用 BOOTP 通訊協定來取得開機載入程式。 由於我們的系統軟體大多放置到硬碟中嘛!所以 BIOS 會指定開機的裝置好讓我們可以讀取磁碟中的作業系統核心檔案。 但由於不同的作業系統他的檔案系統格式不相同,因此我們必須要以一個開機管理程式來處理核心檔案載入 (load) 的問題, 因此這個開機管理程式就被稱為 Boot Loader 了。那這個 Boot Loader 程式安裝在哪裡呢?就在開機裝置的第一個磁區 (sector) 內,也就是我們一直談到的 MBR (Master Boot Record, 主要開機記錄區)。 那你會不會覺得很奇怪啊?既然核心檔案需要 loader 來讀取,那每個作業系統的 loader 都不相同, 這樣的話 BIOS 又是如何讀取 MBR 內的 loader 呢?很有趣的問題吧!其實 BIOS 是透過硬體的 INT 13 中斷功能來讀取 MBR 的,也就是說,只要 BIOS 能夠偵測的到你的磁碟 (不論該磁碟是 SATA 還是 IDE 介面),那他就有辦法透過 INT 13 這條通道來讀取該磁碟的第一個磁區內的 MBR 啦!(註2) 這樣 boot loader 也就能夠被執行囉! ## 參考資料 > [BIOS, 開機自我測試與 MBR](https://linux.xgqfrms.xyz/linux_basic/0510osloader.htm#startup_intro) > [BIOS 啟動電腦之後,BIOS 會啟始螢幕和鍵盤並測試主記憶體](http://www.novell.com/zh-tw/documentation/sles11/book_sle_admin/data/sec_boot_proc.html) > [BIOS 是一個預先安裝好的 firmware,存放於主機版上](https://silverwind1982.pixnet.net/blog/post/358594004) > [一般電腦主機的開機程序如下](https://dic.vbird.tw/network_project/oldpage/master-chap08.pdf) > [開機流程簡介](https://dywang.csie.cyut.edu.tw/dywang/linuxSystem/node81.html) > [開機流程分析](https://linux.vbird.org/linux_basic/mandrake9/0510osloader.php) > [Linux – 開機流程](https://benjr.tw/67) > [CentOS 開機流程詳解](https://www.readfog.com/a/1652240067229487104) > [Linux 開機流程簡介](https://ithelp.ithome.com.tw/articles/10205953) > [Home > LinuxLinux > 開機流程簡介](https://www.ltsplus.com/linux/linux-boot-process) > [史上最详细linux启动过程讲解---没有之一](https://cloud.tencent.com/developer/article/1114481) > [csie.ntu.edu.tw](https://www.csie.ntu.edu.tw/~b91053/web/exp1/compare_lilo_grub.txt) > [嵌入式系統平台開機載入程式之移植](https://tpl.ncl.edu.tw/NclService/pdfdownload?filePath=lV8OirTfsslWcCxIpLbUfvtkl6y56mnsrLRhhsYOhwJ5R8py-J1cTmCiokqpURMz&imgType=Bn5sH4BGpJw=&key=479Vte-BYIc_x6VdDJyJyk1vFWwLN2eo1asGnJEs32aKgWSYS08VnQ==&xmlId=0006781824) > [Linux 開機流程詳解](https://www.linuxprobe.com/linux-bios-mbr-grub-kernel.html)