操作系統的啟動過程



插個題外話,開機啟動的英文是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,其中有一項就是設定“啟動順序”

默認情況下,按照如下順序執行:

  1. 查找顯卡BIOS,調用顯卡BIOS;
  2. 依次查找其它設備執行相應設備的BIOS;
  3. 顯示啟動畫面: BIOS信息||芯片組型號Al主板信息|
  4. 從硬盤/軟盤/光驅/U盤讀入OS
  5. 啟動后,由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程序,跳出登錄界面,等待用戶輸入用戶名和密碼。

參考:

  1. 計算機是如何啟動的?
  2. Linux開機啟動流程詳細步驟是什么


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM