插個題外話,開機啟動的英文是boot,boot 是靴子的意思,為什么啟動叫boot呢。boot是bootstrap(鞋帶)的縮寫,它來自一句諺語:
"pull oneself up by one's bootstraps""拽着鞋帶把自己拉起來",這件事情就相當的矛盾了。 工程師用它來比喻,開機啟動是一個很矛盾的過程,既要先運行程序,然后計算機才啟動,但是不運行計算機就沒法運行程序!
階段一:基本輸入/輸出系統 BIOS
Basic I/o System(Firmware,固件)
- 基本輸入/輸出系統
位置:F0000-FFFFF
功能
- 系統啟動配置
- 基本的設備I/O服務
- 系統的加電自檢和啟動(POST)
加電自檢(POST)
BIOS首先檢查,計算機的硬件能否滿足運行的情況,這叫“加電自檢”(Power-On Self-Test, POST)。
如果出現問題,主板會發出不同的蜂鳴。
如果沒有檢查出問題,則會初始化基本硬件,cpu,內存,顯卡等。
POST之后···
BIOS將控制權轉移到下一個啟動程序,下一個啟動程序在哪兒呢?BIOS有一個外部存儲的設備的排序,排在前面的設備具有更高的優先權。這種排序叫“啟動順序”
打開BIOS,其中有一項就是設定“啟動順序”
默認情況下,按照如下順序執行:
- 查找顯卡BIOS,調用顯卡BIOS;
- 依次查找其它設備執行相應設備的BIOS;
- 顯示啟動畫面: BIOS信息||芯片組型號Al主板信息|
- 從硬盤/軟盤/光驅/U盤讀入OS
- 啟動后,由OS接管計算機
階段二:主啟動記錄MBR
BIOS按照“啟動順序”,把控制權轉交給優先級排在第一位的存儲設備。
計算機讀取設備的第一個扇區,即最前面的512字節,如果最后兩個字節是0x55、0xAA,則表明該設備可以用來啟動,否則控制權轉移到下一個設備。
這512字節的區域,就叫做主啟動記錄(Master boot record, MBR)
MBR
- 存放在硬盤軟盤的首扇區
- 存放和OS啟動的相關信息(Main Boot Record)
- 大小:512BYTES
- 結束位置:0x55、0xAA
主引導記錄結構
MBR的空間太小了,存不了什么東西,它的主要作用是告訴計算機去硬盤的哪個位置找操作系統。類似一張索引表,告訴你操作系統在哪里。
MBR由三個部分組成:
- 第1-446字節:調用操作系統的機器碼。
- 第447-510字節:分區表(Partition table)。
- 第511-512字節:主引導記錄簽名(0x55和0xAA)。
分區
分區可以將磁盤分成多個區域,每個區可以安裝不同的操作系統,所以MBR必須知道將控制權轉移給哪一個分區。得到控制權的分區稱為“活動分區”(active partition)
分區表的長度只有64個字節,里面又分成四項,每項16個字節。所以,一個硬盤最多只能分四個一級分區,又叫做"主分區"。共四個主分區。
階段三:磁盤分區
這個時候,控制權到了某個分區的手里。這里有三種情況加載操作系統。
情況A:卷引導記錄
四個分區里面只有一個會被激活,即活動分區,接着,計算機會激活活動分區的扇區,稱為“卷引導記錄”(Volume boot record, VBR)
VBR告訴計算機操作系統的位置,計算機直接根據相應的位置加載出操作系統
情況B:拓展分區和邏輯分區
隨着硬盤越來越大,四個主分區已經不夠了,需要更多的分區。但是,分區表只有四項,因此規定有且僅有一個區可以被定義成"擴展分區"(Extended partition)。
拓展分區里面有可以分成多個分區,這里面的分區叫“邏輯分區”(logical partition)。
計算機先讀取拓展分區的第一個扇區,叫做"擴展引導記錄"(Extended boot record,EBR)。
它里面也包含一張64字節的分區表,但是最多只有兩項(也就是兩個邏輯分區,自己本身和下一個邏輯分區的位置)。
接着, 計算機加載第二個邏輯分區的第一個扇區,再從里面的分區表找到第三個邏輯分區的位置,以此類推,知道某個邏輯分區的分區表只包含自己本身為止。這個過程可以用鏈表來表示。
情況C:啟動管理器
MBR讀取完機器碼之后,不直接把控制權轉移給某一個分區,而是運行事先安裝的啟動管理器(boot loader),由用戶自己選擇啟動哪一個操作系統。
Linux環境中,目前最流行的啟動管理器是Grub。
階段四:操作系統
計算機定位到操作系統后,先加載操作系統的內核,根據操作系統自己的加載過程完成全部的啟動過程。
linux
以Linux系統為例,先載入/boot目錄下面的kernel。內核加載成功后,第一個運行的程序是/sbin/init。它根據配置文件(Debian系統是/etc/initab)產生init進程。這是Linux啟動后的第一個進程,pid進程編號為1,其他進程都是它的后代。
然后,init線程加載系統的各個模塊,比如窗口程序和網絡程序,直至執行/bin/login程序,跳出登錄界面,等待用戶輸入用戶名和密碼。