操作系統實驗二:從實模式跳轉到保護模式

寫在前面的話:

      編寫這一個實驗實在是讓我感到慚愧,搗鼓了許多次,也失敗了許多次,才好不容易纔正確跳轉到保護模式。想當初我按照《自己動手寫操作系統》直接打代碼,用nasm編譯運行,儘管也會出現一些小錯誤。但仔細對照書或直接拉出源代碼來對比一下就ok了。自以爲已經完全弄懂了,如今換個編譯器,在代碼不完全通用而編譯器又極度缺乏相關的參考資料、只能靠使用bochsdbg.exe一點一點調試的情況下編寫,才知道自己當初的認識有多麼膚淺。也因爲如此,更堅定了我的想法,只有用另一種編譯器,按照編譯器作者的設計理念來實現同種功能,才能更深刻的理解操作系統。

      說說我用yc09編寫代碼是遇到的困難吧。首先,像是語法上有些細微的不同,一些指令不通用等等只算是小問題。比較麻煩的是,在一個文件裏yc09似乎只能用一種格式編譯。像是16位代碼段、32位代碼段、數據段等,只能分開編寫與編譯。如此,各代碼段間就不能根據名稱直接引用函數變量標籤等的地址計算偏移量什麼的了(也許有變通的方法,可惜我水平不夠沒找到)。但還好,因爲yc09的動態編譯特性,使得編程具有很大的靈活特性,只要預先設計好各個代碼段數據段的地址就可以了。總之,也正因爲如此,對於如何用bochsdbg.exe調試變得得心應手了。

 

實驗代碼結構說明:

      此次是由實模式跳轉到保護模式,也是由16位的代碼段跳轉到32位的代碼段。由於編譯器似乎不支持不同位數代碼段的混合編譯,因此需要分別編譯再拼裝起來,也正因爲如此,給了編程者很大的靈活度。

我對此次試驗的16位代碼段和32位代碼段只是簡單的做了如下處理:

16位代碼段放在引導扇區的前半部分,0~255字節中。

32位代碼段放在引導扇區的後半部分,256~509字節。

最後兩個字節510、511字節是引導程序結束標記:0x55、0xaa。

 

code:run.c

特別說明:此版本修正了前一個版本在實驗代碼存在語法錯誤時,無法繼續無限循環編譯實驗代碼的問題。

 

 

code:pm.h

 

code:pm16.c

 

code:pm32.c

 

 

想要實驗以上代碼的朋友請注意:

1.到楊曉兵大大的博客上下載安裝yc09,安裝只需一分鐘左右。

2.將以上run.c、boot.c代碼拷貝到某個實驗用的文件夾內。

3.在YC09/example文件夾內找到bochs.exe、BIOS-bochs-latest、VGABIOS-elpin-2.40、x11-pc-us.map四個文件拷貝到試驗用的文件夾內。

4.使用yc09編譯運行run.c

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章