進入保護模式總結

2021-06-09 22:17:13 字數 1225 閱讀 5895

1.最主要的就是那個jmp dword,一切都是為了jmp做準備

2.int 13h讀取扇區,既可以讀硬碟,又可以讀軟盤,應該是兩個的驅動器號不同(這個還沒搞清楚,現在只會讀軟盤)。用硬碟映像的時候,總是說找不到引導裝置,不知道是哪兒的引數錯了。

一些細節:

>cl是讀取的扇區號,1就是第1個扇區,並不是從0算起。

>kernel.s生成的就只有16b,所以只讀取16位元組。(其他的好像是0,回來試試看)

>讀取成功了,bochs有時候會告訴你成功了,有時候不會。(一次告訴我讀取了16b,一次告訴我讀取了17個扇區)。

3.複製kernel到0:0處

>0:0處在實模式下放了256個中斷向量號,每個向量號4位元組

>movsb會自動把si,di加1,所以千萬不要inc si,inc di,多此一舉(我畫蛇添足時除錯總是感覺怎麼不對勁,si一下增加2了,我還以為inc指令有問題)

>複製完了後,有些中斷向量號就被淹沒了,不能用了。

4載入gdt

>注意lgdt時,載入資料的格式。資料位址越高,就在高位。

>>如 dw 0x0000 dw gdt+0x7c00,0x0000.最後形成的gdtr內容就是0x0000,gdt+0x7c00,0x0000

>gdt是便宜位址,所以要加上這個段的起始位址0x7c00

>**段描述符的資料格式也要注意

>>dw 0xffff 0x0000 0x9e00 0x0000,和gdtr表的位址一樣,高位址在高位(話說,bochs不是模擬x86的嗎?x86的小端不是這樣的吧?這個回來也要看看)

>**段的描述符構造時也要仔細,小心,要不然bochs會出現一些段保護的錯誤。

5.操作cr0

6.jmp dword

>這一段屬於16位和32位的混合程式設計,www.nasm.us上有介紹。

>其中在0x0008:0的8上我又折騰了很久,因為一開始以為第乙個描述是0,第二個8,第三個16,第四個24。後來才想起來選擇子的格式。(所以說,先把理論上的搞清楚,該背的要背)。di13位,ti=0表示gdt,rpl

7.跳到kernel後

>本來是準備用int 10來顯示一下字串的,但是到了保護模式,中斷向量號應該是8個位元組的了,bios提供的應該不能用了吧,得自己寫中斷服務了。

8.一點感觸

>今天google的時候,發現國外很多寫os的小組,貌似國內高校就沒這麼多的小組額。。。

>英語很重要。即使是寫乙個kid os,也要耐心和知識的積累。

進入保護模式

本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...

進入保護模式

以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...

PM複習 進入保護模式

我們知道,現在大部分的cpu都是32位的,我們編寫的os當然也想在執行在32位的模式下,因為32位的cpu功能自然比16位的強大許多,32位的cpu在硬體給予了os很大的支援。但是當機器剛剛啟動時,cpu是執行在16位模式下的,所以我們必須學習怎麼樣進入32位模式,也即保護模式。16位模式也就是實模...