计算机启动过程(万字长文)
一、計算機啟動的基本流程
當電源通電后,計算機系統的啟動過程始于主板上的固件,通常是BIOS(基本輸入/輸出系統)或UEFI(統一可擴展固件接口)。基本流程如下:
1、電源通電
用戶按下計算機電源按鈕,電源開始供給計算機各個組件。此時,CPU并沒有直接開始執行指令。
2、BIOS/UEFI
-
自檢: 電源通電后,控制權首先交給BIOS(或UEFI)固件。BIOS/UEFI負責進行自檢(POST,Power-On Self-Test)。在自檢過程中,BIOS/UEFI檢查計算機的硬件組件,確保它們正常工作。如果自檢發現問題,系統可能會發出蜂鳴聲或在屏幕上顯示錯誤信息。 -
初始化硬件: BIOS/UEFI在自檢完成后,開始初始化系統中的硬件組件,包括主板、內存、CPU、顯卡等。這確保這些硬件能夠在系統啟動時正常工作。
3、Boot Loader 引導加載程序
-
加載:一旦硬件初始化完成,BIOS/UEFI從預定義的引導設備(通常是硬盤或固態硬盤)中加載引導加載程序。BIOS確定從哪個設備引導計算機,例如硬盤、固態硬盤、光驅等。BIOS會嘗試加載設備上的引導扇區(boot sector)或引導記錄(boot loader)。 -
執行:引導加載程序被加載到內存中后,控制權傳遞給它。引導加載程序的任務是加載操作系統內核到內存,并將控制權傳遞給操作系統。
4、操作系統啟動
引導加載程序執行后,操作系統內核開始運行。操作系統初始化并接管計算機的控制。此時,用戶通常會看到操作系統的啟動畫面或登錄界面。
以上就是計算機通電后的基本工作流程。
sequenceDiagram participant 電源 participant BIOS/UEFI participant Boot Loader participant OS 電源->>BIOS/UEFI: 通電并交付控制權 BIOS/UEFI->>BIOS/UEFI: 自檢和初始化硬件 BIOS/UEFI->>Boot Loader: 從引導設備加載引導加載程序到內存 BIOS/UEFI->>Boot Loader: 交付控制權 Boot Loader->>OS: 從分區加載操作系統內核到內存 Boot Loader->>OS: 交付控制權 OS->>OS: 初始化并運行操作系統現代操作系統是從最古老的8086系統一步一步發展而來的,處理器廠商為了向后兼容,很多底層相關的原理都是一樣的(如果不兼容,就會丟棄市場份額)。
二、電源通電(系統上電)
1、用戶按下電源按鈕
計算機開機時,通常是通過前面板上的電源按鈕(Power button)來觸發硬件發出PWRSW#(Power Switch)信號的。基本流程如下:
-
1.連接電源按鈕: 電源按鈕通常是連接到主板上的一個小電路板或電纜上的。這個電路板上有一個按鈕,用戶按下按鈕就能觸發電源信號。 -
2.PWRSW#信號: PWRSW#是一個開關信號。按下電源按鈕時,這個信號會從低電平(通常是地GND)變為高電平,然后再變回低電平。這種變化可以被主板的電路所感知。 -
3.EC接收信號:嵌入式控制器(Embedded Controller EC)接收到PWRSW#信號,標志著電源啟動過程的開始。
電源按鈕和主板連接: 電源按鈕通過一組線纜連接到主板上的一個特定的連接器(插腳),通常被標記為"PWRSW"(Power Switch),PWRSW#就是通過其發送給主板。
2、嵌入式控制器(Embedded Controller EC)
嵌入式控制器EC是掛在CPU的LPC(Low Pin Count)總線下的一顆嵌入主控芯片,嵌入式控制器的目的是幫助計算機(主要是筆記本)管理低速外設,像觸摸板、矩陣鍵盤等,最重要的是計算機通過EC來做電源管理。
EC啟動電源的流程:
-
1.EC通知PMU: 主板上通常集成了一個電源管理電路(Power Management Circuit,PMU),EC通過一個特定的線路通知PMU啟動電源。 -
2.PMU啟動PSU: 電源管理電路發出啟動信號(一個由PMU產生的數字信號或電壓信號)后,會激活電源供應單元(Power Supply Unit,PSU),使其開始為計算機各個部分提供電源,這個線路通常被稱為“電源啟動”(PS-ON)線路。 -
3.PSU啟動并供電:一旦接收到啟動信號,PSU開始啟動,并向計算機的各個部分提供電源。
3、電源供應單元(Power Supply Unit,PSU)
基本流程
電源供應單元(Power Supply Unit,PSU)是計算機硬件的關鍵組件之一,它負責將來自電源的交流電(AC)轉換為計算機內部電子設備所需的直流電(DC),PSU(電源供應單元)通過內部的電壓監控電路來確定各個部分的電壓是否已經穩定。以下是這個過程的詳細描述:
-
1.PSU啟動并供電:一旦接收到啟動信號,PSU開始啟動,并向計算機的各個部分提供電源。 -
2.電壓監控電路:PSU內部有一個電壓監控電路,這個電路會實時監控PSU的所有輸出電壓。 -
3.電壓檢測:電壓監控電路會檢測每個輸出電壓是否已經達到他們的正常值。例如,+12V的輸出電壓是否已經穩定在+12V,+5V的輸出電壓是否已經穩定在+5V,等等。 -
4.電源正常信號:當電壓監控電路檢測到所有的輸出電壓都已經穩定在他們的正常值時,它會觸發一個名為“電源正常”(POWERGOOD#或者PWROK#)的信號。這個信號是一個電壓信號,通常在+5V左右。
當開關電源啟動之后,如果交流輸入電壓在額定范圍之內,且各路直流輸出電壓達到允許的最低檢測值(+5V 輸出為4.75V 以上),那么經過100ms~500ms 的延時,P.G.電路就會發出“電源正常”的信號(P.OK 為高電平)。當電源交流輸入電壓降至安全工作范圍以下或+5V電壓低于4.75V 時,電源會送出“電源故障”信號(P.OK 為低電平)。P.G.信號非常重要,即使電源的各路直流輸出都正常,如果沒有P.G.信號或P.G.信號時序不對,都會造
成電腦不能開機。
供電順序
當電源供應單元(Power Supply Unit,PSU)收到啟動信號后,它會開始提供電源給計算機的各個部分。這個過程涉及到主板上的不同芯片組(例如南橋和北橋)、CPU、內存等組件。
以下是電源啟動后各個部分供電的一般順序:
-
電源供應單元啟動: 收到啟動信號后,電源供應單元開始運行。現代電源通常是開關電源,其內部電子元件調整輸出電壓,確保其符合計算機系統的要求。 -
CPU供電: 電源供應單元提供電源給CPU。這通常涉及多個電源軌道,包括主要的+12V軌道和輔助的+5V和+3.3V軌道。CPU通常有自己的電源規格,供電參數由主板上的電源轉換電路來管理。 -
內存供電: 電源供應單元還提供電源給主板上的內存模塊。內存通常需要+5V和+3.3V電源。 -
南橋和北橋供電: 電源供應單元繼續向主板上的芯片組提供電源。南橋和北橋是主板上的兩個關鍵芯片組,它們負責管理與I/O、存儲、網絡等相關的功能。南橋通常較為周邊,而北橋則更靠近CPU。現代計算機已經采用了集成的處理器(SoC)設計,其中 CPU 集成了原先北橋和南橋的功能。 -
擴展卡和外圍設備供電: 電源供應單元還為主板上的擴展卡(例如顯卡、網卡)和外圍設備提供電源。這些設備通常通過PCI Express插槽或其他連接器與主板相連。 -
啟動存儲設備供電: 存儲設備(如硬盤、固態硬盤)在電源啟動后也會得到電源供應,以便可以被訪問。
4、EC啟動CPU
當嵌入式控制器(EC)收到PWROK(或POWERGOOD)信號后,它會開始啟動計算機的啟動過程。以下是一些具體的步驟:
-
1.EC通知芯片組:EC監測來自電源供應單元(PSU)的PWROK信號,EC就會通知主板上的芯片組,發送名為PM_PWRBTN#的信號,開始計算機的啟動過程。 -
2.南橋和北橋的交互:南橋和北橋相互通信,確保電源管理的正常進行。南橋向北橋發送PLT_RST#信號,同時向CPU發送PWRGOOD#信號。 -
3.CPU啟動:北橋向CPU發送CPU_RST#信號(電平信號),通知CPU開始工作。此時,計算機的啟動過程正式開始。 -
4.EC啟動其他設備:在計算機啟動過程中,EC還可能負責啟動和管理其他設備,如冷卻風扇、硬盤驅動器等。 -
5.EC監控電源狀態:在整個啟動過程中,EC會繼續監控電源狀態。如果出現任何問題,EC會立即關閉電源以保護硬件。
CPU_RST#信號通過主板上的電路傳輸到CPU,CPU內部有一個專門的接口用于接收CPU_RST#信號。這個接口通常被稱為復位(Reset)引腳或復位線路。當CPU接收到CPU_RST#信號時,這個復位引腳會被激活,從而觸發CPU的復位過程,使CPU開始執行預設的啟動程序
三、BIOS
現代計算機基本都用UEFI替換了BIOS,但整體流程了原理是一致的,所以依然使用BIOS來說明CPU啟動操作系統的初始過程。
1、介紹
BIOS(基本輸入輸出系統)是一種在計算機啟動時運行的軟件,它負責初始化和測試計算機硬件,并加載操作系統。以下是關于BIOS的一些詳細信息:
-
1.功能:BIOS的主要功能是在計算機啟動時初始化和測試系統硬件(如CPU、內存、硬盤驅動器等),并加載操作系統。這個過程通常被稱為引導(booting)或啟動。 -
2.ROM存儲位置:BIOS通常存儲在主板上的一個ROM(只讀存儲器,BIOS程序占64K大小)芯片中。這個ROM芯片通常被稱為BIOS ROM。 -
3.POST:在計算機啟動時,BIOS會首先執行一個名為電源自檢(Power-On Self Test,POST)的過程。POST會檢查和測試計算機的硬件,確保所有硬件都正常工作。 -
4.啟動順序:BIOS會根據預設的啟動順序來查找啟動設備。這可能是硬盤驅動器、光驅、USB驅動器或者網絡。一旦找到啟動設備,BIOS就會加載設備上的啟動扇區到內存,并跳轉到那個地址來執行操作系統的加載程序。 -
5.設置:BIOS還提供了一個設置界面,通常被稱為BIOS設置或者CMOS設置。在這個界面中,用戶可以更改各種系統設置,如啟動順序、系統時間和日期、硬件參數等。
2、CPU加載BIOS
以32位CPU為例,接收到CPU_RST#信號后,會執行以下步驟來加載BIOS:
- CPU會將
指令指針寄存器(IP)設置為0xFFFFFFF0,這是CPU保留的最高的64KB的地址空間給BIOS使用的起始地址。(IP寄存器存儲了CPU要執行的下一條指令的地址) - CPU通過地址總線將
0xFFFFFFF0發送給ROM。ROM會根據地址總線上的地址,將對應的數據通過數據總線發送回CPU。CPU會將數據總線上的數據讀入指令寄存器(IR),然后解碼并執行。(IR寄存器存儲了CPU當前要執行的指令的內容) - 一般情況下,ROM中的
0xFFFFFFF0處的數據是一條跳轉指令,它會將IP寄存器的值修改為0xF0000,這是BIOS的實際入口地址。這樣,CPU就可以跳轉到0xF0000處,開始執行BIOS的代碼(在0xF0000到0xFFFFF之間,大小64K)。 - BIOS的代碼會對硬件進行檢測和初始化,然后加載操作系統的
引導程序(Boot Loader),最后將控制權交給操作系統。
擴展(可跳過)
1、為什么32位的CPU,在執行BIOS第一條指令時,要將值修改成了0xF0000
- 早期的IBM PC使用的是
16位的CPU,它的地址線有20位,可以尋址1MB的地址空間,即從0x00000到0xFFFFF。其中,最高的64KB的地址空間,即從0xF0000到0xFFFFF,是給ROM使用的,用于存儲BIOS的代碼。 - 當
16位的CPU啟動時,它會將IP寄存器的值設置為0xFFF0,然后從ROM中的0xFFF0處開始讀取BIOS的入口地址(一條跳轉指令),然后跳轉到0xF0000處執行BIOS的代碼。 - 后來,CPU的地址線增加到
32位,可以尋址4GB的地址空間,即從0x00000000到0xFFFFFFFF。但是,為了保持和早期的IBM PC的兼容性,CPU仍然保留了最高的64KB的地址空間給BIOS使用,也就是從0xFFFFFFF0到0xFFFFFFFF。 - 當32位的CPU啟動時,它會將IP寄存器的值設置為
0xFFFFFFF0,然后從ROM中的0xFFFFFFF0處開始讀取BIOS的入口地址,然后跳轉到0xF0000處執行BIOS的代碼。這樣,32位的CPU就可以和16位的CPU使用相同的BIOS代碼,而不需要修改。
因此,32位的CPU,在執行BIOS第一條指令時,將值修改成了0xF0000,是為了和16位的CPU保持一致,實現兼容性。
2、64位CPU的加載過程
64位CPU的啟動過程和32位CPU的啟動過程基本相同,只是有以下幾點不同:
- 64位CPU的地址線有64位,可以尋址更大的地址空間,從
0x0000000000000000到0xFFFFFFFFFFFFFFFF。 - 64位CPU的數據總線也有64位,可以一次傳輸更多的數據,提高了效率。
- 64位CPU的
指令指針寄存器(IP)和指令寄存器(IR)也有64位,可以存儲和執行更長的指令,增強了功能。 - 64位CPU在啟動時,會先進入兼容模式,即模擬32位CPU的工作方式,以保持和舊的BIOS的兼容性。在兼容模式下,CPU的地址線只使用32位,地址總線上的地址也只有32位,即從
0x00000000到0xFFFFFFFF。因此,CPU仍然會從0xFFFFFFF0開始讀取BIOS的入口地址,然后跳轉到0xF0000處執行BIOS的代碼。 -
BIOS的代碼會檢測CPU的類型,如果發現是64位CPU,就會切換到長模式,即64位CPU的正常工作方式。在長模式下,CPU的地址線使用64位,地址總線上的地址也有64位,即從0x0000000000000000到0xFFFFFFFFFFFFFFFF。這樣,CPU就可以尋址更大的地址空間,加載更大的操作系統。
四、Boot Loader
1、介紹
-
Boot Loader是一種程序,存儲在硬盤的特定區域,用于加載操作系統。它的作用是在BIOS完成硬件的檢測和初始化后,從硬盤或其他設備中讀取操作系統的核心文件,將其加載到內存中,然后將控制權交給操作系統,使其開始運行。 -
Boot Loader的功能是實現CPU從實模式到保護模式的切換,以及從硬盤到內存的數據傳輸。實模式是一種最簡單的內存管理模式,它只能尋址1MB的地址空間,而且沒有內存保護機制。保護模式是一種高級的內存管理模式,它可以尋址4GB(32位)的地址空間,而且有內存保護機制。操作系統一般都是在保護模式下運行的,因此,Boot Loader需要將CPU從實模式切換到保護模式,才能加載操作系統。 -
Boot Loader的原理是利用硬盤的分區表,文件系統的信息,以及操作系統的核心文件,實現從實模式到保護模式的切換,以及從硬盤到內存的數據傳輸。
硬盤是一種非易失性的存儲設備,它可以長期保存數據,但是它的速度較慢,而且不能直接被CPU執行。內存是一種易失性的存儲設備,它可以短期保存數據,但是它的速度較快,而且可以直接被CPU執行。操作系統需要在內存中運行,因此,Boot Loader需要將硬盤中的操作系統的核心文件讀取到內存中,才能啟動操作系統。
2、種類
Boot Loader的類型有很多,不同的操作系統和硬件平臺可能使用不同的Boot Loader。常見的Boot Loader有以下幾種:
-
GRUB:全稱為GNU GRand Unified Bootloader,是一種開源的,多操作系統的,可配置的Boot Loader,支持Linux,Windows,FreeBSD等多種操作系統,以及多種硬件平臺,如x86,x86_64,ARM等。GRUB的特點是可以在啟動時提供一個菜單,讓用戶選擇要啟動的操作系統,也可以在菜單中修改啟動參數,或者進入命令行模式,執行一些高級的操作。 -
LILO:全稱為LInux LOader,是一種早期的,專用于Linux的Boot Loader,支持Linux和DOS等操作系統,以及x86硬件平臺。LILO的特點是簡單,穩定,但是不夠靈活,不能在啟動時修改啟動參數,也不能支持多種文件系統,如FAT32,NTFS等。 -
NTLDR:全稱為NT Loader,是一種專用于Windows NT系列的Boot Loader,支持Windows NT,2000,XP,Server 2003等操作系統,以及x86硬件平臺。NTLDR的特點是可以在啟動時提供一個菜單,讓用戶選擇要啟動的操作系統,也可以在菜單中修改啟動參數,或者進入恢復控制臺,執行一些修復的操作。 -
BOOTMGR:全稱為Boot Manager,是一種專用于Windows Vista及以后的Boot Loader,支持Windows Vista,7,8,10,Server 2008等操作系統,以及x86,x86_64,ARM等硬件平臺。BOOTMGR的特點是可以在啟動時提供一個菜單,讓用戶選擇要啟動的操作系統,也可以在菜單中修改啟動參數,或者進入高級啟動選項,執行一些高級的操作。
3、BIOS通過Boot Loader加載OS
- BIOS在完成硬件的檢測和初始化后,會讀取
CMOS中的設置,確定要從哪個設備啟動,比如硬盤,光盤,U盤等。(CMOS是一種可讀寫的存儲器,用于保存BIOS的配置信息) - BIOS會根據CMOS中的設置,選擇一個啟動設備(通常是硬盤),通過INT 13h中斷調用來訪問硬盤,然后讀取該設備的第一個扇區,也就是
主引導記錄(Master Boot Record MBR)。MBR是一個512字節的數據塊,包含了Boot Loader的一部分代碼,以及硬盤的分區表。 - BIOS會將MBR中的Boot Loader的代碼復制到內存的
0x7C00處,然后跳轉到該地址,執行Boot Loader的代碼。MBR中除了啟動代碼外,還包含一個分區表(Partition Table),它記錄了硬盤上的分區信息,包括每個分區的起始扇區、大小、類型和狀態(是否為活動分區)。 - MBR中的啟動代碼會根據
分區表來找到活動分區(Active Partition),也就是要啟動的操作系統所在的分區,然后從該分區的第一個扇區中讀取卷引導扇區(Volume Boot Record VBR)。VBR也是一個512字節的扇區,它包含了一個卷引導記錄(Volume Boot Record)和一個文件系統信息(File System Info)。 - MBR中的啟動代碼會將讀取到的
VBR復制到內存地址0x7C00處,覆蓋掉原來的MBR,然后跳轉到該地址執行VBR中的啟動代碼。VBR中的啟動代碼會根據文件系統信息來找到操作系統內核文件(OS Kernel File),這是一個可執行文件,它包含了操作系統的核心功能和服務。 - VBR中的啟動代碼會將讀取到的
OS Kernel File復制到內存中的一個合適的地址,然后跳轉到該地址執行OS Kernel File中的啟動代碼。這時,操作系統就開始運行了,它會接管計算機的控制權,初始化各種設備驅動和系統服務,然后加載用戶界面和應用程序,等待用戶的輸入。
至此計算機啟動就完成了,后續工作就交由操作系統了
擴展閱讀
主引導記錄MBR(Master Boot Record)
MBR是主引導記錄(Master Boot Record)的縮寫,它是一種存儲在硬盤的第一個扇區的數據塊,用于存儲Boot Loader的一部分代碼,以及硬盤的分區表。MBR的作用是在BIOS完成硬件的檢測和初始化后,從硬盤中讀取Boot Loader的代碼,將其加載到內存中,然后執行Boot Loader的代碼,從而啟動操作系統。
MBR的結構一般由以下幾個部分組成:
-
引導代碼區:這是MBR的主要部分,它存儲了Boot Loader的一部分代碼,用于從硬盤的分區表中找到操作系統所在的分區,然后讀取該分區的第一個扇區,也就是卷引導記錄(VBR)。VBR是一種存儲在硬盤分區的第一個扇區的數據塊,用于存儲Boot Loader的另一部分代碼,以及文件系統的信息。引導代碼區的大小和內容取決于具體的Boot Loader,一般占用MBR的大部分空間,約440字節左右。 -
磁盤簽名:這是MBR的一個可選部分,它存儲了一個32位的數據,用于標識硬盤的唯一性,以便于操作系統和應用程序識別和管理硬盤。磁盤簽名的大小和內容是可變的,一般占用MBR的4個字節。 -
保留字:這是MBR的一個固定部分,它存儲了一個16位的數據,用于填充MBR的空白部分,以便于MBR的對齊和校驗。保留字的大小和內容是固定的,其值為0x0000,占用MBR的2個字節。 -
分區表:這是MBR的一個重要部分,它存儲了硬盤的分區信息,如分區的類型,大小,位置,狀態,引導標志等。分區表是一個記錄了硬盤分區信息的數據結構,用于告訴BIOS和操作系統硬盤的結構和位置。分區表的大小和內容取決于具體的硬盤,一般占用MBR的最后64個字節,包含4個分區表項,每個分區表項占用16個字節。 -
結束標志:這是MBR的一個固定部分,它存儲了一個16位的數據,用于標識MBR的結束,其值為0x55AA。結束標志的作用是告訴BIOS和Boot Loader這是一個有效的MBR,可以執行其中的引導代碼。結束標志的大小和內容是固定的,占用MBR的最后兩個字節。
卷引導記錄VBR(Volume Boot Record)
VBR是卷引導記錄(Volume Boot Record)的縮寫,它是一種存儲在硬盤分區的第一個扇區的數據塊,用于存儲Boot Loader的一部分代碼,以及文件系統的信息。VBR的作用是在MBR中的Boot Loader將CPU從實模式切換到保護模式后,從硬盤分區中讀取操作系統的核心文件,將其加載到內存中,然后將控制權交給操作系統,使其開始運行。
VBR的結構一般由以下幾個部分組成:
-
引導代碼區:這是VBR的主要部分,它存儲了Boot Loader的一部分代碼,用于從文件系統中讀取操作系統的核心文件,將其加載到內存中,然后跳轉到該地址,執行操作系統的代碼。引導代碼區的大小和內容取決于具體的Boot Loader和文件系統,一般占用VBR的大部分空間,約400字節左右。 -
BPB(BIOS Parameter Block):這是VBR的一個重要部分,它存儲了文件系統的基本信息,如扇區大小,簇大小,保留扇區數,FAT表數,根目錄項數,總扇區數,卷標,文件系統類型等。BPB的作用是告訴Boot Loader和操作系統文件系統的結構和位置,以便正確地讀取文件和目錄。BPB的大小和內容取決于具體的文件系統,一般占用VBR的前面部分,約60字節左右。 -
擴展引導代碼區:這是VBR的一個可選部分,它存儲了一些額外的引導代碼,用于實現一些高級的功能,如錯誤處理,菜單選擇,密碼驗證等。擴展引導代碼區的大小和內容取決于具體的Boot Loader和文件系統,一般占用VBR的后面部分,約50字節左右。 -
結束標志:這是VBR的一個固定部分,它存儲了一個16位的數據,用于標識VBR的結束,其值為0x55AA。結束標志的作用是告訴BIOS和Boot Loader這是一個有效的VBR,可以執行其中的引導代碼。結束標志的大小和內容是固定的,占用VBR的最后兩個字節。
INT 13h
INT 13h是一個BIOS提供的中斷服務,它可以讓Boot Loader訪問硬盤的任意扇區,而不需要知道硬盤的具體類型和參數。通過INT 13h,Boot Loader可以根據文件系統信息來定位OS Kernel File的位置,然后讀取它到內存中。
INT 13h是一個很方便的服務,它可以屏蔽硬盤的底層細節,讓Boot Loader只需要關注如何加載操作系統。如果沒有INT 13h,Boot Loader就需要自己實現硬盤的驅動程序,這會增加Boot Loader的復雜度和大小,而Boot Loader的空間是非常有限的,只有512字節。
總結
以上是生活随笔為你收集整理的计算机启动过程(万字长文)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 23.04、22.04、2
- 下一篇: 十分钟教你在 k8s 中部署一个前后端应