操做系統老師說,平時面試學生或者畢業答辯的時候他都會問這個問題,可見這個問題對於計算機專業的學生來講是如此重要。那麼,從打開計算機電源到計算機的屏幕顯示,中間經歷了哪些過程呢?面試
啓動的英文是boot
,來自於一個諺語bootstrap
pull oneself up by one's bootstraps
經過拉本身的鞋帶把本身拽起小程序
這個很明顯是矛盾的。工程師早期用這句諺語用來比喻早期的計算機開機, 由於計算機啓動須要運行程序,而運行程序又須要計算機啓動。這個是一個很矛盾的過程。直到後來開機程序被刷入ROM
芯片後,這個開機的boot
安全
大概過程是這樣的:網絡
Turn on異步
CPU jump to physical address of BIOS(In Intel it is 0xFFFF0)模塊化
BIOS runs POST(Power-On Self Test)函數
Find bootable devices性能
Loads boot sector from MBRspa
BIOS yields control to OS BootLoader
BIOS介紹:
BIOS(Basic Input/Output System)是基本輸入輸出系統的簡稱。BIOS 能爲電腦提供最低級、最直接的硬件控制與支持,是聯繫最底層的硬件系統和軟件系統的橋樑。爲了在關機後使 BIOS 不會丟失,早期的 BIOS 存儲在 ROM 中,而且其大小不會超過 64KB;而目前的 BIOS 大多有 1MB 到 2MB,因此會被存儲在 閃存(Flash Memory)中。
BIOS 設置程序是被固化到電腦主板上地 ROM 芯片中的一組程序,其主要功能是爲電腦提供最底層的、最直接的硬件設置和控制。 BIOS 一般與 硬件系統集成在一塊兒(在計算機主板的 ROM 或EEPROM 中),因此也被稱爲 固件
如何運行
BIOS存放在一個斷電後不會丟失內容的ROM中,這保證了「拽着鞋帶拉起本身」的這種狀況不會發生。由於系統一上電或重置,處理器要執行第一條指令的地址會被定位到BIOS存儲器,初始化開始運行。在X86系統中,CPU加電後跳轉至BIOS的固定物理地址0xFFFF0。 打開計算機電源,計算機會首先加載BIOS,包含
CPU相關信息設備啓動順序信息硬盤信息內存信息時鐘信息PhP特性...
硬件自檢(Power-On Self Test,POST) 若是硬件出現問題,主板會發出不一樣含義的蜂鳴 ,啓動停止。若是沒有問題,屏幕就會顯示出CPU 、內存、硬盤等信息。BIOS在執行完硬件自檢和初始化後,會將本身複製到從 0xA0000 開始的物理內存中並繼續執行。
BIOS 代碼包含診斷功能,以保證某些重要硬件組件,像是鍵盤、磁盤設備、輸出輸入端口等等,能夠正常運做且正確地初始化。
BIOS產生的問題
•開發效率低:大部分BIOS代碼使用匯編開發,開發效率不言而喻。彙編開發的另外一個缺點是使得代碼與設備的耦合程度過高,代碼受硬件變化的影響大。•性能差:BIOS基本輸入/輸出服務須要經過中斷來完成,開銷大,而且BIOS沒有提供異步工做模式,大量的時間消耗在等待上。•功能擴展性差,升級緩慢:BIOS代碼採用靜態連接,增長硬件功能時,必須將16位代碼放置在0x0C0000~0x0DFFFF區間,初始化時將其設置爲約定的中斷處理程序。並且BIOS沒有提供動態加載設備驅動的方案•安全性:BIOS運行過程當中對可執行代碼沒有安全方面的考慮。•不支持從硬盤2TB以上的地址引導:受限於BIOS硬盤的尋址方式,BIOS硬盤採用32位地址,於是引導扇區的最大邏輯塊地址是232(換算成字節地址,即232×512=2TB)
因爲這些問題的存在,UEFI
橫空出世
UEFI中文名爲統一可擴展固件界面(英語:Unified Extensible Firmware Interface,縮寫UEFI)是一種我的電腦系統規格,用來定義操做系統與系統硬件之間的軟件界面,做爲BIOS的替代方案。可擴展固件接口負責加電自檢(POST),聯繫操做系統以及提供鏈接做業系統與硬體的介面。
UEFI與BIOS的幾個區別
一、EFI使用模塊化、C語言風格的參數堆棧傳遞方式以及動態連接形式構建的系統,相對於BIOS而言跟容易實現,容錯和糾錯特性更強,減小系統研發的時間。
二、運行於32位或64位模式,面對將來加強的處理器模式下,能突破BIOS 16位代碼的尋址能力,達處處理器最大尋址。
三、UEFI有良好的鼠標操控圖形化界面,在開機速度也比BIOS快很多
BIOS過程
UEFI過
相對來講UEFI比BIOS少了一個硬件檢測
即便如此,本章啓動過程仍是着重於分析利用BIOS啓動的過程。
MBR-全稱是Master Boot Record(主引導記錄或主開機記錄),是一個512byte的扇區,位於磁盤的固定位置。之因此叫「主引導記錄」,是由於其存在於驅動器開始部分的一個特殊扇區,個扇區包含已安裝的操做系統啓動記載器和驅動器的邏輯分區信息。BIOS完成POST和初始化以後,會根據CMOS中設定的順序選擇引導的設備,這個設備能夠是U盤能夠是硬盤。若設置爲硬盤,則BIOS就會讀取MBR。MBR裏面包含了一段引導程序,一個分區表和Magic Number。
MBR的結構
位置 | 做用 |
1-445字節 | 調用操做系統的機器碼(Call OS) |
447-510字節 | 分區表(Partition table) |
511-512字節 | 主引導記錄簽名(只有兩個,0x55和0xAA,爲Magic Number),若是不是這兩個幻數,就認爲這是一個沒有被分區的硬盤。 |
分區表的長度只有64個字節,裏面分爲四項,每項爲16個字節。因此一個硬盤只能夠分四個一級分區,又叫作「主分區」。每一個主分區的16個字節,結構以下
位置(字節) | 做用 |
1 | 若是第一個爲0x80,表示該主分區是激活分區(active),控制權將轉交給此分區。幾個分區中只能有一個是激活分區,其餘都是非激活分區(inactive)。 |
2-4 | 主分區的第一個扇區物理位置(柱面、磁頭、扇區號等) |
5 | 主分區的類型 分區類型符 |
6-8 | 主分區最後一個扇區的物理位置 |
9-12 | 主分區第一個扇區的邏輯位置 |
13-16 | 主分區的扇區總數,決定了主分區的長度 |
其中第5字節分區類型符,有以下特定符
00H H —— 表示該分區未用 ( 即沒有指定 ) ;
06H H —— FAT 16 基本分區;
0 0 BH —— FAT 32 基本分區;
05H H —— 擴展分區;
07H H —— NTFS 分區;
0 0 FH —— ( LBA 模式 ) 擴展分區 (83H H 爲 Linux)
分出主分區後,其他的部分能夠分紅擴展分區,通常是剩下的部分所有分紅擴展分區,也能夠不全分,剩下的部分就浪費了。擴展分區不能直接使用,必須分紅若干邏輯分區。全部的邏輯分區都是擴展分區的一 部分 。
硬盤的容量 = 主分區的容量 + 擴展分區的容量擴展分區的容量 = 各個邏輯分區的容量之和
*Linux的Boot的過程 *
Boot Loader
又叫作 操做系統內核加載器(OS kernel loader),一個在kernel
運行前運行的一段小程序,經過這段程序能夠初始化硬件設備,創建內存空間的映射,將系統軟硬件環境帶到一個合適的狀態,便於將來調用操做系統內核。
Linux下引導加載程序常見兩種LILO[1]和GNU GRUB[2]
LILO | GRUB |
無交互命令界面 | 有交互命令界面 |
不支持網絡引導 | 支持 |
錯誤配置MBR會讓系統沒法引導 | 若是配置文件錯誤,則默認跳轉到GRUB命令行界面 |
GRUB 磁盤引導的過程以下
- stage1: grub 讀取磁盤第一個 512 字節(硬盤的0道0 面1扇區,被稱爲 MBR (主引導記錄), 也稱爲bootsect )。 MBR 由一部分 bootloader 的引導代碼、分區表和魔數三部分組成。( 啓動的第二步 )- Stage1.5: 識別各類不一樣的文件系統格式。這使得 grub 識別到文件系統。- stage2: 加載系統引導菜單 (/boot/grub/ menu.lst或 grub.lst) ) ,加載內核映像 (kernel image) 和 RAM磁盤 initrd (可選)。
運行主引導程序的具體過程
BIOS將硬盤主引導記錄讀入7C00處,並將控制權交給主引導程序:
•檢查0x7dfe地址處是否等於0xaa55。不是則去其餘介質;若是沒有啓動的介質,顯示「No ROME BASIC」並死機。•成功找到介質,跳轉到0X7C00執行MBR的程序•將本身複製到0x0600處且繼續執行•主分區表中搜索標誌爲激活的分區,若是發現沒有激活分區或者不止一個激活分區則中止。•將激活分區的第一個扇區讀入內存地址0x7c00•再次檢查位於地址0x7dfe的內容是否等於0xaa55,若不等則中止並嘗試軟盤啓動•跳轉到0x7c00繼續執行特定系統的啓動程序
補充:MBR和引導扇區的關係
•MBR存放的位置是整個硬盤的第一個扇區•Boot Sector是硬盤上每個分區的第一個扇區
主要有兩個步驟:
根據 grub 設定的內核映像所在路徑 ,系統讀取內存映像 ,並進行解壓縮操 做 。
系統將解壓後的內核放置在內存之中, 初始化函數並初始化各類設備 , 完 成 Linux 核心環境的創建 。
以Linux系統爲例,先載入/boot目錄下面的kernel。
內核加載成功後,第一個運行的程序是/sbin/init。它根據配置文件(Debian系統是/etc/initab)產生init進程。這是Linux啓動後的第一個進程,pid進程編號爲1,其餘進程都是它的後代。
而後,init線程加載系統的各個模塊,好比窗口程序和網絡程序,直至執行/bin/login程序,跳出登陸界面,等待用戶輸入username和password。
至此,所有啓動過程完成。References
[1]
LILO: https://www.wikiwand.com/zh-hk/LILO[2]
GNU GRUB: https://www.wikiwand.com/zh/GNU_GRUB