你好获高,我是 shengjk1船响,多年大廠(chǎng)經(jīng)驗(yàn)躬拢,努力構(gòu)建 通俗易懂的、好玩的編程語(yǔ)言教程见间。 歡迎關(guān)注聊闯!你會(huì)有如下收益:
- 了解大廠(chǎng)經(jīng)驗(yàn)
- 擁有和大廠(chǎng)相匹配的技術(shù)等
希望看什么,評(píng)論或者私信告訴我米诉!
一菱蔬、背景
其實(shí)也沒(méi)有啥背景。
最主要的原因就像 《30天自制操作系統(tǒng)》一書(shū)作者說(shuō)的那樣史侣,寫(xiě)一個(gè)操作系統(tǒng)拴泌,僅僅想想就是一件特別有趣的事情呢。一兩年前曾經(jīng)入手開(kāi)始寫(xiě)過(guò)惊橱,但慢慢的就不了了之了◎礁現(xiàn)在又有這個(gè)想法了,準(zhǔn)備一直干下去税朴,最終寫(xiě)一個(gè)操作系統(tǒng)出來(lái)回季,算是程序員生涯的一份禮物。
其次的原因掉房,是因?yàn)槲乙舱J(rèn)為未來(lái)初級(jí)程序員的崗位會(huì)越來(lái)越少茧跋,借助 LLM 人人都是初級(jí)程序員可能會(huì)變成現(xiàn)實(shí)。這個(gè)時(shí)候?qū)I(yè)性和底層就會(huì)越來(lái)越重要
二卓囚、 0x7c00
在 從零開(kāi)發(fā)操作系統(tǒng)-第二天匯編語(yǔ)言瘾杭、BIOS以及Makefile介紹 這篇文章中,我們提到了 0x7c00 這個(gè)地址中說(shuō)了哪亿,這是IMB大叔們規(guī)定的粥烁。但我依然有很多問(wèn)題,因?yàn)镃PU要想從這個(gè)執(zhí)行蝇棉,PC寄存器必須設(shè)置為 0x7c00 才可以讨阻,但我們上篇文章從未設(shè)置過(guò) PC,滿(mǎn)滿(mǎn)的大問(wèn)號(hào)篡殷,這也帶來(lái)了一系列的問(wèn)題钝吮。
要想解決,就不得不從點(diǎn)擊開(kāi)機(jī)鍵說(shuō)起。當(dāng)我們點(diǎn)擊電腦開(kāi)機(jī)鍵的時(shí)候
在計(jì)算機(jī)啟動(dòng)過(guò)程中奇瘦,CPU 和 BIOS 的啟動(dòng)順序是這樣的:
-
電源啟動(dòng):
- 當(dāng)你按下電源按鈕時(shí)棘催,電源供應(yīng)器開(kāi)始向主板和 CPU 提供電壓。這個(gè)電源的引入觸發(fā)了CPU的硬件復(fù)位(reset)耳标。
-
CPU 初始化:
CPU 在接收到電源后會(huì)自動(dòng)初始化醇坝。這個(gè)初始化過(guò)程是硬件級(jí)別的,由 CPU 內(nèi)部的電路和微代碼控制次坡。CPU 會(huì)重置其內(nèi)部狀態(tài)呼猪,它會(huì)自動(dòng)將內(nèi)部狀態(tài)重置到一個(gè)預(yù)定義的初始狀態(tài),包括寄存器和指令指針砸琅。例如:將程序計(jì)數(shù)器(PC)設(shè)置到一個(gè)特定的啟動(dòng)地址宋距。
在x86架構(gòu)中,這個(gè)啟動(dòng)地址被硬編碼為0xFFFFFFF0(對(duì)于現(xiàn)代處理器)或0xFFFF0(對(duì)于舊的16位x86系統(tǒng))明棍。這個(gè)地址是設(shè)計(jì)時(shí)就確定的乡革,是由硬件電路和微處理器設(shè)計(jì)決定的,這個(gè)初始地址是CPU的一個(gè)硬編碼的啟動(dòng)向量摊腋,用于確保在系統(tǒng)啟動(dòng)時(shí)能夠找到并執(zhí)行BIOS(或UEFI)固件。
在早期的 x86 系統(tǒng)中嘁傀,物理內(nèi)存地址空間是 1MB(0x100000)兴蒸,而 BIOS 通常被映射在這個(gè)地址空間的高端,以避免與操作系統(tǒng)使用的內(nèi)存沖突细办。
-
BIOS 執(zhí)行:
- CPU 初始化完成后橙凳,會(huì)從預(yù)設(shè)的固定內(nèi)存地址(通常是物理地址 0xFFFFFFF0 或 0xFFFF0)開(kāi)始執(zhí)行代碼。這個(gè)地址在 x86 架構(gòu)中是 BIOS 的 ROM 或 Flash 存儲(chǔ)器的映射地址
- 這種映射地址是通過(guò)地址解碼邏輯和內(nèi)存映射硬件實(shí)現(xiàn)的笑撞,這些硬件在主板設(shè)計(jì)時(shí)就已經(jīng)確定
- BIOS 存儲(chǔ)在主板上的非易失性存儲(chǔ)器中岛啸,它包含了一系列的指令和程序,用于在系統(tǒng)啟動(dòng)時(shí)進(jìn)行硬件檢測(cè)和初始化茴肥。
-
BIOS 檢測(cè)硬件:
- BIOS 開(kāi)始執(zhí)行后坚踩,會(huì)進(jìn)行一系列的硬件檢測(cè),包括檢測(cè) CPU 類(lèi)型瓤狐、內(nèi)存大小瞬铸、硬盤(pán)、顯卡等础锐。
- BIOS 會(huì)根據(jù)檢測(cè)到的硬件配置來(lái)初始化硬件設(shè)備嗓节,并設(shè)置相應(yīng)的配置參數(shù)。
-
引導(dǎo)過(guò)程:
- 在硬件檢測(cè)和初始化完成后皆警,BIOS 會(huì)查找可引導(dǎo)設(shè)備(如硬盤(pán)拦宣、軟盤(pán)、USB驅(qū)動(dòng)器等)。
- BIOS 從可引導(dǎo)設(shè)備的第一個(gè)扇區(qū)(通常是512字節(jié))讀取數(shù)據(jù)鸵隧,并將其加載到內(nèi)存中的0x7C00地址绸罗。
-
跳轉(zhuǎn)到引導(dǎo)扇區(qū):
- BIOS 會(huì)設(shè)置一個(gè)新的 CS:IP 組合,通常是將 CS 設(shè)置為 0xF000掰派,IP 設(shè)置為 0xFFF0从诲。這樣,CS:IP 的實(shí)際值就是 0xF000:FFF0靡羡,轉(zhuǎn)換為物理地址是 0xFFFFFFF0系洛。
- 引導(dǎo)扇區(qū)的前幾個(gè)字節(jié)通常包含一個(gè)跳轉(zhuǎn)指令(如 JMP 0x7C00),這個(gè)指令會(huì)將 CPU 的 CS:IP 跳轉(zhuǎn)到 0x7C00 地址略步。
- 在 x86 架構(gòu)的 CPU 中描扯,并沒(méi)有一個(gè)名為 "PC" 的寄存器。在 x86 架構(gòu)中趟薄,程序計(jì)數(shù)器(Program Counter)的功能是由 CS(代碼段寄存器)和 IP(指令指針寄存器)共同實(shí)現(xiàn)的绽诚。這種設(shè)計(jì)是由于 x86 架構(gòu)使用了分段內(nèi)存模型。
-
執(zhí)行引導(dǎo)扇區(qū)代碼:
- 從 0x7C00 地址開(kāi)始杭煎,引導(dǎo)扇區(qū)中的代碼開(kāi)始執(zhí)行恩够。這個(gè)代碼通常會(huì)初始化一些基本的硬件設(shè)置,然后加載操作系統(tǒng)或其他引導(dǎo)加載程序羡铲。
三蜂桶、進(jìn)一步解釋
從零開(kāi)發(fā)操作系統(tǒng)-第二天匯編語(yǔ)言、BIOS以及Makefile介紹 中的匯編也用到了 jump 命令
ORG 0x7c00
JMP entry
剛開(kāi)始也切,我一直不明白扑媚,為什么《30天自制操作系統(tǒng)》一書(shū)作者說(shuō) entry 的地址就是 0x7c00,現(xiàn)在明白了,因?yàn)槌绦虻难b載地址為 0x7c00雷恃,而 entry 又是的程序入口點(diǎn)疆股,所以它的地址為 0x7c00。這個(gè) JMP 也設(shè)置了 CPU 的PC寄存器地址為 0x7C00倒槐,后續(xù) CPU 會(huì)從這里開(kāi)始執(zhí)行旬痹。
四、總結(jié)
文章深入探討了計(jì)算機(jī)啟動(dòng)過(guò)程中CPU和BIOS的相互作用导犹,以及引導(dǎo)扇區(qū)在啟動(dòng)過(guò)程中的關(guān)鍵作用唱凯。作者通過(guò)解釋硬件復(fù)位、CPU初始化谎痢、BIOS執(zhí)行磕昼、硬件檢測(cè)、引導(dǎo)過(guò)程以及執(zhí)行引導(dǎo)扇區(qū)代碼等步驟节猿,為讀者提供了對(duì)操作系統(tǒng)啟動(dòng)過(guò)程以及 0x7c00 的全面理解票从。