在我們的電腦中,都有一塊黑色的小芯片。但是請千萬不要小看它,如果它損壞或者數據錯誤亂套的話,恭喜,如果不會“救回”這個小芯片,那么這臺電腦可以掛閑魚賣零件了……
這個小芯片是什么呢?對,它就是BIOS芯片。那BIOS又是什么玩意?答曰:“BIOS,是Basic Input Output System的詞頭縮寫。”如果直譯為中文,那就叫做“基本輸入輸出系統”。然而BIOS到底是什么,光說它的名字對于一般人來說還是如同天書一般。其實BIOS是固化在一個只讀存儲器(ROM,下同)或非易失性存儲器(NvRAM)上的程序,所以BIOS只是個程序。但既然是程序,那么肯定是得要運行的,所以就得為這個程序找一個地方存起來以便隨時能運行。這個程序存放在哪里?是固化在一個ROM或NvRAM里的,那么這個ROM或者NvRAM又是啥玩意?對了,就是那個黑色小芯片,即BIOS芯片,所以BIOS芯片是個ROM或NvRAM,目前的大多數BIOS芯片基本只有NOR Flash一種,屬于NvRAM。少數上古的舊式BIOS芯片還可以看到EEPROM,下面稍后再談這兩個玩意。
上面說完了BIOS和BIOS芯片,我們已經知道BIOS只是個存儲在一個芯片中的程序。那么既然是程序,肯定就得包括一些功能,都包括些啥玩意呢,下面主要列舉如下:
1、POST自檢和硬件自檢程序:通過讀取CMOS存儲中的硬件信息,識別硬件配置,并對硬件自檢和初始化。
2、操作系統啟動程序:硬件自檢成功后(這時硬盤已經被識別),執行跳轉到操作系統引導設備的引導分區,將引導程序讀入內存,若成功讀入,則進入啟相應設備上的操作系統啟動過程
3、CMOS設置程序:在電腦開機自檢中,按下進入CMOS設置的快捷鍵,則進入CMOS設置。設置結束后,若進行保存操作,則更新后的硬件信息會存入CMOS中并重新進行自檢,否則繼續完成本次自檢后續的過程
4、硬件I/O和中斷服務:軟件在一些對硬件底層的操作中,需要中斷服務或硬件I/O操作,這時就需要BIOS充當軟件和硬件之間“臨時搭橋”的作用。
BIOS主要的功能基本上就是這4點,但是請注意1和3,又冒出個CMOS,這又是啥東東?答曰:“CMOS,本義上是Complementary Metal Oxide Semiconductor的詞頭縮寫。”直譯為“互補金屬氧化物半導體”,是一種半導體技術,屬于數字電路的范疇。但是為了避免再亂造新詞造成混亂,人們干脆將采用該技術的制程和生產出的元件或芯片也叫CMOS,比如數碼相機的傳感器就叫做CMOS。很不幸但也很慶幸的是,我們的電腦中就有一個用CMOS技術的芯片,所以這個芯片直接就叫做CMOS芯片,是個隨機存儲器RAM。不過現在這個芯片一般都是集成到主板的南橋芯片組里,你根本也看不到它,它是用來干嘛的呢?原來它就是用來保存當前電腦的硬件配置信息和其他一些有關信息的,所以這個CMOS芯片只是個保存數據的玩意。既然它只是個RAM(不是昂貴的NvRAM非易失性存儲器,也沒必要用NvRAM),那么就得給它一直供著電,否則掉電后數據就丟了。但是我們的電腦不能總開著機一直耗電玩,所以就必須得有一個后備電源準備著隨時在電腦電源關閉后“接班”為CMOS芯片供電,好吧,放個3V鋰電池就行了,所以主板上那個電池是為CMOS芯片在電腦電源關閉后繼續供電的東西。
說到這里大多數人都該明白了,BIOS是個程序,實現一系列功能,該程序存儲在芯片中,這個芯片叫做BIOS芯片;而CMOS也是個芯片,是個RAM,里面存的是電腦硬件配置信息和電腦其他有關的東西,電腦啟動了就由電腦電源為其供電,電腦關閉則由一個后備電池供電保證數據不丟失。
那么CMOS既然是RAM,里面的東西就能夠進行修改,用什么軟件對CMOS修改呢?需要用CMOS設置程序,而這個設置程序又在哪里?好,請返回去看BIOS的第三條功能——CMOS設置程序,所以CMOS的設置程序是BIOS本身的一個功能,而BIOS又是存在BIOS芯片中的,所以原則上應該這樣描述:用存儲在BIOS芯片中的BIOS中的CMOS設置程序對CMOS進行設置。但是這種準確的闡述顯得非常長,也有些拗口。于是干脆就把它簡單稱作“BIOS設置”或者叫“CMOS設置”。但是請一定要明白,CMOS設置才是正確的,而BIOS根本沒有設置這一說,它本身只是一個程序,實現一些功能而已,BIOS程序本身不需要任何設置
雖然BIOS本身不需要什么設置,然而BIOS畢竟是和底層硬件打交道的,硬件本身的規范也是五花八門,這需要BIOS也得及時跟上對硬件的支持。但是BIOS畢竟不是萬能的,對硬件的支持難免會“掛一漏萬”,要想隨時對最新的硬件進行支持,就需要對BIOS程序進行升級更新。前已說過BIOS程序本身是存在BIOS芯片中的,對BIOS程序的升級更新其實就是替換掉BIOS芯片的舊內容并寫入新內容,那么對于芯片來說就是刷新操作。先等一下,BIOS芯片不是個ROM嗎,怎么能刷新呢?還是請返回有關BIOS芯片的類型說明上,上面說BIOS芯片常見只有一種,叫做NOR Flash,還有上古的EEPROM,其實,BIOS芯片從ROM發展到NOR Flash主要是經歷了4代。下面就來說一下。
最早的BIOS芯片真的就是ROM,或者叫PROM。BIOS程序是在主板生產中用特殊方法燒錄進去的,一旦燒錄進去,就只能讀,不能改。如果真的想升級BIOS程序,就需要把電腦送回主板商那里,由主板商按新BIOS程序重新再燒錄一個新BIOS芯片,再把這個新芯片插回到主板,如果BIOS芯片燒錄過程中發現錯誤,這塊芯片只能報廢。由于ROM芯片只能寫入一次,因此最早的PC機想升級BIOS是非常困難的。直到EPROM的出現,使得BIOS升級成為比較容易的事。
EPROM,為Erasable Programmable ROM的詞頭縮寫,中文直譯即為可擦除可編程只讀存儲器。雖然它也是只讀存儲器,但是它卻可以多次重復擦除和寫入。它本身有一個小開窗,而暴露在外的這部分受到紫外線照射就會將芯片的內部數據擦除,當然這是物理方面的“亂擦”而已。如果實現BIOS程序的更新,還得需要兩個東西,一個是芯片的擦除器,用來擦除EPROM的原有數據;另一個則是芯片的編程器,用來將新BIOS程序寫進EPROM中,而且在寫入過程中需要加一定的編程電壓才可以。確認寫入無錯誤后,還需要用不透光的紙或者其他東西把開窗的區域擋上,避免空氣中的微弱紫外線長時間照射造成芯片內寫入的資料損壞。雖然EPROM可以多次擦除和寫入,使得升級BIOS顯得輕松許多,但是非常苛刻的擦除、寫入要求使得升級BIOS還是不那么容易。直到EEPROM或者叫E2PROM則是徹底讓BIOS升級成為傻瓜式的操作。
EEPROM中的EPROM和上段的意思一樣,前面的E是Electrically(電)的縮寫,EEPROM或者E2PROM即為電可擦除可編程只讀存儲器。對它進行擦除不需要什么紫外線,也不需要什么擦除器和編程器,只需要在擦除及寫入軟件中控制電壓就可以完全重寫EEPROM,這樣升級BIOS變得非常方便。因為EEPROM可以任意擦寫,這是很危險的(比如CIH就會對沒有寫保護的BIOS亂改導致主板Halt),所以EEPROM的BIOS芯片都會有一個開關用來切換只讀和可寫入狀態以避免被亂寫。刷新EEPROM的BIOS芯片,只需要做一個刷新程序,和要升級的BIOS程序及其他相關文件放在一起,重啟電腦進入DOS,運行一些命令就可以輕松刷新BIOS芯片內容,一些主板廠商為了方便用戶完全傻瓜式升級BIOS程序,開發出一些工具,并將這些工具直接也內置進了BIOS芯片中,從而方便升級BIOS。EEPROM雖然使得升級BIOS變得異常簡單,但是由于EEPROM還是脫胎于EPROM,擦寫時仍然需要一定的編程電壓,EEPROM無論擦除還是寫入都是以一個字節為單位,而且擦除和寫入是同時進行的,當刷新BIOS的過程中一旦出現斷電或其他異常情況,就會造成“寫入不全、擦除也不全”的混合式假BIOS程序,而且一個字節為單位進行擦除速度也很慢。到了NOR Flash則是改變了這些缺點。
NOR Flash,是非易失性存儲器(NvRAM)的一種標準,其實它基本和上面那幾個ROM標準誕生在同一時期,但是應用在BIOS芯片上則是最后的,NOR Flash由于是NvRAM的標準,可以在普通情況下任意擦除或寫入,所以不再需要加編程電壓。此外,NvRAM還可以實現大容量的存儲,對于BIOS的后繼UEFI是優點之一。還有NvRAM在擦除時是以一個塊(Block)為單位進行整體擦除的,塊是由芯片廠商人為規定的字節數,肯定不會是一個字節,因此擦除速度會很快,寫入仍然按照一字節為單位,而且寫入和擦除是分步進行的,只有確定全部塊都擦除完畢才會進行寫入操作,這些特點使得NOR Flash成為目前最大眾的BIOS芯片。
為什么BIOS程序更新后,需要重新運行CMOS設置程序設置CMOS參數?原來在升級BIOS程序過程中,原有BIOS內容已經被逐漸清掉,所以這時CMOS雖然還有硬件配置數據,但已經是無用的垃圾數據。當刷入新BIOS后,BIOS程序就恢復為初始狀態,有些部分就會有變化,當讀取CMOS時,發現和BIOS程序設置的不一樣,可能會發生錯誤,所以就需要重新運行CMOS程序設置電腦參數并保存,則CMOS的硬件信息就和BIOS中的CMOS設置一致了,再次啟動發現一致則繼續完成后續過程,直到將引導交給OS,OK,本次BIOS更新成功完成
以上說了這么多,總結如下:BIOS是一個程序,存在BIOS芯片中,而CMOS是一個集成在南橋的芯片,存的是電腦硬件配置信息,若想更改并保存起來,就需要用BIOS程序中的CMOS設置程序對其進行設置。
?
上面已經說過BIOS是個程序,存儲在BIOS芯片中,而現在的新式電腦用的基本都是UEFI啟動,早期的過渡電腦用的都是EFI啟動。其實EFI或UEFI的一部分也是存儲在一個芯片中,由于它們在表面形式、基本功能上和BIOS差不多,所以習慣上我們也把存儲EFI/UEFI的芯片叫做EFI/UEFI BIOS芯片,EFI/UEFI也叫做EFI/UEFI BIOS,但在實際上它們和BIOS根本是不一樣的,所以最好還是把后面的“BIOS”尾巴去掉為好,下面就來具體談一下BIOS、EFI和UEFI。
前篇文指出BIOS用于計算機硬件自檢、CMOS設置、引導操作系統啟動、提供硬件I/O、硬件中斷等4項主要功能,因此BIOS程序可以分為若干模塊,主要有Boot Block引導模塊、CMOS設置模塊、擴展配置數據(ESCD)模塊、DMI收集硬件數據模塊,其中引導模塊直接負責執行BIOS程序本身入口、計算機基本硬件的檢測和初始化,ESCD用于BIOS與OS交換硬件配置數據,DMI則充當了硬件管理工具和系統層之間接口的角色,通過DMI,用戶可以直觀地獲得硬件的任何信息,CMOS設置模塊就是實現對硬件信息進行設置,并保存在CMOS中,是除了啟動初始化以外BIOS程序最常用的功能。
BIOS本身是匯編語言代碼,是在16位實模式下調用INT 13H中斷執行的,由于x86-64是一個高度兼容的指令集,也為了遷就BIOS的16位實模式的運行環境,所以即使現在的CPU都已是64位,如果還是在BIOS啟動(基本見于09年以前的主板),在開機時仍然都是在16位實模式下執行的。16位實模式直接能訪問的內存只有1MB,就算你安了4G、8G或者16G還是32G內存,到了BIOS上一律只先認前1MB。在這1MB內存中,前640K稱為基本內存,后面384K內存留給開機必要硬件和各類BIOS本身使用,了解了這些,下面談一下BIOS啟動計算機的具體過程。
當按下電源開關時,電源就開始向主板和其他設備供電,這時電壓還不穩定,在早期的南北橋主板上,由主板北橋向CPU發復位信號,對CPU初始化;穩定電壓后復位信號便撤掉。而對于現在的單南橋主板,則由CPU自身調整穩定電壓達到初始化的目的,當電壓穩定后,CPU便在系統BIOS保留的內存地址處執行跳轉BIOS起始處指令,開始執行POST自檢。
在POST自檢中,BIOS只檢查系統的必要核心硬件是否有問題,主要是CPU、640K基本內存、顯卡是否正常,PS/2鍵盤控制器、系統時鐘是否有錯誤等等。由于POST檢查在顯卡初始化以前,因此在這個階段如發生錯誤,是無法在屏幕上顯示的,不過主板上還有個報警揚聲器,而且如果主板的8255外圍可編程接口芯片沒有損壞的話,POST報警聲音一定是會出來的。可以根據報警聲的不同大致判斷錯誤所在,一般情況下,一聲短“嘀”聲基本代表正常啟動,不同的錯誤則是不同的短“嘀”聲和長“嘀”聲組合。POST自檢結束后,BIOS開始調用中斷完成各種硬件初始化工作。
硬件初始化工作中,主要說明兩點,首先經過POST檢測后,電腦終于出現了開機啟動畫面,這就是已經檢測到了顯卡并完成了初始化。但是請注意,由于BIOS是在16位實模式運行,因此該畫面是以VGA分辨率(640*480,縱橫比4:3)顯示的,因為實模式最高支持的就是VGA。以前的小14-17寸CRT顯示器由于都是4:3比例,最高分辨率也比較低,因此這個開機啟動畫面沒有什么違和感,但現在的液晶顯示器基本上都是寬屏16:9的,分辨率也較高,因此在這樣的顯示屏下,啟動畫面上的一切東西顯示都可以說“慘不忍睹”——圖形被拉長,字體很大很模糊,可以很明顯看到顯示字體的鋸齒。第二,BIOS只識別到由主引導記錄(MBR)初始化的硬盤,之所以說明這點,是因為后續的EFI或UEFI采用了一種新的GUID磁盤分區系統(GPT)格式,這種硬盤在BIOS下是無法識別的。硬件全部初始化完畢后,接下來進入更新ESCD階段。
在ESCD更新階段中,BIOS將對存儲在CMOS中和操作系統交換的硬件配置數據進行檢測,如果系統硬件發生變動,則會更新該數據,否則不更新保持原狀不變,ESCD檢測或更新結束后,BIOS將完成最后一項工作,就是啟動操作系統。
最后這一步中,BIOS根據CMOS中用戶指定的硬件啟動順序,讀取相應設備的啟動或引導記錄,引導相應設備上的操作系統啟動,進入操作系統,此后便由操作系統接替BIOS負責硬件和軟件間的相互通信。如果發現所有硬件都沒有能引導操作系統的記錄,則會在屏幕上顯示相應錯誤信息,并將電腦維持在16位實模式。
雖然BIOS作為電腦加電啟動所必不可少的部分,但是從其于1975年誕生之日起近30余年,16位匯編語言代碼,1M內存尋址,調用中斷一條條執行的理念和方式竟然一點都沒有改變,雖然經各大主板商不懈努力,BIOS也有了ACPI、USB設備支持,PnP即插即用支持等新東西,但是這在根本上沒有改變BIOS的本質,而英特爾為了遷就這些舊技術,不得不在一代又一代處理器中保留著16位實模式(否則根本無法開機的)。但是,英特爾在2001年開發了全新的安騰處理器,采用IA-64架構,并推出了全新的EFI。后來證明,安騰處理器、IA-64架構沒有推廣開來,而EFI和后繼的UEFI卻發揚光大,成為現在電腦的主要預啟動環境。
EFI,是Extensible Firmware Interface的詞頭縮寫,直譯過來就是可擴展固件接口,它是用模塊化、高級語言(主要是C語言)構建的一個小型化系統,它和BIOS一樣,主要在啟動過程中完成硬件初始化,但它是直接利用加載EFI驅動的方式,識別系統硬件并完成硬件初始化,徹底摒棄讀各種中斷執行。EFI驅動并不是直接面向CPU的代碼,而是由EFI字節碼編寫成,EFI字節碼是專用于EFI的虛擬機器指令,需要在EFI驅動運行環境DXE下解釋運行,這樣EFI既可以實現通配,又提供了良好的兼容。此外,EFI完全是32位或64位,摒棄16位實模式,在EFI中就可以實現處理器的最大尋址,因此可以在任何內存地址存放任何信息。另外,由于EFI的驅動開發非常簡單,基于EFI的驅動模型原則上可以使EFI接觸到所有硬件功能,在EFI上實現文件讀寫,網絡瀏覽都是完全可能的。i,BIOS上的的CMOS設置程序在EFI上是作為一個個EFI程序來執行的,硬件設置是硬件設置程序、而啟動管理則是另一個程序,保存CMOS又是另一個程序,雖然它們在形式的Shell上是在一起的。
EFI在功能上完全等同于一個輕量化的OS,但是EFI在制定時就定位到不足以成為專業OS的地位上,首先,它只是一個硬件和操作系統間的一個接口;其次,EFI不提供中斷訪問機制,EFI必須用輪詢的方式檢查并解釋硬件,較OS下的驅動執行效率較低,最后,EFI只有簡單的存儲器管理機制,在段保護模式下只將存儲器分段,所有程序都可以存取任何一段位置,不提供真實的保護服務。伴隨著EFI,一種全新的GUID磁盤分區系統(GPT)被引入支持,傳統MBR磁盤只能存在4個主分區,只有在創建主分區不足4個時,可以建立一個擴展分區,再在其上建立被系統識別的邏輯分區,邏輯分區也是有數量的,太多的邏輯分區會嚴重影響系統啟動,MBR硬盤分區最大僅支持2T容量,對于現在的大容量硬盤來說也是浪費。GPT支持任意多的分區,每個分區大小原則上是無限制的,但實際上受到OS的規定限制不能做到無限,不過比MBR的2T限制是非常重要的進步。GPT的分區類型由GUID表唯一指定,基本不可能出現重復,其中的EFI系統分區可以被EFI存取,用來存取部分驅動和應用程序,雖然這原則上會使EFI系統分區變得不安全,但是一般這里放置的都是些“邊緣”數據,即使其被破壞,一般也不會造成嚴重后果,而且也能夠簡單的恢復回來。
當EFI發展到1.1的時候,英特爾決定把EFI公之于眾,于是后續的2.0吸引了眾多公司加入,EFI也不再屬于英特爾,而是屬于了Unified EFI Form的國際組織,EFI在2.0后也遂改稱為UEFI,UEFI,其中的EFI和原來是一個意思,U則是Unified(一元化、統一)的縮寫,所以UEFI的意思就是“統一的可擴展固件接口”,與前身EFI相比,UEFI主要有以下改進:
首先,UEFI具有完整的圖形驅動功能,之前的EFI雖然原則上加入了圖形驅動,但為了保證EFI和BIOS的良好過渡,EFI多數還是一種類DOS界面(仍然是640*480VGA分辨率),只支持PS/2鍵盤操作(極少數支持鼠標操作),不支持USB鍵盤和鼠標。到了UEFI,則是擁有了完整的圖形驅動,無論是PS/2還是USB鍵盤和鼠標,UEFI一律是支持的,而且UEFI在顯卡也支持GOP VBIOS的時候,顯示的設置界面是顯卡高分辨率按640*480或1024*768顯示,因此畫面雖小但很清楚,但是這樣會導致屏幕周圍大片留黑,不過魚和熊掌不可兼得,除非UEFI默認窗口大小也是最高分辨率
其次,UEFI具有一個獨特的功能,安全啟動,而EFI是沒有安全啟動的,安全啟動(Secure Boot),實際上通俗的解釋是叫做固件驗證。開啟UEFI的安全啟動后,主板會根據TPM芯片(或者CPU內置的TPM)記錄的硬件簽名對各硬件判斷,只有符合認證的硬件驅動才會被加載,而Win8以后的Windows則是在操作系統加載的過程中對硬件驅動繼續查簽名,符合Windows記錄的硬件才能被Windows加載,這在一定程度上降低了啟動型程序在操作系統啟動前被預加載造成的風險,但是這也會造成系統安裝變得壟斷
無論EFI還是UEFI,都必須要有預加載環境、驅動執行環境、驅動程序等必要部分組成,為了支持部分舊設備(如在UEFI下掛載傳統MBR硬盤,不支持UEFI啟動的顯卡在UEFI下仍然支持運行等),還需要一個CSM兼容性支持模塊、EFI或UEFI都是僅支持GPT磁盤引導系統的,下面就具體談一下EFI或UEFI啟動計算機的過程。
一般地,預加載環境和驅動執行環境是存儲在UEFI(UEFI BIOS)芯片中的,當打開電源開關時,電腦的主要部件都開始有了供電,與BIOS不同的是,UEFI預加載環境首先開始執行,負責CPU和內存(是全部容量)的初始化工作,這里如出現重要問題,電腦即使有報警喇叭也不會響,因為UEFI沒有去驅動8255發聲,不過預加載環境只檢查CPU和內存,如果這兩個主要硬件出問題,屏幕沒顯示可以立即確定,另外一些主板會有提供LED提示,可根據CPU或內存亮燈大致判斷故障。
CPU和內存初始化成功后,驅動執行環境(DXE)載入,當DXE載入后,UEFI就具有了枚舉并加載UEFI驅動程序的能力,在此階段,UEFI會枚舉搜索各個硬件的UEFI驅動并相繼加載,完成硬件初始化工作,這相比BIOS的讀中斷加載速度會快的多,同樣如加載顯卡的UEFI驅動成功,電腦也會出現啟動畫面,硬件驅動全部加載完畢后,最后同BIOS一樣,也得去啟動操作系統。
在啟動操作系統的階段,同樣是根據啟動記錄的啟動順序,轉到相應設備(僅限GPT設備,如果啟動傳統MBR設備,則需要打開CSM支持)的引導記錄,引導操作系統并進入,這里需要注意的是,UEFI在檢測到無任何操作系統啟動設備時,會直接進入UEFI設置頁面,而不是像BIOS那樣黑屏顯示相關信息。
綜上對BIOS和UEFI啟動計算機過程的敘述,可以概括為:BIOS先要對CPU初始化,然后跳轉到BIOS啟動處進行POST自檢,此過程如有嚴重錯誤,則電腦會用不同的報警聲音提醒,接下來采用讀中斷的方式加載各種硬件,完成硬件初始化后進入操作系統啟動過程;而UEFI則是運行預加載環境先直接初始化CPU和內存,CPU和內存若有問題則直接黑屏,其后啟動PXE采用枚舉方式搜索各種硬件并加載驅動,完成硬件初始化,之后同樣進入操作系統啟動過程。
此外,BIOS是16位匯編語言程序,只能運行在16位實模式,可訪問的內存只有1MB,而UEFI是32位或64位高級語言程序(C語言程序),突破實模式限制,可以達到要求的最大尋址
?
https://www.ithome.com/html/digi/317426.htm
https://blog.csdn.net/Scythe666/article/details/79708293