傻子一樣的等
昨日出差,辦完事后,下午 2:30,準備進長途汽車站買票回家,被一人攔住,說可以帶我進去,車馬上就要開了,買票來不及。我以為是汽車司機,就跟了進去。進去后,他打了個電話,說 3:30 車才到,讓我先把票買了。我把錢給他,他拿了個代客車票的單子,寫了幾個字給我,說上車時再換票,然后就走了。人已走,車沒來,我拿著寫了字的紙,感覺像傻子一樣的等。3:30,車來了,我憑那張紙,順利的上了車。是為記。
保護模式
實模式采取 segemnt:offset 的方式,表示 20 位的內存地址。保護模式,段值卻變成了索引,指向 descriptor 數據結構,包含基地址,段界限,屬性。就像鍵盤的 key 不是按順序排列的一樣,這個描述符也稱得上錯落有致。歷史原因不去管它,其構成如下圖:
不難看出,base 32 位,limit 20 位,attribute 12 位,共 64 位。這就是大名鼎鼎的段描述符?,F在,我們就來實現一個保護模式的基本框架。
1.建議安裝雙系統,參看 win8 硬盤安裝 Ubuntu:http://www.CUOXin.com/china_x01/archive/2010/11/09/1872739.html
2.進入 ubuntu,在終端中執行如下命令
sudo apt-get install vgabios bochs bochs-x bximage
這是于淵給出的,但在麒麟中有點問題,還需執行
sudo apt-get install bochs-sdl
運用時,bochsrc 配置文件開頭需添加display_library : sdl,最后 keyboard_mapping 也要將 x11-pc-us.map 改為sdl-pc-us.map 。虛擬機安裝后,就是開發工具了,執行
sudo apt-get install build-essential nasm
原則上,這些就夠了。你可以用 gedit 或 vi 來開發。但我更喜歡 eclipse,所以可執行
sudo apt-get install eclipse
如提示需依賴項,可執行
sudo apt-get update
當然,CDT 是不可少的。到網上搜素下載,在 eclipse 的 help => install new software 菜單中添加,需注意版本。OK!
3.運行 eclipse,建一 c 空 makefile 項目 x01.os,完整代碼可在 x01.Lab.download 中下載。項目中,freedos.img 文件來自 bochs 網站,a.img 由 bximage 創建。在終端中進入 x01.os 目錄,執行 bochs,在 bochs 中執行 A:>format B:,對 a.img 進行格式化,退出。進入 /mnt/ 執行 sudo mkdir temp,退出。執行 make all 后,執行 bochs,在 bochs 中輸入 A:>B:/boot.com,回車,運行效果圖如下:
其中紅色的字,數據保存在內存 5M 處,遠大于實模式 1M 的限制,進入保護模式無疑。關于代碼如 mov ax, 0xAC00; int 0x21; 等的解釋,可參看 note 中的 DOS 中斷。這就像查字典一樣,兩向對照,當不太難。如能買本《Orange'S 一個操作系統的實現》,那就更好了。
4.關鍵部分,是由保護模式跳回實模式。在 .begin 段中,mov [backRealMode + 3], ax 保存的,就是實模式的 segment 地址。在 .code16 段中,backRealMode: jmp 0:realEntry 就是跳回的關鍵。保存時為什么 +3 ?jmp 1 字節,realEntry 是偏移 2 字節,所以 +3。當執行 backRealMode: jmp 0:realEntry 時,實際上執行的是 jmp segment:realEntry,由此跳回實模式。
新聞熱點
疑難解答