日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

一步步编写操作系统 07 开机启动bios

發(fā)布時(shí)間:2023/12/10 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一步步编写操作系统 07 开机启动bios 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

bios是如何蘇醒的

bios其實(shí)一直睡在某個(gè)地方,直到被喚醒……前面熱火朝天的說了bios的功能和內(nèi)存布局,似乎還沒說到正題上,bios是如何啟動(dòng)的呢。因?yàn)閎ios是計(jì)算機(jī)上第一個(gè)運(yùn)行的軟件,所以它不可能自己加載自己,由此可以知道,它是由硬件加載的。那這個(gè)硬件是誰呢?其實(shí)前面已經(jīng)提到過了,相當(dāng)于是只讀存儲(chǔ)器ROM,因?yàn)樗恢本退谀抢锊粍?dòng)。

大家知道,只讀存儲(chǔ)器中的內(nèi)容是不可擦除的,也就是它不像動(dòng)態(tài)隨機(jī)訪問存儲(chǔ)器DRAM那樣,掉電后,里面的數(shù)據(jù)就會(huì)丟失。這種存儲(chǔ)介質(zhì)是用來存儲(chǔ)一成不變的數(shù)據(jù),當(dāng)數(shù)據(jù)寫進(jìn)去后,便與日月同輝,庭前坐看花開花落,不朽于天地萬物之間,哈哈,有點(diǎn)夸張了。

bios代碼所做的工作也是一成不變的,而且在正常情況下,其本身是不需要修改的,平時(shí)聽說的那些主板壞了要刷bios屬于例外。于是bios順理成章地便被寫進(jìn)此ROM。ROM也是塊內(nèi)存,內(nèi)存就需要被訪問。此ROM被映射在低端1M內(nèi)存的頂部,即地址0xF0000~0xFFFFF處,可以參考表1-1頂部的bios部分。只要訪問此處的地址便是訪問了bios,這個(gè)映射是由硬件完成的。

bios本身是個(gè)程序,程序要執(zhí)行,就要有個(gè)入口地址才行,此入口地址便是0xFFFF0。最重要的一點(diǎn)來了,知道了bios在哪里后,cpu如何去執(zhí)行它,即cpu中的cs:ip值是如何組合成0xFFFF0的。如果大家不了解內(nèi)存的分段訪問機(jī)制,可以參考第0章,里面有講解cpu為什么分段方式內(nèi)存。說正事,cpu訪問內(nèi)存是用段地址+偏移地址來實(shí)現(xiàn)的,由于在實(shí)模式之下,段地址需要乘以16后才能與偏移地址相加,求出的和便是物理地址,cpu便拿此地址直接用了。這個(gè)“段基址:段內(nèi)偏移地址”的組合是0xffff:0嗎?或者是0xF000:0xFFF0?或者是更奇葩一點(diǎn)的組合:0xFEEE:0x1110? 或者您想出的組合比我的還奇葩,好啦,不折磨大家了,還是說正事要緊。既然做為第一個(gè)運(yùn)行的程序都沒開始執(zhí)行,自然就沒辦法用軟件搞定這件事了,還是得靠硬件支持才行。在開機(jī)的一瞬間,也就是接電的一瞬間,cpu的cs:ip寄存器被強(qiáng)制初始化為0xF000:0xFFF0。由于開機(jī)的時(shí)候是處于實(shí)模式,再重復(fù)一遍加深印象,在實(shí)模式下的段基址要乘以16,也就是左移4位,于是0xF000:0xFFF0的等效地址將是0xFFFF0。上面說過了,此地址便是bios的入口地址。當(dāng)我給出這個(gè)地址后,不知道大家意識到什么沒有。bios是在實(shí)模式下運(yùn)行的,而實(shí)模式只能訪問1M空間(20位地址線,2的20次方是1M)。而地址0xFFFF0距1M只有16個(gè)字節(jié)了(見表1-1除標(biāo)題外的第一行),這么小的空間夠干嗎?bios又要檢測硬件、做各種初始化工作、還要建立中斷向量表……16字節(jié)的機(jī)器指令肯定干不了這么多事。也許有的同學(xué)會(huì)問,超過寄存器寬度會(huì)怎么樣呢?比如0xFFFF0+16,這樣就溢出了,由于實(shí)模式下的寄存器寬度是16位,0xFFFF0+16已經(jīng)超過了其最大值0xFFFFF。溢出的部分就會(huì)回卷到0,又會(huì)重新開始,即0xFFFF0+16等于0,0xFFFF0+17等于1。

既然此處只有16字節(jié)的空間了,這只能說明bios真正的代碼不在這,那此處的代碼只能是個(gè)跳轉(zhuǎn)指令才能解釋得通了。好,既然心里有了推斷,那咱們就來證明這個(gè)推斷正確與否。下圖是我在bochs中抓的圖,下面給大家分析一下這圖中的信息都代表什么。

?

首先得承認(rèn),這張圖有點(diǎn)超前了,這是在有了MBR后才能抓到的,否則會(huì)提示boot failed: not a bootable disk,而我們還沒有MBR,還沒有寫主引導(dǎo)記錄。先不管這張圖是怎么來的啦,反正大家馬上就能夠在自己的虛擬機(jī)里看到這張圖了,大概還有1柱香的工夫,可能是很長的那種香^—^。大家先注意框框中的內(nèi)容。一共有3個(gè),最上面左邊第1個(gè)標(biāo)有cs:ip的那個(gè)框,cs寄存器的值是0xf000,ip寄存器的值是0xfff0,也就是段基址0xf000,段內(nèi)偏移地址0xfff0,這個(gè)組合出來的地址便是0xffff0,這是處理器下一條待執(zhí)行指令的地址。這與上面所說的bios入口地址是吻合的。另外,因?yàn)閏s和ip寄存器中存儲(chǔ)的是下一條要執(zhí)行的指令,目前還沒有執(zhí)行,也就是說,當(dāng)前還沒有執(zhí)行bios,這是機(jī)器剛開機(jī)的那一刻。這一刻還是值得慶祝的,因?yàn)榧词故怯?jì)算機(jī)行業(yè)的同學(xué)都很少看到這一刻,何況我們讓這一刻停了下來,成為永恒。

按理說,既然讓cpu去執(zhí)行0xFFFF0處的內(nèi)容(目前還不知道其是指令還是數(shù)據(jù)),此內(nèi)容應(yīng)該是指令才行,否則這地址處的內(nèi)容若是數(shù)據(jù)而不是指令,cpu硬是把它當(dāng)成指令來譯碼的話,一定會(huì)弄巧成拙鑄成大錯(cuò)。現(xiàn)在咱們又有了新的推斷,物理地址0xFFFF0處應(yīng)該是指令,繼續(xù)探索。繼續(xù)看第二個(gè)框框,里面有條指令jmp far f000:e05b,這是條跳轉(zhuǎn)指令,也就是證明了在內(nèi)存物理地址0xFFFF0處的內(nèi)容是一條跳轉(zhuǎn)指令,我們的判斷是正確的。那cpu的執(zhí)行流是跳到哪里了呢?段基址0xf000左移4位+0xe05b,即跳向了0xfe05b處,這是bios代碼真正開始的地方。

第三個(gè)框框cs:f000,其意義是cs寄存器的值是f000,與我們剛剛所說的加電時(shí)強(qiáng)制將cs置為f000是吻合的,正確。接下來bios便馬不停蹄的檢測內(nèi)存,顯卡等外設(shè)信息,當(dāng)檢測通過,并初始化好硬件后,開始在內(nèi)存中0x000~0x3FF處建立數(shù)據(jù)結(jié)構(gòu),中斷向量表IVT并填寫中斷例程。

好了,終于到了接力的時(shí)刻,這是這場接力賽的第一棒,它將交給誰呢,咱們下回再說。

總結(jié)

以上是生活随笔為你收集整理的一步步编写操作系统 07 开机启动bios的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。