之前不是給大家發(fā)了個開發(fā)操作系統(tǒng)的環(huán)境搭建教程嗎?這不,又給自己找了一堆事。大家環(huán)境搭起來了,有環(huán)境寫內(nèi)核了,問題就出來了。這篇文章就是整理的大家問的比較多的問題,還有我自己寫操作系統(tǒng)的一些問題,及研究后的一些心得體會
操作系統(tǒng)是任何一個想成為技術大牛的小伙伴必學的知識點。每個coder接觸的所有知識點,都是起源于操作系統(tǒng)。你可能想象不到,學會了操作系統(tǒng),對于一個coder,是一件多么有意義的事情。我還是建議大家抽空學一學、寫一寫。當然如果你希望有人教,歡迎加入我的手寫操作系統(tǒng)小班
一個coder不想成為大牛,結局就是被淘汰
考慮到有些小伙伴沒寫過操作系統(tǒng),我從操作系統(tǒng)是如何被運行起來的角度來寫這篇文章吧。相信如黑洞般的操作系統(tǒng)啟動過程,小伙伴們都存在著很多困惑及渴望解開謎團的好奇心
01
操作系統(tǒng)運行總覽
想探究這個過程,只有你自己寫操作系統(tǒng)才有這樣的機會。因為真實機器,你沒法調(diào)試,看不到這個過程
當你寫好了一個OS內(nèi)核,用bochs運行起來,你會發(fā)現(xiàn)bochs停留在一個斷點處。這個斷點所在的內(nèi)存地址是0xfffffff0,如圖。
注意:這時候還沒有運行你寫的OS內(nèi)核,更進一步說,你寫的OS內(nèi)核都還沒有裝入內(nèi)存
這里引出來第一個問題:當我們運行我們自己寫的OS內(nèi)核的時候,bochs為什么會在0xfffffff0處停下來
接下來第二個問題:0xfffffff0處的匯編指令是jmpf 0xf000:e05b,跳過去要執(zhí)行的代碼是做什么的?
當把0xfe05b處的代碼執(zhí)行完,會跳轉到地址0x7c00,這里是我們寫的OS內(nèi)核開始的地方
第三個問題就是:為什么我們自己寫的OS內(nèi)核要載入到0x7c00,為什么不是其他的內(nèi)存地址
這里為什么顯示的是0x7c02呢?因為我們下的斷點占兩個字節(jié),bochs從斷點的下一行開始顯示,所以如此
接下來咱們一個問題一個問題的分析
02
第一個問題
問題是,我們用bochs運行我們寫的OS內(nèi)核,為什么會停留在0xffffff0處?
我們反著來推,如果我們寫的OS內(nèi)核需要運行起來,之前需要完成內(nèi)核的加載,在加載內(nèi)核之前需要知道我們寫的OS內(nèi)核是存儲在硬盤中還是軟盤中,根據(jù)不同的存儲介質,使用不同的方式進行讀取。還有,運行OS內(nèi)核需要內(nèi)存,在運行之前是不是要檢查下有沒有插內(nèi)存條……
綜上,在運行OS內(nèi)核之前,其實要做很多事情,這些事情由誰來做呢?BIOS例程。BIOS例程是寫死在主板ROM中的一段程序。如果你經(jīng)歷過電腦開機啟動不了,你可能就聽過維修人員說這樣一句話:刷主板ROM試試
為什么要提到BIOS例程呢?因為0xffff0就是BIOS例程的入口地址。停留在這里,就是讓你有機會去調(diào)試BIOS例程,看它是如何檢測硬件、設置中斷、載入內(nèi)核、交出執(zhí)行權
03
第二個問題
問題是,0xfffffff0處的匯編指令是jmpf 0xf000:e05b,跳過去要執(zhí)行的代碼是做什么的?
其實前面也提到了,做硬件檢測,比如檢測有沒有插內(nèi)存條,內(nèi)存條容量;有沒有接入存儲介質,接入了幾塊…檢測完硬件就需要填充中斷向量表,然后將我們寫的內(nèi)核代碼讀入內(nèi)存……最后把執(zhí)行權限交給OS內(nèi)核。怎么交呢?代碼類似于jmpf 0x7c00
為什么內(nèi)存條松了開不了機,知道原因了吧
當時研究這個問題的時候,我在想,為什么要跳轉呢?講0xfe05b作為BIOS例程的入口不就可以了嗎?我也嘗試找了各種資料:Inter手冊、BIOS規(guī)范,沒找著答案,所以這個問題木有答案,大家就當純粹一聽。
當你走到一定高度,你會非常苦惱,因為計算機不是發(fā)源于我們國家,而且我們不是生活在那個年代,導致資料特別少,而且有些設計由于歷史原因流傳下來,又沒有資料說明,找不到答案
04
第三個問題
問題是,為什么我們自己寫的OS內(nèi)核要載入到0x7c00,為什么不是其他的內(nèi)存地址?
這個也是由于歷史原因。
0x7C00第一次出現(xiàn)在IBM PC 5150的BIOS處理int 19(19號中斷)的時候,IBM PC 5150是x86(32位)IBM PC/AT系列的祖先,這款PC于1981年發(fā)布,使用了intel8088(16位)的處理器和16KB的RAM內(nèi)存,BIOS和微軟的基本指令均放在該內(nèi)存中。當打開電源,BIOS開始自檢,然后出發(fā) 19號中斷,在處理19號中斷時,BIOS檢測電腦是否具有軟盤、硬盤或是固定磁盤,如果有任何可以使用的磁盤,BIOS就把磁盤的第一個扇區(qū)(512B)加載到內(nèi)存的0x7C00地址處。
那0x7C00是怎么算出來的呢?那時候計算機的最小內(nèi)存是32K,為了把盡量多的連續(xù)內(nèi)存留給操作系統(tǒng),主引導記錄就被放到了內(nèi)存地址的尾部。由于一個扇區(qū)是512字節(jié),主引導記錄本身也會產(chǎn)生數(shù)據(jù),需要另外留出512字節(jié)保存。所以,它的預留位置就變成了:
0x7FFF - 512 - 512 + 1 = 0x7C00
0x7C00就是這么算出來的
OK,到這來就把操作系統(tǒng)是如何被電腦運行起來的細節(jié)講明白了。你學廢了嗎?
-
計算機
+關注
關注
19文章
7536瀏覽量
88638 -
操作系統(tǒng)
+關注
關注
37文章
6892瀏覽量
123742 -
coder
+關注
關注
0文章
6瀏覽量
7877
發(fā)布評論請先 登錄
相關推薦
評論