1. 程式人生 > >按下電源鍵後發生了什麽?電腦是如何優雅地開機的?

按下電源鍵後發生了什麽?電腦是如何優雅地開機的?

可靠性 重定位 過多 設備 變換 發展 都在 輸入 在那

一個程序是如何開始運行的呢?這個問題,一千個人有一千種回答。電腦用戶說:“雙擊程序圖標就行了啊。”;初級程序員信心滿滿的回答:“是從main函數開始執行的。”;高級程序員也許會和你聊到c運行時庫,那裏才是程序編譯運行的第一條指令;而熟悉操作系統的專家卻並不知道如何說起,程序加載器、重定位、堆和棧的建立、進程和線程的創建等等細節閃過腦海,哪裏才是真正的源頭呢?

同樣問道計算機是如何啟動的,也許答案就是按下電源鍵而已。但在那個簡單到極致的動作後面卻隱藏了復雜的機理。啟動的開始並不僅僅是操作系統引導,亦或BIOS運行,甚至CPU在reset vector執行第一條指令之前,很多事情已經發生了。正如地球生命的發端並不由人類的到來而伊始,秘密隱藏在遠古而不為人知的遠古時代。讓我們順著時間回溯,站在一切發生的起點:“電源鍵按下”,通過時間的流轉,梳理其中所有的硬件軟件過程,來深入了解計算機的工作原理。

史前時代:上電時序

上電時序,也叫做Power-up Sequence,是指電源時序關系。它牽扯到諸多計算機部件,在正式開始時間之旅之前,我們來介紹一下所有參與的小夥伴們。

技術分享圖片

電源

ATX電源提供+12V、-12V、+5V、-5V、+3V和+5VSB等六種電壓。也就是我們圖上的兩個白色的電源接入口。主板其他的不同電壓是主板上的變壓線路轉換過來的,他們包括+3VSB、+1.5VSB、1.8VDual、2.5VDual、3VDual、VCore、VTDDR等等很多。

+12V主要是給CPU內核供電,它可以單獨給PCIe設備供電,包括顯卡等等。+5V應用最廣,給USB等等外設供電。+5VSB等各種帶SB的電壓,是提供Stand By的供電,即在S3 Sleep時提供電力,保障喚醒和刷新。

主板右邊中間那個紐扣電池,它叫做RTC電源,永不掉電。除非電池沒電並且沒接任何外部電源。 RTC用以保持機器內部時鐘的運轉和保證CMOS配置信息在斷電的情況下不丟失。

時鐘

電腦中的CPU,AGP、PCI插槽、SATA、USB端口和PS/2端口等在通信速度上有很大差異,所以需要提供不同的時鐘頻率。由ck410、ck505和iCLK等芯片將原先散布在不同地方的晶振和分頻電路整合在一起,為CPU、SATA、PCI、USB等等設備提供基礎頻率。

電源時序控制芯片/電路

主板對於上電的要求是很嚴格的,各種上電的必備 條件都要有著先後的順序,一項條件滿足後才可以轉到下一步,如果其中的某一個環節出現了故障,則整個上電過程不能繼續下去。誰來控制和協調整個時序過程呢?不同的主板、芯片組、代際之間都有不同的方案,在筆記本上過去經常采用EC的方案、臺式機則很多用SIO或者定制芯片,服務器上多用CPLD等等。現在很多電源時序控制被整合進了ME中,在面向嵌入式設備的Atom系列主板上則越來越多的引入了在手機等設備上常用的PMIC。

時間開始

我們通過一個古老的例子來了解一下開機的整個過程:

技術分享圖片

  1. 在G3(未接電源)情況下,RTC電源提供RTC_RST#和VCC_RTC電源給南橋。
  2. 插入電源或者電池。系統進入G2,S5的狀態。EC檢查電源的可靠性,並發送PM_RSMRST#通知南橋各種SB電壓已經準備完畢。南橋復位,部分功能SB功能激活,進入待機狀態。
  3. 用戶按下電源鍵,時間開始。
  4. EC收到PWRSW#信號,通過PM_PWRBTN#通知南橋。南橋收到PM_PWRBTN#信號後依次拉高SLP_S5#,SLP_S4#,SLP_S3#信號給EC。
  5. EC發出PCON#給ATX電源。
  6. ATX電源接到低電平的PSON#信號後,開始工作,發出各路基本電壓給主板上的各個元件。
  7. 基本電壓變換的其他電壓也被轉換出來。
  8. 電源發出PWROK#給EC,EC轉交給南橋和北橋(有的話)
  9. VRM和CPU通訊,根據VID送出Vcore
  10. VRM發生VRMPWRGD#給南橋,表示核心電壓OK。
  11. 南橋發送PLT_RST#給北橋。
  12. 南橋發送PWRGOOD#給CPU。
  13. 北橋在收到PLT_RST#信號後,1秒鐘後發生CPU_RST#,讓CPU復位

時序圖如下:

技術分享圖片

青銅時代:神秘消失的時間

在CPU復位後,是不是要立刻跳到reset vector開始執行BIOS程序了呢?還沒有,pcode、on die rom會在這個階段執行,TXT、boot guard等安全保障措施也在這裏運行。

城邦時代:UEFI的四個階段

CPU終於開始執行reset vector的代碼了,這就進入了我們熟悉的UEFI的世界。我們之前已經有很多文章都有介紹UEFI的各個階段,這裏簡單回顧一下:

技術分享圖片

• 在SEC階段,系統從復位開始運行(由主機引導處理器取回的第一指令),通過初始化處理器高速緩存(Cache)來作為臨時內存使用,我們有了堆棧,從而可以執行c程序,然後轉到PEI階段。

• 在PEI最開始階段,僅少量棧和堆可用,我們需要找到並使能足夠我們使用的永久內存,通常是內存顆粒或內存條(DIMM),然後轉入DXE。

• DXE階段有了永久存儲空間,真正開始負責初始化核心芯片,然後轉換到BDS階段。

• 核心芯片初始化完成後BDS階段開始,並繼續初始化引導操作系統(輸入,輸出和存儲設備)所需的硬件。 縱觀PI的整個階段,BDS對應的是“執行UEFI驅動程序模型”來引導OS這一過程。

UEFI引導階段步驟和驅動程序眾多,經過多年發展,核心代碼已經超過一百萬行,儼然已經是個獨立的小王國了。要理解UEFI,必須理解UEFI的目的:初始化硬件,安全啟動操作系統,並為操作系統提供統一的硬件抽象。所有紛繁復雜的驅動和表象後面,都在為了這一目的服務。只要抓住這條主線,再遇到其他的知識點也就會豁然開朗了。

近代和現代:引導程序和操作系統

UEFI會在BDS階段後加載操作系統引導程序,也就是OS loader。不同的OS有不同的Loader。一般用戶都十分熟悉,我們這裏不再贅述。

另外傳統BIOS和BIOS引導方式已經被淘汰。Intel也宣布對傳統BIOS兼容模式(CSM)在2020後不再支持(參考資料1)。網上諸多Int13、引導扇區等內容,除非對歷史有興趣,全部可以一笑而過了。

結論

按下電源鍵,CPU並不是第一個得到通知並立刻執行代碼的。簡單的開機後面隱藏了如此豐富的內容,這是很多人想象不到的。很多主板,尤其是很多服務器主板,從按下電源鍵到CPU開始執行UEFI固件程序,期間經歷了很多隱藏的片段。這些片段可長可短,有的轉瞬即逝、有的卻讓人等上片刻。它們究竟是什麽,為什麽存在,值得大家細細探究。

轉載自:https://zhuanlan.zhihu.com/p/31180815

按下電源鍵後發生了什麽?電腦是如何優雅地開機的?