0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你知道操作系統(tǒng)是如何啟動(dòng)起來(lái)的嗎

jf_78858299 ? 來(lái)源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2023-03-31 15:45 ? 次閱讀

操作系統(tǒng)被稱(chēng)為“第一個(gè)程序”,the first programme,原因很簡(jiǎn)單,只有當(dāng)操作系統(tǒng)啟動(dòng)起來(lái)后才能運(yùn)行我們編寫(xiě)的程序,那么你有沒(méi)有想過(guò)這個(gè)問(wèn)題:操作系統(tǒng)是怎樣啟動(dòng)起來(lái)的呢? 實(shí)際上這個(gè)過(guò)程就像發(fā)射火箭一樣有趣 ,看完這篇你就明白啦。

操作系統(tǒng)也是普通程序

哦對(duì)了,順便說(shuō)下,小風(fēng)哥建了一個(gè)微信技術(shù)群,感興趣的同學(xué)可以加一下,拉到最后掃描二維碼備注“加群”即可。

首先我們必須意識(shí)到這樣兩點(diǎn):

  1. CPU執(zhí)行的是機(jī)器指令,編譯器將程序翻譯后成了機(jī)器指令
  2. 操作系統(tǒng)本身也是一個(gè)程序,這個(gè)程序被編譯后也會(huì)生成一大堆機(jī)器指令

現(xiàn)在我們知道了,操作系統(tǒng)本身其實(shí)也是一大堆機(jī)器指令,既然是機(jī)器指令那么它必須得存放在什么地方。

存放在哪里呢?

想想我們編寫(xiě)的程序,編譯后生成的是可執(zhí)行文件,也就是說(shuō)是以“文件”的形式存放的,并且存放在硬盤(pán)上,而操作系統(tǒng)也沒(méi)什么不同,編譯后生成的機(jī)器指令同樣是以文件的形式存放的,存放在哪里呢?可以存放在任何能存儲(chǔ)數(shù)據(jù)的介質(zhì),像CD、磁盤(pán)之類(lèi)都可以。

我們編寫(xiě)的程序在啟動(dòng)時(shí)被加載器——也就是loader,加載到內(nèi)存,加載器也是一個(gè)程序,這是一個(gè)加載其它程序的程序;這么說(shuō)可能有點(diǎn)拗口,但計(jì)算機(jī)系統(tǒng)中有大量類(lèi)似的程序,編譯器是一個(gè)翻譯程序的程序、操作系統(tǒng)是一個(gè)運(yùn)行其它程序的程序、鏈接器是一個(gè)鏈接程序的程序、解釋器是一個(gè)執(zhí)行腳本程序的程序等等。

雞生蛋蛋生雞的問(wèn)題

回到我們的主題,我們寫(xiě)的代碼是loader加載到內(nèi)存后運(yùn)行的,那么操作系統(tǒng)這個(gè)程序是也同樣的道理,必須得有個(gè)什么東西也要把操作系統(tǒng)加載到內(nèi)存中運(yùn)行才可以,這個(gè)東西不叫l(wèi)oader,而是叫boot loader,其本身也是一個(gè)程序, 它的任務(wù)就是加載一個(gè)更大的程序 ,就像這里的操作系統(tǒng)。

此時(shí)這里會(huì)出現(xiàn)一個(gè)雞生蛋蛋生雞的,既然我們的程序是被加載器loader(操作系統(tǒng)的一部分)加載到內(nèi)存中,而操作系統(tǒng)又是被boot loader這個(gè)加載程序加載到內(nèi)存中的,那么又是什么加載器把boot loader這個(gè)加載程序加載到內(nèi)存中呢?而又又是什么加載器把上一句中的什么加載器加載內(nèi)存中呢?而又又又是什么。。?

圖片

你會(huì)發(fā)現(xiàn)這個(gè)一個(gè)沒(méi)有出口的無(wú)窮遞歸啊有沒(méi)有,總得有個(gè)什么把前一個(gè)程序加載到內(nèi)存, 就好比今天的前一天是昨天、昨天的前一天是前天、前天的前一天是大前天,如果一直這樣思考下去那么時(shí)間到底在哪里開(kāi)始的呢 ?時(shí)間到底有沒(méi)有開(kāi)始(參考時(shí)間簡(jiǎn)史或相對(duì)論)?

時(shí)間有沒(méi)有開(kāi)始這個(gè)問(wèn)題我不清楚,但操作系統(tǒng)啟動(dòng)的這個(gè)問(wèn)題我知道。

上述關(guān)于加載器以及加載加載器等問(wèn)題全部指向了內(nèi)存,讓我們好好想一想內(nèi)存有什么特殊性?

內(nèi)存斷電后是無(wú)法保存數(shù)據(jù)

程序員都知道內(nèi)存只有在加電的情況下才可以保存數(shù)據(jù),那么很顯然, 當(dāng)斷電后內(nèi)存中的內(nèi)容就丟失了 ,那么又很顯然的,當(dāng)你在按下計(jì)算機(jī)開(kāi)關(guān)通電時(shí),內(nèi)存中的內(nèi)容是未被初始化的,也就是說(shuō)內(nèi)存中的內(nèi)容是無(wú)效的, 此時(shí)的內(nèi)存里還是一片荒蕪 ,這里沒(méi)有任何東西可供CPU來(lái)執(zhí)行,這就好比大爆炸之前的宇宙。

圖片

但我們的計(jì)算機(jī)總是能啟動(dòng)起來(lái),CPU必須得執(zhí)行“一段什么程序”把第一個(gè)boot loader加載到內(nèi)存中, 由于此時(shí)內(nèi)存中還什么都沒(méi)有,那么這段程序一定被保存在了其它地方

保存在了哪里呢?

沒(méi)錯(cuò),這段程序就被保存在了BIOS的非易失性存儲(chǔ)ROM或者flash存儲(chǔ)中了,這里的代碼在即使斷電后也會(huì)保存下來(lái),加電后CPU開(kāi)始執(zhí)行這里代碼,把boot loader加載到內(nèi)存中,現(xiàn)在你應(yīng)該明白第一個(gè)boot loader是怎樣被加載到內(nèi)存的了吧。

圖片

在早期的計(jì)算機(jī)上甚至專(zhuān)門(mén)有一個(gè)按鈕,讓用戶(hù)自己選擇該從哪里,比如打孔紙帶、打孔卡片或者硬盤(pán),加載一個(gè)更復(fù)雜的程序來(lái)運(yùn)行,操作面板上的旋鈕可以控制把這些程序加載到內(nèi)存的什么位置上去:

火箭與操作系統(tǒng)啟動(dòng)

然而現(xiàn)實(shí)情況比較復(fù)雜,我們剛才提到的boot loader這段小程序功能實(shí)在是太弱了,此時(shí)其能訪問(wèn)的磁盤(pán)地址空間有限,不能把完整的內(nèi)核全部加載到操作系統(tǒng)中,該怎么辦呢?

既然boot loader比較弱那么就換一個(gè)比較牛的loader程序來(lái),就這樣出現(xiàn)了二階boot loader,second stage loader:

圖片

二階boot loader功能更為豐富,比如對(duì)硬件進(jìn)行檢查、給用戶(hù)提供選項(xiàng)加載哪個(gè)操作系統(tǒng)等等,安裝多系統(tǒng)的同學(xué)應(yīng)該知道,啟動(dòng)時(shí)會(huì)給你一個(gè)選項(xiàng)到底是啟動(dòng)windows還是linux,這就是二階boot loader的作用。

圖片

最終,操作系統(tǒng)被二階boot loader加載到內(nèi)存中開(kāi)始運(yùn)行。

你會(huì)發(fā)現(xiàn)這個(gè)過(guò)程就和發(fā)射三級(jí)火箭一樣,最初一級(jí)火箭啟動(dòng),燃料用盡后二級(jí)火箭啟動(dòng),二級(jí)火箭完成使命后三級(jí)火箭啟動(dòng),最終把衛(wèi)星送到太空,而計(jì)算機(jī)的啟動(dòng)過(guò)程也類(lèi)似。

最初是CPU運(yùn)行BIOS中的一段代碼把一級(jí)boot loader加載到內(nèi)存中運(yùn)行,該程序又會(huì)把二級(jí)boot loader加載到內(nèi)存運(yùn)行,而二級(jí)boot loader又會(huì)把操作系統(tǒng)加載到內(nèi)存中,此后控制權(quán)被轉(zhuǎn)移到操作系統(tǒng),(所謂控制權(quán)是指CPU跳轉(zhuǎn)到操作系統(tǒng)的代碼),操作系統(tǒng)開(kāi)始運(yùn)行,經(jīng)過(guò)一系列的初始化,比如硬件檢測(cè)、開(kāi)啟必要的后臺(tái)進(jìn)程等等,最終圖形界面或者命令行界面呈現(xiàn)出來(lái)。

圖片

接下來(lái)我們把這個(gè)過(guò)程細(xì)化一下。

更詳細(xì)的啟動(dòng)過(guò)程

你在按下電源的瞬間相當(dāng)于火箭點(diǎn)火,此時(shí)一級(jí)發(fā)動(dòng)機(jī)開(kāi)始工作。

加電CPU重置后開(kāi)始在地址0xffff0處開(kāi)始執(zhí)行指令,這個(gè)地址其實(shí)是BIOS ROM的末尾處,該位置其實(shí)是一個(gè)跳轉(zhuǎn)指令,跳轉(zhuǎn)到ROM的一段啟動(dòng)代碼上,該代碼會(huì)進(jìn)行必要的自檢,Power-on self-test (POST),展示BIOS啟動(dòng)界面等等,最重要的一步是找到啟動(dòng)設(shè)備,所謂啟動(dòng)設(shè)備就是指從哪里加載操作系統(tǒng),比如CD-ROM、或者磁盤(pán)、甚至U盤(pán)等都可以作為啟動(dòng)設(shè)備,早些年流行用U盤(pán)重新安裝系統(tǒng),其實(shí)就是告訴BIOS的這段代碼從U盤(pán)中加載操作系統(tǒng)。

通常BIOS會(huì)把磁盤(pán)當(dāng)做啟動(dòng)設(shè)備(大部分情況下),此時(shí)BIOS中的這段代碼開(kāi)始將磁盤(pán)的第0號(hào)塊加載到內(nèi)存中,那么這第0號(hào)塊中有什么呢?沒(méi)錯(cuò),就是第一階段boot loader程序,這第0號(hào)塊也被稱(chēng)之為Master Boot Record,MBR,肯定有不少同學(xué)聽(tīng)說(shuō)過(guò)。

圖片

到這里,火箭的一級(jí)發(fā)動(dòng)機(jī)燃料用盡,二級(jí)發(fā)動(dòng)機(jī)開(kāi)始點(diǎn)火,BIOS中的這段代碼把控制權(quán)交給加載到內(nèi)存boot loader,所謂控制權(quán)就是跳轉(zhuǎn)到boot loader程序,這樣CPU終于開(kāi)始直接與內(nèi)存交互了,CPU開(kāi)始從內(nèi)存中取出指令然后執(zhí)行。

MBR中除了包含一段可執(zhí)行代碼之外還有一個(gè)分區(qū)表,partition table,這個(gè)表的中的每一個(gè)條目本質(zhì)上在說(shuō):“操作系統(tǒng)是否在我這個(gè)分區(qū),我這個(gè)分區(qū)有多大”,CPU在執(zhí)行MBR中的代碼時(shí)會(huì)去檢查操作系統(tǒng)存在哪個(gè)分區(qū)中,定位后開(kāi)始從相應(yīng)分區(qū)的起始位置讀取磁盤(pán)數(shù)據(jù)到內(nèi)存中,這時(shí)的磁盤(pán)數(shù)據(jù)中保存的就是二階boot loader,second-stage boot loader,此時(shí)一階boot loader把控制權(quán)轉(zhuǎn)交給二階boot loader,火箭三級(jí)發(fā)動(dòng)機(jī)開(kāi)始工作。

2_boot loader的主要工作將操作系統(tǒng)加載到內(nèi)存中,此后控制權(quán)轉(zhuǎn)交給操作系統(tǒng),火箭的三級(jí)發(fā)動(dòng)機(jī)完成使命, 到這一時(shí)刻,操作系統(tǒng)開(kāi)始接管計(jì)算機(jī) ,操作系統(tǒng)經(jīng)過(guò)一系列自身的初始化后創(chuàng)建出若干必要進(jìn)程,至此計(jì)算機(jī)啟動(dòng)完畢,衛(wèi)星被成功送到了外太空中。

圖片

然而限于篇幅這里依然沒(méi)有過(guò)多涉及細(xì)節(jié),操作系統(tǒng)本身的初始化也是一個(gè)比較復(fù)雜的過(guò)程,感興趣的同學(xué)可以去翻閱相關(guān)操作系統(tǒng)的資料。

總結(jié)與腦洞

計(jì)算機(jī)的啟動(dòng)是一個(gè)多階段的過(guò)程,當(dāng)然在一些嵌入式設(shè)備等這個(gè)過(guò)程會(huì)簡(jiǎn)化,但總體上也需要經(jīng)過(guò)類(lèi)似過(guò)程,只不過(guò)階段數(shù)會(huì)少一些。

回到最開(kāi)始的那個(gè)問(wèn)題,也就是時(shí)間有沒(méi)有開(kāi)始,其實(shí)這個(gè)問(wèn)題一些物理大牛已經(jīng)回答過(guò)了, 但我很想在這里開(kāi)一個(gè)腦洞 ,當(dāng)上帝在為自己創(chuàng)建的宇宙(計(jì)算機(jī))加電的那一刻——也就是宇宙大爆炸時(shí),時(shí)間開(kāi)始了,時(shí)間這個(gè)概念是和宇宙(計(jì)算機(jī))相伴相生的,如果沒(méi)有宇宙(計(jì)算機(jī)),時(shí)間這個(gè)概念其實(shí)是沒(méi)有意義的,就好比如果沒(méi)有計(jì)算機(jī),加載這個(gè)概念其實(shí)是沒(méi)有意義的, 你思考時(shí)間到底有沒(méi)有起點(diǎn)這個(gè)問(wèn)題就好比計(jì)算機(jī)中的程序在思考到底是誰(shuí)把自己加載到內(nèi)存的、又是誰(shuí)把操作系統(tǒng)加載到內(nèi)存中的等等 。。好啦,腦洞就開(kāi)到這里。

現(xiàn)在你應(yīng)該明白計(jì)算機(jī)啟動(dòng)這個(gè)問(wèn)題了吧

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122731
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何用STM32F051把開(kāi)關(guān)磁阻電機(jī)驅(qū)動(dòng)起來(lái)???

    什么樣的PWM波形呢?有沒(méi)有大神指導(dǎo)一下啊~只要動(dòng)起來(lái)就行,不需要閉環(huán)什么的呢,求程序啊啊啊
    發(fā)表于 05-07 06:32

    請(qǐng)問(wèn)怎么使無(wú)刷電機(jī)動(dòng)起來(lái),就單單動(dòng)起來(lái)

    本人是51單片機(jī)學(xué)習(xí)者,剛剛接觸無(wú)刷電機(jī),但是連怎么讓它動(dòng)起來(lái)都搞不明白,各位可以分享一下嗎?不勝感激啊,我現(xiàn)在就想讓它動(dòng)起來(lái)先而已
    發(fā)表于 04-24 00:55

    關(guān)于用labview 的x_y圖里面的圖形動(dòng)起來(lái)

    剛學(xué)會(huì)用laview的x_Y圖繪制一條直。怎么讓這條y=f(t)直線動(dòng)起來(lái)?向下面李薩如圖形一樣。有人知道李薩如圖形是怎么用程序框圖實(shí)現(xiàn)的嗎?
    發(fā)表于 04-01 10:39

    【Landzo C1試用體驗(yàn)】+第二篇 :動(dòng)起來(lái),生活才更精彩!

    經(jīng)過(guò)不懈努力,終于完善了組裝,現(xiàn)在可以上機(jī)器人小車(chē)動(dòng)起來(lái)了,動(dòng)起來(lái),才有美感家成就感。下面上圖,本來(lái)要上傳視頻的,但是不怎么到怎么弄,要先傳到優(yōu)酷,在鏈接網(wǎng)址好像。下次有空再搞視頻上傳。在這里說(shuō)兩個(gè)
    發(fā)表于 06-02 18:55

    怎么把自定義時(shí)間像時(shí)鐘一樣動(dòng)起來(lái)

    自定義之后的時(shí)間就停在定的時(shí)間那 不會(huì)像時(shí)鐘一樣動(dòng)起來(lái) 怎么加循環(huán)讓它動(dòng)起來(lái)
    發(fā)表于 09-06 16:48

    如何讓智能小車(chē)動(dòng)起來(lái)?怎樣去編寫(xiě)其程序?

    如何讓智能小車(chē)動(dòng)起來(lái)?怎樣去編寫(xiě)其程序?怎樣去選擇智能小車(chē)的硬件?智能小車(chē)的硬件是如何進(jìn)行連接的?如何從零開(kāi)始用51單片機(jī)去實(shí)現(xiàn)智能小車(chē)的控制?
    發(fā)表于 07-14 06:48

    如何從零開(kāi)始制作51單片機(jī)控制的智能小車(chē)讓它動(dòng)起來(lái)

    如何從零開(kāi)始制作51單片機(jī)控制的智能小車(chē)讓它動(dòng)起來(lái)?
    發(fā)表于 10-21 07:43

    OK5718 qt程序上電顯示成功可界面卻沒(méi)啟動(dòng)起來(lái)怎么回事

    上電啟動(dòng)顯示[OK[ Started helloworld但是我的界面沒(méi)有啟動(dòng)起來(lái)
    發(fā)表于 01-06 06:54

    如何把輸入模塊和輸出模塊聯(lián)動(dòng)起來(lái)

    IMX6ULL單獨(dú)驅(qū)動(dòng)按鍵或LED都實(shí)現(xiàn)了,那如果我想要把輸入模塊(比如按鍵)和輸出模塊(比如LED指示燈)聯(lián)動(dòng)起來(lái),在Linux里面應(yīng)該是做哪方面的操作呢?
    發(fā)表于 01-07 08:40

    Debian69系統(tǒng)啟動(dòng)起來(lái)有點(diǎn)卡怎么解決?

    Debian 69系統(tǒng)啟動(dòng)起來(lái)有點(diǎn)卡
    發(fā)表于 09-12 07:50

    蘋(píng)果新機(jī)拉貨PCB軟板雙雄動(dòng)起來(lái)

    蘋(píng)果新機(jī)預(yù)計(jì)9月上市,相關(guān)供應(yīng)鏈已經(jīng)開(kāi)始動(dòng)起來(lái),PCB軟板雙雄臻鼎-KY、臺(tái)郡一致表示,隨著大客戶(hù)新機(jī)拉貨,營(yíng)運(yùn)自7月起增溫,并可望一路旺到11月左右,但仍需關(guān)注美中貿(mào)易戰(zhàn)對(duì)客戶(hù)拉貨與終端市場(chǎng)買(mǎi)氣的影響。
    的頭像 發(fā)表于 07-11 17:17 ?3058次閱讀

    操作系統(tǒng)是如何啟動(dòng)起來(lái)的?

    想想我們編寫(xiě)的程序,編譯后生成的是可執(zhí)行文件,也就是說(shuō)是以“文件”的形式存放的,并且存放在硬盤(pán)上,而操作系統(tǒng)也沒(méi)什么不同,編譯后生成的機(jī)器指令同樣是以文件的形式存放的,存放在哪里呢?
    的頭像 發(fā)表于 04-18 14:55 ?1007次閱讀

    讓汽車(chē)儀表組上的指針動(dòng)起來(lái)

    讓汽車(chē)儀表組上的指針動(dòng)起來(lái)
    發(fā)表于 10-31 08:23 ?0次下載
    讓汽車(chē)儀表組上的指針<b class='flag-5'>動(dòng)起來(lái)</b>

    BeagleBone AI-64、Servo Cape和讓電機(jī)動(dòng)起來(lái)

    電子發(fā)燒友網(wǎng)站提供《BeagleBone AI-64、Servo Cape和讓電機(jī)動(dòng)起來(lái).zip》資料免費(fèi)下載
    發(fā)表于 07-12 10:51 ?0次下載
    BeagleBone AI-64、Servo Cape和讓電機(jī)<b class='flag-5'>動(dòng)起來(lái)</b>

    步進(jìn)電機(jī)如何讓動(dòng)起來(lái)?步進(jìn)電機(jī)轉(zhuǎn)動(dòng)原理

    42步進(jìn)電機(jī)的步距角為1.8°,是由定子和轉(zhuǎn)子的齒數(shù)共同決定的,定子有48齒,轉(zhuǎn)子有50齒,具體是怎么算的,感興趣的同學(xué)可以自行學(xué)習(xí),今天的重點(diǎn)是讓步進(jìn)電機(jī)如何讓動(dòng)起來(lái)。
    發(fā)表于 04-01 10:40 ?1463次閱讀
    步進(jìn)電機(jī)如何讓<b class='flag-5'>動(dòng)起來(lái)</b>?步進(jìn)電機(jī)轉(zhuǎn)動(dòng)原理