計算機系統是如何啓動的?

本文是操作系統系列的第一篇文章,以BIOS-MBR啓動過程爲例,介紹計算機系統是如何啓動的。原文鏈接,更多內容見公號機器學習與系統,歡迎與我互動~

概覽

計算機系統的啓動過程是非常複雜的,也誕生了很多流派,比如BIOS-MBR啓動方式、UEFI-GPT啓動方式等。不管是哪個流派,廣義上的啓動過程是類似的,以BIOS-MBR爲例,可以簡化爲如下步驟:

  1. 計算機通電,硬件初始化
  2. 執行BIOS,進行硬件檢測,確定啓動設備
  3. 主引導記錄(MBR),包含引導操作系統的相關信息
  4. 啓動加載器,開始於MBR中的加載程序,結束語操作系統運行
  5. 執行操作系統內核,計算機完成啓動

計算機通電

計算機通電後,CPU中的執行地址會初始化爲BIOS的地址,然後開始加載執行BIOS程序。這裏面的BIOS程序是筆記本廠商出廠時就寫入到ROM中的。至於ROM中BIOS的執行地址,則根據處理器手冊約定值進行設定

不同的CPU在執行BIOS前的操作不同,以x86指令集架構CPU爲例,指令地址由CS、IP兩個寄存器構成,CS:IP初始化指向ROM中的一條指令,該指令是跳轉指令,它跳轉到BIOS的地址。而且,該CPU啓動過程中,還需要完成從實模式到保護模式的轉變。

BIOS

BIOS全稱基本輸入輸出系統(Basic Input/Output System),它主要提供以下幾個功能:

  1. 硬件接口,提供基本和硬件交互的接口,如基本的輸入/輸出功能
  2. 進行硬件檢測,讀取硬件信息
  3. 查找並加載可啓動設備

硬件接口

BIOS首先提供的就是基本的輸入/輸出功能,通過中斷的方式實現,比如INT 10h: 字符顯示INT 13h: 磁盤扇區讀寫INT 15h: 檢測內存大小INT 16h: 鍵盤輸入

通過這些功能,用戶可以設置啓動順序,也支撐後面的硬件自檢。

硬件自檢

BIOS運行後,首先進行通電自檢(Power-On Self-Test)。這一過程中,會對CPU、內存等設備進行檢測,查看是否有異常,如果有異常,會發出對應錯誤信息(如蜂鳴聲)。接着會對硬件進行初始化,比如:

  • 初始化內存,讓CPU得以訪問這些硬件
  • 監聽I/O總線,識別連接到計算機上的硬盤、網卡、PCI等設備

完成檢測之後,BIOS 會輸出檢測結果,相關的硬件配置也會被更新到 CMOS 存儲器上。

啓動設備

完成通電檢測之後,BIOS會尋找第一個啓動設備。

啓動設備裏存放着操作系統代碼和啓動配置信息。計算機可以有多個硬件啓動設備,如硬盤、優盤、DVD、網絡啓動設備等。BIOS根據開機檢測得到可啓動的設備列表,默認從第一個設備啓動,用戶可以進入BIOS設置啓動順序。下面是尋找並加載啓動設備的簡單過程:

  1. 讀取啓動設備第一個扇區中的內容到內存,並跳轉到該地址執行扇區中的啓動代碼
  2. 如果設備內容不合法,則回到BIOS,按照啓動順序加載下一個啓動設備。直到找到可啓動的設備,如果沒有,則發出異常。

主引導記錄

BIOS-MBR啓動流派中,啓動設備的第一個扇區的內容稱爲主引導記錄(MBR,Master Boot Record),它的結構如下:

  1. 第1-446字節:啓動過程比較簡單的話,這部分代碼會加載操作系統到內存,然後跳轉到內存上的OS執行代碼,完成啓動過程。如果啓動過程很複雜,啓動代碼會加載並執行另一個程序,由該程序完成後續啓動過程
  2. 第447-510字節:設備分區表(Partition table),描述4個主分區的詳細信息,包括該分區的起始位置、文件系統和可用狀態等
  3. 第511-512字節:主引導記錄簽名(0x55和0xAA),標誌當前扇區是否合法,不合法(不是55AA),會跳回BIOS尋找下一個啓動設備

啓動代碼

簡單來講,啓動代碼負責把扇區中的操作系統代碼加載到內存,然後執行操作系統代碼。對於不同的操作系統,這一加載過程可能會有所不同。

這部分只有446字節,啓動代碼能做的事情是有限的,

啓動管理器

啓動管理器(BootLoader)主要工作是把操作系統代碼加載到內存,然後跳轉到內存執行操作系統代碼。

如果啓動過程很簡單,比如MBR中的啓動代碼直接加載執行操作系統代碼,那麼MBR中的啓動代碼就可以理解爲啓動管理器。

對於複雜的啓動過程,加載操作系統代碼由一系列軟件完成,我們就認爲這一些列軟件構成啓動管理器它開始於MBR的啓動代碼,結束於系統內核的啓動

操作系統

內存中的操作系統開始執行,首先運行的是內核程序。以Linux爲例,內核加載成功後,第一個運行的程序是/sbin/init,它根據配置文件(Debian系統是/etc/initab)產生init進程。這是Linux啓動後的第一個進程,pid進程編號爲1,其它進程都是它的後代。

然後,init線程加載系統中的各個模塊,比如窗口管理器和網絡管理器,直至執行用戶登錄程序,跳出登錄界面,等待用戶輸入用戶名和密碼。

至此,啓動過程完成。

相關問題

爲什麼BIOS不直接加載OS代碼?

  1. 磁盤上是文件系統,文件系統多種多樣,BIOS程序很小,無法兼顧這些文件系統。
  2. 所以實現一個能識別文件系統類型的加載程序(bootloader),由bootloader來加載OS代碼。
  3. bootloader按照約定存在磁盤的第一個扇區,並且遵循一定的格式。

爲什麼MBR啓動過程不支持大於2TB的硬盤?

主引導記錄中規定了啓動設備的分區和詳細信息,每個扇區大小爲512字節,MBR分區表中規定扇區數量的大小爲4字節。一個字節是8bit,4字節就是32bit,能表示的最大數是232。這樣最大扇區數=512byte*232位=2TB。

綜上,MBR能支持的最大硬盤的大小取決於扇區的大小和扇區數。這兩個數得到的上限是2TB。

總結

BIOS-MBR啓動過程是經典的計算機啓動過程,它的很多思想對後續的啓動過程有很多影響。但是它不是唯一的啓動過程,因爲誕生比較早,存在一些缺陷,更現代的啓動流派是UEFI+GPT方式。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章