計算機是如何啟動的?從未上電到作業系統啟動

2021-10-10 07:50:33 字數 4626 閱讀 6582

計算機是如何啟動的,網路上很多博文1

都從 bios 程式的載入開始說起,有的也跳到 bios 程式載入 bootloader 階段。個人認為把這個過程稱為作業系統是如何被載入並啟動應該更加貼切一點。同時,也有計算機硬體大神的文章[1][5]詳細分析計算機加電的過程。在閱讀前人的優秀文章之後,歸納總結寫下了這篇文章以梳理從計算機上電之前到作業系統開始工作的整個過程。

開機鍵按下之前:黑暗中的一點星光

「滴答…滴答…」微弱的聲音有規律地響起。

「是誰?」從睡夢中醒來,身邊漆黑一片,我驚呼出聲。

「哇,終於有朋友過來陪我玩了。你好你好,我是 rtc (real-time clock,實時時鐘)晶元,你可以叫我小 r,計算機世界的時間由我掌控哦,厲害吧~」,小r()得瑟地說。

我剛想說話,乙個年邁爽朗的笑聲傳來,「哈哈,孩子,你又偷偷溜出來玩啦。」一位老爺爺走過來,慈祥地摸著小 r 的小腦袋說。

「家裡太無聊了嘛,都沒人可以陪我一起玩,沒有"電",大家都不說話。對啦,這是我的電池爺爺,爺爺特別喜歡我,能讓我一直活躍著呢!」

我一拍腦袋,感情這是來到了計算機的世界呀,而且還是沒接入外部電源之前的計算機。在沒有外部電源的情況下,基本只有 rtc 和 cmos 在 rtc 電源供電的情況下才能正常工作。「電池爺爺」一般是個鈕扣電池。rtc 晶元保持機器內部的時鐘,這也是為什麼我們的計算機關機之後再次啟動時間還是準確的(不考慮作業系統啟動後利用網路同步時間)。而 cmos 是電腦主機板上的一塊可讀寫的ram晶元。因為可讀寫的特性,所以在電腦主機板上用來儲存 bios 設定計算機硬體引數後的資料。在計算機領域,cmos 常指儲存計算機基本啟動資訊(如日期、時間、啟動設定等)的晶元。

正回想著,突然天空一道光柱射向地面,後如溪流一般四處蔓延開來。「嘻嘻,有新朋友要醒來咯」,小 r 邊跳邊喊。「電池爺爺,您辛苦啦,回去休息吧,現在我能靠外面的能源生活啦。」

看來是外部的 atx 電源接入了。atx 會使用 +5vsb 電源喚醒一部分小夥伴,例如南橋(系統 i/o 晶元)、ec(嵌入式控制器,微控制器)等。"+5v stand-by 電壓為開機電路和需要喚醒機器的wol(wake-up on lan)和 usb 等裝置提供電源」[7],不會為 cpu 等提供工作電壓。

這裡需要說明一下,實際上不同的主機板、應用場景都會採用不同的電源時序控制方案,筆記本採用 ec,台式電腦很多用sio(super i/o)或者定製晶元,嵌入式裝置以及手機採用pmic(power management ic)。以上的故事都是基於台式電腦形式,但是我們選用 ec 來解釋電源時序控制過程,是考慮到國內關於 ec 的資料較多。與台式電腦不同的一點是,筆記本因為有鋰電池的原因,在沒有接入電源介面卡前,ec 以及南橋就已經處於工作狀態了。這也是為什麼我們開啟膝上型電腦,按下開機鍵,系統能接收到這個訊號,並準備開始工作。

討論到這裡,基本可以形成這樣乙個概念:在關機狀態下,只有 rtc 、ec 以及南橋部分元件在工作。鈕扣電池維持著計算機的時鐘資訊(rtc的工作)和 cmos 資訊,而 ec 則在等待使用者按下開機鍵。當然 ec 還負責電池的充放電的檢測,指示燈,功能鍵等功能。

黎明:計算機開始運轉

主人說要有光,按下了神聖的開機鍵。ec 在黑暗中接收到這個pwrsw#訊號,興奮地不行,立馬去通知南橋,「pm_pwrbtn#! pm_pwrbtn#! 我們的黎明到來啦!」。

「好啦,我知道!」,南橋回應 ec 三個訊號slp_s5#(退出 s5 關機狀態),slp_s4#(退出 s4 休眠狀態),slp_s3#(退出 s3 待機狀態)。

「atx 電源,賦予我們光明吧!」ec 收到南橋發來的訊號後,明白南橋已經準備就緒。atx電源收到訊號,開始工作,發出各路基本電壓給主機板上的各個元件。然後傳送pwrok#訊號給 ec,並由 ec **給南橋與北橋…經過一系列你來我往(這個流程必須嚴格控制,任意一步出錯都會造成計算機無法正常啟動),終於等到通知 cpu 老大的時刻啦。

」嘿,北橋大哥,我們叫 cpu 老大醒來指揮我們吧。我會告訴 cpu 老大電源都準備就緒啦。「,南橋傳送plt_rst#給北橋,緊接著向 cpu 傳送 pwrgood#訊號。北橋接收到南橋的訊號,默念一秒鐘後,向 cpu 老大傳送了cpu_rst#訊號。

從此計算機世界開始熱鬧起來。

bios 現身

目前只是所有硬體開始工作,如果整個系統中沒有指令存在,cpu 醒來也不知道該去做什麼。計算機啟動的英文表達是bootstrap,這來自於一句諺語:「pull oneself up by one』s bootstraps」,意思是」拽著自己的鞋帶把自己拉起來「。

這當然是不可能的事情。最早的時候,工程師們用它來比喻,計算機啟動是乙個很矛盾的過程:必須先執行程式,然後計算機才能啟動,但是計算機不啟動就無法執行程式!早期真的是這樣,必須想盡各種辦法,把一小段程式裝進記憶體,然後計算機才能正常執行[2]。

那麼這就是bios(basic input/output system,基本輸入輸出系統)階段了。具體是如何工作的呢?

cpu 一醒來,毫不遲疑,立馬開始工作。以intel 32位 cpu 為例,cpu 知道自己的使命,第一步就是取位址0xfffffff0[8]處的指令(cpu 設計時固化的功能,理解這個很重要)。cpu拿到指令後執行,發現這條指令是告知自己,下一次去另乙個位址取指(跳轉指令jmp [0xffff0000,0xe05b])。喔,想起來了,這是 bios 老弟等我去執行他儲存的那一堆指令呢!cpu 又立馬開始工作,通過 fsb(前端匯流排)將這個位址傳送到北橋,然後通過 hub-link 到南橋,通過lpc(low pin count bus)到 ec,再通過 x-bus 一直到達 bios 取指令。在cpu讀到所發出的位址內的指令後,開始 bios 程式執行。

bios 晶元中也儲存了不少指令,形成的功能包括:

自診斷程式:讀取 cmos 中的內容獲得硬體配置資訊,並對其進行自檢和初始化;完整的 post(power on self test) 自檢將包括cpu、640k基本記憶體、1m以上的擴充套件記憶體、rom、主機板、 cmos ram、串並口、顯示卡、軟硬盤子系統及鍵盤測試。

cmos 設定程式:引導過程中,用特殊熱鍵啟動,進行設定後,存入cmos ram中;對應 dell 計算機啟動時我們按f12,進入的 bios 設定介面。

系統自舉裝載程式:在自檢成功後將磁碟相對 0 道 0 扇區上的引導程式裝入記憶體,讓其執行引導作業系統;

主要 i/o 裝置的驅動程式和中斷服務:系統硬體的變化由 bios 隱藏,程式使用 bios 功能而不是直接控制硬體。不過現代作業系統會忽略 bios 提供的抽象層並直接控制硬體元件。

作業系統引導:bootloader

在前面提到,bios 會負責將磁碟相對 0 道 0 扇區的引導程式裝入記憶體。不知道大家是否會有這樣的疑問:為什麼我們一定需要乙個引導程式呢?為什麼不能直接讓 bios 將作業系統載入到記憶體中?

為了解答這個問題,首先要知道 bootloader 都實現了什麼功能。bootloader 最直觀的功能就是將作業系統載入到記憶體中。首先可以考慮在硬碟上存在多個作業系統的情況下,作業系統的載入方式過程可能就不同。如果讓 bios 來考慮各個作業系統待載入到記憶體中的目的位址,這會導致 bios 程式的膨脹。而 bios 程式是固化在 bios 晶元中,正常情況下是無法修改的,解決載入新的作業系統出現問題就會很麻煩。而保證 bios 的正常功能就要降低 bois 的複雜性,那麼適配不同作業系統的任務誰來做呢?那當然就是 bootloader 啦。並且在嵌入式環境下,作業系統的載入並不僅僅從磁碟上載入,還可能是nor flash 、nand flash、usb 甚至是網路。那麼 bootloader 就應該實現基本的網路功能,例如著名的開源專案 u-boot就是這樣做的。當然本文在這裡只是拋磚引玉,為什麼要分出乙個 bootloader 層,可以從很多方面分析這樣做的優勢。

普通的 bootloader 都需要實現什麼功能呢:

初始化硬體裝置

為作業系統準備ram空間

將作業系統**載入到ram中

設定堆疊執行環境,為高階語言(如 c 語言)提供執行環境。這裡要多說一句,作業系統並不都是 c 語言寫的哦。現在 rust 語言接近 c 語言效能,並且因為其提供的安全性,已經被用來寫作業系統了。

將控制權交給作業系統。到這一步,系統的完整啟動也就結束啦。之後就是作業系統主宰的世界了!

如果讀者對 bootloader 的詳細工作工作過程感興趣,可以參考 mit6.828 作業系統課程 lab1。這個實驗引導學生一步一步 coding 了作業系統的啟動。讀者若對作業系統的設計感興趣,想詳細了解這個課程,牆裂推薦!

一丁點兒:mit6.828-神級os課程-要是早遇到,我還會是這種 five 系列

​最後,最近讀了《碼農翻身-用故事給技術加點料》這本書,用故事來講技術知識。讀的時候就覺得作者特別有趣有才,尤其在自己也嘗試用故事來講技術之後,發現真的不容易,直接五體投地的服!

參考文獻

[1]. 老狼. 按下開機鍵後,電腦都幹了些什麼? - 老狼的回答 - 知乎

[2]. 阮一峰. 計算機是如何啟動的?

[3]. iknow. 筆記本電源管理晶元(ec)作用的介紹

[4]. stackoverflow. why do we need a bootloader in an embedded device?

[5]. 人生一次萬般活法. 按下開機鍵後,電腦都幹了些什麼? - 人生一次萬般活法的回答 - 知乎

[6]. w3cschool bios完全手冊. 什麼是bios和coms

[7]. 老狼. 電源是如何提供電力給主機板的,又是如何切斷的?

[8]. intel corporation. 英特爾® 64 位和 ia-32 架構開發人員手冊:卷 3a

2 ↩︎

計算機是如何啟動的

感謝作者!從開啟電源到開始操作,計算機的啟動是乙個非常複雜的過程。我一直搞不清楚,這個過程到底是怎麼回事,只看見螢幕快速滾動各種提示.這幾天,我查了一些資料,試圖搞懂它。下面就是我整理的筆記。零 boot的含義 先問乙個問題,啟動 用英語怎麼說?回答是boot。可是,boot原來的意思是靴子,啟動 ...

計算機是如何啟動的?

從開啟電源到開始操作,計算機的啟動是乙個非常複雜的過程。我一直搞不清楚,這個過程到底是怎麼回事,只看見螢幕快速滾動各種提示.這幾天,我查了一些資料,試圖搞懂它。下面就是我整理的筆記。零 boot的含義 先問乙個問題,啟動 用英語怎麼說?回答是boot。可是,boot原來的意思是靴子,啟動 與靴子有什...

計算機是如何啟動的?

從開啟電源到開始操作,計算機的啟動是乙個非常複雜的過程。我一直搞不清楚,這個過程到底是怎麼回事,只看見螢幕快速滾動各種提示 這幾天,我查了一些資料,試圖搞懂它。下面就是我整理的筆記。零 boot的含義 先問乙個問題,啟動 用英語怎麼說?回答是boot。可是,boot原來的意思是靴子,啟動 與靴子有什...