前言
“中央處理器部件CPU是微機(jī)的核心部件,由控制器和運(yùn)算器組成,負(fù)責(zé)控制整個(gè)微機(jī)自動(dòng)、連續(xù)、協(xié)調(diào)地完成算數(shù)和邏輯的運(yùn)算。”
作為一本書的開篇,這段文字讓人在讀完之后越發(fā)糊涂。一本書如果淺顯到如此膚淺的程度,那它離成為一本天書就不遠(yuǎn)了。說實(shí)話,我也是從那個(gè)時(shí)候開始才知道,這個(gè)世界上最抽象的學(xué)問除了哲學(xué)之外,還有計(jì)算機(jī)。
—— 李忠 [穿越計(jì)算機(jī)的迷霧]
開篇之前首先非常感謝李忠老師對計(jì)算機(jī)底層的研究。如果沒有他打破砂鍋問到底的鉆研精神,以及無私的奉獻(xiàn)精神,這片文章大概也不會開篇。本系列的文章由很多部分都會與李忠老師的文獻(xiàn)有相似及重復(fù),大家可以通過李忠老師的《穿越計(jì)算機(jī)的迷霧》和《x86匯編語言從實(shí)模式到保護(hù)模式》先行掌握基礎(chǔ)。
很久以前操作系統(tǒng)一直是行業(yè)保守的秘密,直到mixin的出世以及l(fā)inux。但現(xiàn)代資料雖然依舊很少很模糊,但我已經(jīng)可以通過拼湊給你們找出完善的知識。感謝我那無止境的求知欲。
在寫前言的時(shí)候,我剛剛注冊下了lokios.com這個(gè)域名。
另外感謝王垠對于權(quán)威的批判,一些博文讓我深受啟發(fā)。
—— 民科 Miguel Valen
第一章 計(jì)算機(jī)的啟動(dòng)
1.按下電源 - CPU Reset
這個(gè)步驟十分短暫,用戶幾乎察覺不到。
臺式機(jī)與筆記本在這一階段有很大的區(qū)別,這是由于筆記本有KBC的存在。
臺式機(jī):
首先介紹下臺式機(jī)電源定義

上圖為ATX-12V 24PIN定義圖
8引腳為PG(Power Ok)信號。9引腳為待機(jī)供電。16[在20pin接口上是14]引腳為PW-ON(Power On)信號,16[14]引腳與GND(Ground)短接后即可觸發(fā)電源工作(這一點(diǎn)非常重要!),未觸發(fā)前9、16[14]引腳輸出電壓均為+5V,其它引腳無輸出電壓。
還有,根據(jù)電源的兩種結(jié)構(gòu),主板觸發(fā)也采用兩種方式。AT結(jié)構(gòu)電源采用硬開機(jī)方式(觸發(fā)后PW-ON為常閉狀態(tài)),ATX結(jié)構(gòu)電源采用軟開機(jī)方式(觸發(fā)后PW-ON為常開狀態(tài))。由于軟開機(jī)是目前絕大多數(shù)主板采用的觸發(fā)方式,因此我們主要針對這種觸發(fā)方式進(jìn)行分析。這個(gè)有時(shí)分析是要用到的 所以我想想還是說一下。
主板觸發(fā)電路
看一下幾種典型的主板觸發(fā)電路:
1. 經(jīng)過南橋的觸發(fā)電路(見下圖)

在觸發(fā)電路中凡是參加開機(jī)的元件均由電源9引腳(紫)提供+5V供電。+5V高電位經(jīng)電阻R1、R2,在PW-ON非接地端形成+3.3V高電位。當(dāng)PW-ON(機(jī)箱開機(jī)按紐)被觸發(fā)(即閉合)瞬間,+3.3V高電位信號被拉低,變?yōu)榈碗娢?,南橋接收到低電位信號向電?6[14]引腳(綠)發(fā)出低電位信號,將POWER(16 [14])+5V高電位拉低,觸發(fā)電源工作,實(shí)現(xiàn)開機(jī)。
2. 用反向器式,不同與上面的接地式。

當(dāng)PW-ON被觸發(fā)(即閉合)瞬間,+3.3V高電位信號經(jīng)反向器(如7404等)轉(zhuǎn)換為低電位,南橋接收到低電位信號向電源16[14]引腳(綠)發(fā)出低電位信號,將POWER(16[14])+5V高電位拉低,觸發(fā)電源工作,實(shí)現(xiàn)開機(jī)。
3. IO控制芯片型

過程與經(jīng)過南橋相似,只是由南橋控制I/O芯片,通過I/O芯片發(fā)出低電位信號將POWER(14)+5V高電位拉低,觸發(fā)電源工作。
上面列舉了三種常用開機(jī)電路,當(dāng)然,不同的PC廠商可能會采取不同的設(shè)計(jì),基本原理應(yīng)該都和上面的電路相同。
至此,ATX電源開始正常工作,就會輸出+12V,-12V.+5V ,-5V,+3.3V電壓,包括8引腳PG(Power Good)信號,這時(shí)候主板上的用電已經(jīng)全部輸出。輸出PG信號后會觸發(fā)南橋,經(jīng)過一系列的觸發(fā)動(dòng)作,最終由北橋發(fā)送CPURST#給CPU,使CPU Reset.
至此,PC開機(jī)過程的第一步完成(應(yīng)該是臺式機(jī),還有筆記本的沒講 :))。需要說明的是,這一過程在極短的時(shí)間內(nèi)(微秒級)完成,用戶根本感覺不到(好復(fù)雜??!還有更復(fù)雜的呢,CPU內(nèi)部的每秒G次級操作!)。
筆記本
筆記本由于有KBC的存在,這一階段和臺式機(jī)又有不同。KBC(Keyboard Controller,鍵盤控制器)從字面上我們就可以看出來它的作用。這只是它當(dāng)初的定義,現(xiàn)在的KBC的功能已經(jīng)遠(yuǎn)遠(yuǎn)超出它當(dāng)初的定義了,現(xiàn)在筆記本上的電源管理,狀態(tài)LED的顯示,Panel背光亮度的調(diào)節(jié),F(xiàn)n鍵的控制,CPU Throttle的開關(guān),無線藍(lán)牙紅外等外設(shè)的控制,電池充放電的控制等等功能都由KBC來接手,應(yīng)該說KBC接手了臺式機(jī)上南橋的一部分功能?,F(xiàn)在常用的KBC芯片主要有Hitachi的H8和Winbond系列(如W83L941D)。
KBC在NB的開機(jī)過程中也起著很大的作用,下面我們來看:
在系統(tǒng)關(guān)機(jī)的時(shí)候,只有RTC部分和KBC部分在運(yùn)行,明白這一點(diǎn)很重要!很多筆記本用戶會問為什么筆記本即使不開機(jī)過一段時(shí)間電池電量也會減少?這正是KBC還在用電的原因,當(dāng)然,電池的自然隕耗也不可忽略。RTC部分維持著計(jì)算機(jī)的時(shí)鐘和CMOS設(shè)置信息,而KBC則在等待用戶按開機(jī)鍵。在檢測到用戶按開機(jī)鍵后,KBC會通知整個(gè)系統(tǒng)把電源打開(這部分在下面詳細(xì)介紹)。CPU被RESET后,會去讀BIOS內(nèi)一個(gè)特定地址內(nèi)的指令(其實(shí)是一個(gè)跳轉(zhuǎn)指令,這個(gè)地址是由CPU硬件設(shè)定的),接下來就是第二階段討論的內(nèi)容了!
(以下一段從權(quán)威揭密 筆記本硬件結(jié)構(gòu)終極教程 (下)一文摘錄)
那我們現(xiàn)在就講解一下筆記本電腦在硬件上的邏輯開機(jī)過程。
首先我們做一些預(yù)習(xí)工作,以方便讀者的理解。在筆記本內(nèi)部的電壓有好幾種,我們分別看一下。
首先是RTC電源,這部分電力是永遠(yuǎn)不關(guān)閉的,除非電池(紐扣電池)沒電并且沒接任何外部電源(比如電池和電源適配器)。RTC用以保持機(jī)器內(nèi)部時(shí)鐘的運(yùn)轉(zhuǎn)和保證CMOS配置信息在斷電的情況下不丟失;其次,在你插上電池或者電源適配器,但還沒按power鍵的時(shí)候(S5),機(jī)器內(nèi)部的開啟的電稱為ALWAYS電,主要用以保證EC的正常運(yùn)行;再次,你開機(jī)以后,所有的電力都開啟,這時(shí)候,我們稱為MAIN電(S0),以供整機(jī)的運(yùn)行;在你進(jìn)待機(jī)的時(shí)候(S3),機(jī)器內(nèi)部的電成為SUS電,主要是DDR的電力供應(yīng),以保證RAM內(nèi)部的資料不丟失;而休眠(S4)和關(guān)機(jī)(S5)的電是一樣的,都是Always電。其中,上文中括號內(nèi)的是表示計(jì)算機(jī)的狀態(tài)(S0-開機(jī),S3-待機(jī),S4-休眠,S5-關(guān)機(jī))。

上圖是對上面這段話的總結(jié),我想應(yīng)該很容易明白。其中最后一列指的是其電壓開啟的控制信號,這點(diǎn)下面會講到。至于為什么這里沒有S4,即休眠狀態(tài),是因?yàn)樵赟4狀態(tài)和S5狀態(tài)下,系統(tǒng)開啟的電是一樣的,所以就沒必要增加一組控制電路。
OK,現(xiàn)在我們假設(shè)沒有任何的電力設(shè)備在供電(沒電池和電源),這時(shí)候,機(jī)器內(nèi)部只有RTC電路在運(yùn)作,南橋上會接有一個(gè)3V的紐扣電池來供給RTC電力,以保持內(nèi)部時(shí)間的運(yùn)行和CMOS信息。
我們來分析一下開機(jī)的過程。在插上電池或者電源的時(shí)候,機(jī)器內(nèi)部的單片機(jī)KBC就Reset并開始工作,等待用戶按下Power鍵。在此期間的時(shí)序是:ALWAYS電開啟以后,KBC Reset并開始運(yùn)行,隨后發(fā)給南橋一個(gè)稱為‘RSMRST#’的信號。這時(shí)候南橋的部分功能開始初始化并等待開機(jī)信號。這里要注意,這時(shí)候的南橋并沒有打開全部電源,只有很少一部分的功能可用,比如供檢測開機(jī)信號的PWRBTN#信號。
在用戶按下Power鍵的時(shí)候,KBC檢測到一個(gè)電平變化(一般時(shí)序是:高-低-高),然后發(fā)送一個(gè)開機(jī)信號(PWRBTN#)給南橋,南橋收到PWRBTN#信號后依次拉高SLP_S5#,SLP_S4#,SLP_S3#信號,開啟了所有的外圍電壓,主要是+3V,+5V以及DDR2.5V等,并發(fā)送PM PWROK信號,這信號表明外圍電源正常開啟。
PM PWROK將作為一個(gè)使能信號發(fā)送到CPU外圍VCCP的電壓Generator,并開啟VCCP。在此之后,VCCP Generator會發(fā)出CORE_VR_ON來開啟CORE VR(即CPU的核心電壓)。至此,整機(jī)的電壓已經(jīng)全部開啟。
在用VR_PWRGD_ICH這個(gè)信號通知南橋CORE VR成功開啟后,南橋會發(fā)出PCI RST#信號到PCI總線,于是總線上的設(shè)備都被初始化(包括北橋),并同時(shí)發(fā)出H_PWRGD來通知CPU它的核心電壓已經(jīng)成功開啟。然后北橋發(fā)H_CPURST#信號給CPU,CPU被RESET,并正式開始工作。
至此,PC開機(jī)過程的第一階段全部完成(臺式機(jī),筆記本)。
我們跟隨微機(jī)進(jìn)入第二階段。
2.bios引導(dǎo)
從這一階段開始,我們就可以“看”到這一過程了(顯卡開始工作之后)。在這一階段,BIOS是絕對的主角!基本上一切都在它的控制之下。
可以說BIOS是一個(gè)很大的話題,不要說一篇文章,就是一本書,一門課程都不可能講的很透徹!這里我主要是根據(jù)自己的理解,對BIOS在微機(jī)啟動(dòng)過程中的作用作一下梳理。
CPU Reset后就會通過北橋,南橋,尋找BIOS, 生成片選信號,開始讀取資料,進(jìn)行自檢(POST, Power On Self Test).
為了便于理解,先給不熟悉BIOS的兄弟(當(dāng)然還有姐妹:))們補(bǔ)補(bǔ)課(之前聽到有人說BOIS,還有的稱BOSS?。?。BIOS的全稱是Basic Input And Output System,中文名就是基本輸入輸出系統(tǒng),從名稱上我們不能獲得更多的信息,它到底是硬件還是軟件?既然稱為系統(tǒng)我怎么看不到?應(yīng)該說BIOS是名符其實(shí)的軟件(先別急著反駁,聽我講完),它本身是一段程序,只不過這段程序和我們平時(shí)接觸的程序有一點(diǎn)不同。它不像我們常見的程序那樣工作于操作系統(tǒng)下,因?yàn)樗旧砭涂梢哉f是一個(gè)簡單的小型操作系統(tǒng)(不好理解?就當(dāng)我沒說過上面的這段話,繼續(xù)往下看)。這段程序是固化在一塊芯片當(dāng)中的――這塊芯片就是我們學(xué)說的BIOS芯片,而這塊芯片又焊接在主板上。如果你細(xì)心找的話,在主板上你肯定能找到這塊芯片(沒有BIOS的PC偶還么的見過)。而正是由于BIOS是固化在芯片中的才會導(dǎo)致某些人說BIOS是硬件。整理一下,應(yīng)該說BIOS是軟件,如果我們說BIOS芯片(保存BIOS程序的那塊芯片),那么它就是硬件(芯片當(dāng)然是硬件拉)。
要想了解更多關(guān)于BIOS的信息,大家可以去 www.biosdiy.net ,從上面可以獲得更多的資料,從基本的BIOS設(shè)置到怎么刷BIOS到替換BIOS的開機(jī)畫面,應(yīng)有盡有。
再說一下BIOS在微機(jī)中的基本作用:
1. POST(Power On Self Test,開機(jī)自檢) CPU Reset后將從BIOS讀取第一條指令,接下來BIOS會對CPU各項(xiàng)寄存器,先檢查是否運(yùn)行正常,接下來會檢查8254 Timer(可編程計(jì)數(shù)器),8259A(可編程中斷控制器),8237DMA Controller(DMA 控制器)的狀態(tài)。
2. Initial――針對動(dòng)態(tài)內(nèi)存(DRAM),主板芯片組,顯卡以及相關(guān)外圍的寄存器做初始化設(shè)置,并檢測是否能夠工作。
所謂初始化設(shè)置,就是依照該芯片組的技術(shù)文件檢定,做一些寄存器的填值,改位的動(dòng)作,使得主板/芯片組和內(nèi)存,I/O的功能得以正常運(yùn)行。
3. 記錄系統(tǒng)的設(shè)置值,并且存儲在非揮發(fā)性內(nèi)存(Non-Volatile RAM),像CMOS或Flash Memory(ESCD區(qū)域)等。
4.將常駐程序庫(Runtime Program)常駐于某一段內(nèi)存內(nèi),提供給操作系統(tǒng)或應(yīng)用程序調(diào)用,像Int 10H, Int 13H, Int 15H之類的函數(shù)(這個(gè)功能在Windows系統(tǒng)下已經(jīng)不存在了,在DOS下還會用到,就是我們常說的BIOS 中斷)
繼續(xù)討論BIOS在開機(jī)過程中的作用,我們看下面的圖:

當(dāng)CPU Reset后,根據(jù)X86架構(gòu)的特性,(386以后)CPU會從4G地址的最頂端FFFFFFF0處獲得第一條指令來執(zhí)行,而這一地址被定位在BIOS里。由于FFFFFFF0到FFFFFFFF只有短短的16字節(jié),根本不可能放下一段程序,所以這里會放一條跳轉(zhuǎn)(Jump)指令讓BIOS跳到更低的地址去執(zhí)行。而這個(gè)地址就是上圖的Boot Block模塊的入口地址。這個(gè)Boot Block(啟動(dòng)模塊)是IBM PC遺留下來的規(guī)范,基本上每一個(gè)BIOS廠家都會有這么一個(gè)Boot Block。它的作用就是完成BIOS的最初引導(dǎo)(比如說測試很小的一塊內(nèi)存來供臨時(shí)使用),如果你對BIOS DIY比較熟的話,它的另一項(xiàng)功能你可能會比較熟悉,就是當(dāng)刷BIOS由于不慎導(dǎo)致失敗的時(shí)候,我們可以通過Boot Block的拯救功能來救回BIOS,一般是在軟驅(qū)里放入兩個(gè)文件,一個(gè)是特殊的刷BIOS工具另一個(gè)是BIOS文件。然后用這個(gè)軟驅(qū)啟動(dòng),如果Boot Block模塊沒有損壞的話,用這個(gè)方法可以救活BIOS.
Boot Block完成引導(dǎo)后就會解壓縮出Runtime模塊,到這里可能你會問,什么是解壓縮Runtime模塊?莫非BIOS里還藏有Winrar,winzip這樣的程序,答案當(dāng)然是否定的。用到解壓縮功能完全是因?yàn)锽IOS可以利用的地址空間太小了,而隨著芯片組功能和外設(shè)功能的增強(qiáng),BIOS里還要加入起來越多的功能,為了解決地址空間不足的問題,BIOS就引入了壓縮模塊的方法,將一些固定功能的BIOS模塊通過壓縮算法壓縮,擠出一些空間來讓更多的擴(kuò)展功能使用。當(dāng)然,這些壓縮算法肯定沒有Winrar等壓縮軟件那么復(fù)雜了,否則光是壓縮算法就占據(jù)了大部分空間,還不如不引入壓縮功能來的劃算。到這里還有一個(gè)問題,就是有人可能要問,之前不是講過BIOS剛開始執(zhí)行就會進(jìn)行POST嗎?怎么前面還會解壓Runtime模塊?這是因?yàn)樵赑OST過程中要用到中斷調(diào)用等功能,而這些功能是由Runtime模塊提供的。
Runtime模塊解壓后就會解壓POST模塊,可以看到連POST也被壓縮了,可見BIOS空間是多么寶貴!在POST過程中如果用戶有按鍵(比如常見的DEL鍵)想進(jìn)行BIOS設(shè)定,那么BIOS會解壓出BIOS SetUp模塊,來提供BIOS設(shè)定界面并保存用戶設(shè)定結(jié)果。在POST過程中BIOS還會進(jìn)行芯片組,內(nèi)存,顯卡,外設(shè)等的初始化工作。
上面的只是一個(gè)初略的BIOS執(zhí)行流程,BIOS實(shí)際執(zhí)行的過程要比上面說的復(fù)雜的多。并且不同的廠商會在BIOS里加入許多特定的功能(比如一鍵殺毒,還原等),這更會增加BIOS的復(fù)雜度!
造成BIOS過于復(fù)雜的另一原因是BIOS開發(fā)主要是用一般人不熟悉的匯編語言。面對復(fù)雜的BIOS,不要說普通的用戶,就連BIOS開發(fā)人員有時(shí)都會被搞焦頭爛額。還好,Intel終于開發(fā)出了EFI(Extended Firmware Interface,擴(kuò)展固件接口)準(zhǔn)備用來取代BIOS。EFI用流行的C語言開發(fā),可以做出比較好的圖形界面,使用起來更加直觀。EFI還加入了一些比較實(shí)用的功能,比如說可以不進(jìn)系統(tǒng),在EFI里就可以進(jìn)行文件操作,在EFI里使用網(wǎng)絡(luò)功能等。有興趣的可以在網(wǎng)上找一下EFI的相關(guān)資料。
至此,PC開機(jī)過程的第二階段完成。