溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

當(dāng)按下電源之后發(fā)生了什么?(詳解)----上

發(fā)布時(shí)間:2020-07-11 07:05:11 來(lái)源:網(wǎng)絡(luò) 閱讀:413 作者:li690347460 欄目:移動(dòng)開發(fā)

前言

       先大概概括一下當(dāng)按下電源的一瞬間之后發(fā)生的事把,先是啟動(dòng)電源,然后是初始化北橋,以及核心的硬件設(shè)備,然后將程序(BIOS)載入內(nèi)存中,讀取南橋CMOS中的數(shù)據(jù), 建立SMBIOS,接著就是我們所熟悉的開機(jī)自檢,所有硬件設(shè)備,寄存器都沒問題的后,就通過bootloader加載我們的內(nèi)核,在initrd的協(xié)助下,加載我們所系統(tǒng)所需要的所有文件系統(tǒng),模塊或者說是驅(qū)動(dòng)。所有的東東加載完畢后linux就會(huì) 啟動(dòng)我們系統(tǒng)的第一個(gè)進(jìn)程-------init。它是所有進(jìn)程的祖宗。

      上面只是一個(gè)大概的流程,接下啦,我們就詳細(xì)講講完整的開機(jī)流程。在講流程之中,會(huì)穿插講一些比較重要并且基礎(chǔ)的概念。比如BIOS.CMOS,SMBIOS等等。好了,話不多說,開始。

BIOS和CMOS
       當(dāng)用戶一按下電源鍵,CPU就會(huì)先被激活,畢竟這玩意是計(jì)算機(jī)的大腦,沒這玩意兒,電腦就是一堆會(huì)電人的廢鐵。然后CPU回去尋找BIOS,接著BIOS會(huì)先在Flash Memory中執(zhí)行,加載CMOS中用戶所喜好的設(shè)置值,然后BIOS才會(huì)將自己家壓縮到計(jì)算機(jī)的主存儲(chǔ)器中。此時(shí),若用戶按下[DEL]或F1 F2之類的一般PC的BIOS設(shè)置鍵,就可以進(jìn)入BIOS所提供的設(shè)置選項(xiàng),從而看到所有的設(shè)置值,或是當(dāng)用戶進(jìn)去操作系統(tǒng)后,操作 系統(tǒng)就可以參考內(nèi)存中的BIOS資料,訪問每一個(gè)硬件的地址。

       BIOS全名為基本輸入輸出系統(tǒng),是系統(tǒng)哦,操作系統(tǒng)本質(zhì)上來(lái)說還是一個(gè)運(yùn)行在硬件之上的軟件,所以加載它之前首先要做的就是確保每個(gè)硬件都沒問題,并且得到初始化,BIOS就是干這些活的。BIOS本質(zhì)來(lái)說只是一個(gè)燒錄在主板上的程序,程序本身的職責(zé)是干活,但是它干活 的時(shí)候的一些數(shù)據(jù)呀,配置呀怎么辦?你不能一股腦的存在程序里,畢竟你還得和通過與用戶交互,然后保存用戶所定義的配置。而CMOS這玩意兒就是用來(lái)讓BIOS存儲(chǔ)用戶設(shè)置的地方,它在南橋的一個(gè)特殊的區(qū)塊里面,在BIOS選項(xiàng)中可以設(shè)置的值都是存儲(chǔ)在這一區(qū)域中的。主板上的紐扣電池就是為了CMOS保存資料提供電源的。當(dāng)BIOS激活時(shí)回去先確認(rèn)CMOS中的資料是否正確,如果正確,便會(huì)將之前用戶存儲(chǔ)在CMOS的資料,加上已存在或找到的硬件信息,整合成為一個(gè)表格,寫到內(nèi)存中,這也就是最開始提到的SMBIOS。如果發(fā)生錯(cuò)誤,則會(huì)自動(dòng)以默認(rèn)值取代CMOS提供的資料。(利用這個(gè)原理,可以修改CMOS數(shù)據(jù),使其發(fā)生錯(cuò)誤,用默認(rèn)數(shù)據(jù)替代CMOS中的資料,可以達(dá)到清除開機(jī)密碼的目的~)SMBIOS是個(gè)不大的空間,主要的角色是扮演如何讓主板或系統(tǒng)廠商將x86架構(gòu)的系統(tǒng)通過BIOS呈現(xiàn)在 用戶面前,并且提供給BIOS的開發(fā)人員足夠的信息,讓BIOS和一些自定義的硬件去溝通.

Power On
         從 用戶按下電源開關(guān)的那一瞬間 到 BIOS POST階段,稱為Power On階段 ,也就是所謂的激活電源階段。
在Ppwer On階段,BIOS的主要工作是檢查主機(jī)上某些硬件的狀態(tài)及存儲(chǔ)在CMOS中的設(shè)置,看可能有哪些例行工作是要進(jìn)行或無(wú)法執(zhí)行的,因此,用戶無(wú)法在屏幕上看到BIOS所顯示的信息(要 等硬件確認(rèn)后才會(huì)激活VGA)。所以當(dāng)由于某些情況而造成無(wú)法開機(jī)時(shí),在屏幕上是看不到任何信息的,唯一可以抽絲剝繭排除問題的方式只有兩種:看PORT 80信息,以及聽嗶嗶的報(bào)警聲。
power on雖然是一瞬間就完成的事,不過在這個(gè)過程中發(fā)生了不少事情,比如初始話BIOS,各種數(shù)據(jù)區(qū),檢查CMOS,各種硬件設(shè)備的控制器,輸入輸出設(shè)備,顯示信息,比如cpu信息等,是否進(jìn)入設(shè)置 模式信息(就是按什么鍵進(jìn)入BIOS設(shè)置),初始化實(shí)時(shí)時(shí)鐘的時(shí)間日期。巴拉巴拉,為后面的POST做準(zhǔn)備。上面提到的BIOS加載SMOS相關(guān)的東東也是在這階段啦~


bootloader
        前期主板上的,最基本上的事情已經(jīng)結(jié)束,當(dāng)設(shè)置完成,硬件驅(qū)動(dòng)成功及硬件 檢測(cè)都沒問題之后,BIOS就將加載操作系統(tǒng)的主控制權(quán)交給硬盤內(nèi)的主引導(dǎo)扇區(qū)(MBR),讓藏?cái)z與MBR中的開機(jī)管理程序可以將指針帶到系統(tǒng)信心的地方。將bootloader這玩意兒之前,我們還是得簡(jiǎn)單說明一下MBR這玩意兒。MBR就是我們硬盤最前面 的第一個(gè)扇區(qū),一個(gè)扇區(qū)是512字節(jié),MBR被分為三個(gè)部分前446字節(jié),保存著bootloader核心程序,446字節(jié)呀,多么小的空間,在這么小的地方放一個(gè)加載整個(gè)操作系統(tǒng)的核心程序,想想都覺得厲害。接下來(lái)的64字節(jié)使我們的分區(qū)表,每16放一個(gè)分區(qū)的信息,比如從那個(gè)位置分區(qū)開始,那個(gè)地方結(jié)束 ,分區(qū) 的文件系統(tǒng)類型巴拉巴拉的~當(dāng)然我所說的這種比較老的東東~新的東東暫且不提,畢竟對(duì)于說明開機(jī)流程沒啥用~第三部分是固定的兩個(gè) 字節(jié),內(nèi)容是55aa,類似標(biāo)記結(jié)束的東東。bootloader負(fù)責(zé)加載我們linux的內(nèi)核,但是內(nèi)核保存在文件系統(tǒng)中,而且加載內(nèi)核的時(shí)候我們還希望能給內(nèi)核傳遞一些參數(shù),如果我們有好幾個(gè)系統(tǒng),我們也希望bootloader提供給我們一個(gè)選單,以便打開的我們所選擇的系統(tǒng),想想都好復(fù)雜。。。。。。所以再牛逼的程序員都不可能把這么多功能的提示信息放在小的可憐的446字節(jié)中,446字節(jié)多?。?46個(gè)字母所站的空間,223個(gè)漢子所占的空間。好吧,既然bootloader要完成的工作這么多,而mbr也就那么小,怎么辦?或許我們可以搞一個(gè)更大的空間來(lái)保存所有程序,但是程序相關(guān)的配置文件呢?程序可以死亡,復(fù)制。但是配置文件我們卻希望一直存在。說了這么多,最后的結(jié)果是bootloader被分為兩個(gè)階段,我們稱為stage1和stage2,stage1里放最核心的程序,最后再跳轉(zhuǎn)到stage2,stage2放在一個(gè)固定的文件系統(tǒng)內(nèi),stage1可以固定的跳轉(zhuǎn)到某個(gè)固定的位置,加載stage2,stage2這個(gè)程序沒有大小限制,就可以有很多功能了,我們上面所提到的功能都是stage2提供的,當(dāng)然,還有另一個(gè)問題,bootloader的配置文件必須得以文件的形式保存在文件系統(tǒng)的目錄下,但是,系統(tǒng)加載目錄里面的文件時(shí),必須得有文件系統(tǒng)的驅(qū)動(dòng)才可以呀~如果文件系統(tǒng)都是ext系列,我們就不用管那么多,一個(gè)驅(qū)動(dòng)就可以搞定,然后就可以輕松加愉快的加載我們的配置文件。但是,事實(shí)上的情況是,文件系統(tǒng)總類繁多,我們不能總是把bootloader存儲(chǔ)的文件系統(tǒng)一直只是一種文件系統(tǒng),為了提供更多文件系統(tǒng)類型的支持,我們就在stage1和stage2中間加了一個(gè)被稱為stage1.5的階段,當(dāng)安裝bootloader的時(shí)候,就會(huì)根據(jù)我們boot文件所處的文件系統(tǒng)類型,把相關(guān)的驅(qū)動(dòng)寫在一個(gè)固定的存儲(chǔ)空間內(nèi)。好,bootloader所有的階段都出現(xiàn)了,我們?cè)诳偨Y(jié)并發(fā)展一下~bios加電自檢結(jié)束后會(huì)根據(jù)用戶選得第一啟動(dòng)設(shè)備,假如是硬盤,就把硬盤前32KB加載到內(nèi)存,前512字節(jié)是MBR,其中前446字節(jié)是bootloader的第一階段,主要的任務(wù)就是跳轉(zhuǎn)到第二扇區(qū)的程序,第二扇區(qū)到后面一拖的某個(gè)地方(小于32KB)就是stage1.5安裝的位置,因?yàn)閟tage1.5里有啟動(dòng)文件所在文件系統(tǒng)的驅(qū)動(dòng),所以會(huì)在某個(gè)目錄下找到stage2的階段,并加載stage2與配置文件。那個(gè)我們經(jīng)常看到的選擇系統(tǒng)的界面就是stage2提供的~還記得嗎?bootloader的主要作用是什么呢?對(duì)!雖然這么繞,其實(shí)它的作用依然沒變,為加載內(nèi)核服務(wù)!


加載內(nèi)核
       當(dāng)GRUB加載kernel時(shí),kernel會(huì)先在內(nèi)存中制造一個(gè)rootfs當(dāng)作臨時(shí)的空間供系統(tǒng)使用,接下來(lái)kernel便會(huì)將initrd當(dāng)作一個(gè)系統(tǒng)將其掛載到rootfs上并激活,initrd主要在開機(jī)時(shí)為加載內(nèi)核提供一些核心的模塊。這個(gè)initrd是個(gè)什么東東呢?這玩意兒是在我們安裝系統(tǒng)時(shí),根據(jù)操作系統(tǒng)以及內(nèi)核所生成的一個(gè)壓縮文件。里面包括加載內(nèi)核和操作系統(tǒng)所必須的核心驅(qū)動(dòng),以及加載操作性的所有過程都是由initrd里面 的一個(gè)叫做init的腳本文件提供,initrd被掛載在rootfs上后,會(huì)根據(jù)init腳本一步一步的加載操作系統(tǒng),如果我們把initrd打開會(huì)發(fā)現(xiàn)里面有一個(gè)核心的目錄樹,比如/dev中存在 的 是一些設(shè)備文件,當(dāng)initrd加載時(shí),這些設(shè)備文件便可以開始運(yùn)行。/lib目錄里面存放許多的模塊,也就是驅(qū)動(dòng)程序,都是開機(jī)所必須加載的模塊。在 kernel加載initrd之后,initrd將會(huì)加載這些必要的開機(jī)模塊,以順利進(jìn)入硬盤中的操作系統(tǒng)。以及保存開機(jī)后所有進(jìn)程,硬件相關(guān)信息的目錄等等??偨Y(jié)一下就是,要加載內(nèi)核和整個(gè)操作系統(tǒng)之前,你得有整個(gè)文件系統(tǒng)的驅(qū)動(dòng)把?你得啟動(dòng)所有的硬盤設(shè)備把?所有硬件設(shè)備的信息得有保存的地方把?而所有的操作都是由運(yùn)行的程序執(zhí)行了,所以程序的信息也得有地方保存把?所以initrd就是為了加載內(nèi)核,加載整個(gè)操作系統(tǒng)提供必要的環(huán)境的~

切入實(shí)體操作系統(tǒng)
    當(dāng)所有 系統(tǒng)環(huán)境該有的文件系統(tǒng)基礎(chǔ)建設(shè)及設(shè)備等相關(guān)文件都建立完成后,initrd最后的工作就是要通過iinit腳本文件做轉(zhuǎn)換操作,將所有的一切交給存在硬盤中的實(shí)體操作系統(tǒng)。切換文件系統(tǒng) 的過程很簡(jiǎn)單,其實(shí)也復(fù)雜 ,大概過程是這樣,linux是目錄樹結(jié)構(gòu),根是起點(diǎn),所有在某個(gè)目錄下建一個(gè)目錄/sysroot然后把完整的文件系統(tǒng)文件全一股腦的放進(jìn)去,當(dāng)然是有規(guī)矩的放。所有東西放完之后,會(huì)把/sysroot切換為實(shí)體操作系統(tǒng)的主目錄也就是根。完成后再把之前initrd存在內(nèi)存中的資料清空。然后一個(gè)完整的操作系統(tǒng)就誕生啦~操作系統(tǒng)是誕生了,但是誕生之后可是空無(wú)一物的。我們需要一個(gè)類似女媧的東東--------所有進(jìn)程的祖宗init進(jìn)程,來(lái)生成所有 需要 用的進(jìn)程~下次我么再分享,整個(gè)操作系統(tǒng)加載完之后是如何初始話整個(gè)環(huán)境以及生成各種進(jìn)程的~

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI