8 32位模式前期準備
今天還有些時間,再往下講一點吧。
現在,匯編語言的開發告一段落,我們要開始以C語言為主進行開發了,這是我們當前的目標。
筆者準備的C編譯器,只能生成32位模式的機器語言。如果一定要生成16位模式機器語言,雖然也不是做不到,但是很費事,還沒什么好處,所以就用32位模式吧。
所謂32位模式,指的是CPU的模式。CPU有16位和32位兩種模式。如果以16位模式啟動的話,用AX和CX等16位寄存器會非常方便,但反過來,像EAX和ECX等32位的寄存器,使用起來就很麻煩。另外,16位模式和32位模式中,機器語言的命令代碼不一樣。同樣的機器語言,解釋的方法也不一樣,所以16位模式的機器語言在32位模式下不能運行,反之亦然。
32位模式下可以使用的內存容量遠遠大于1MB。另外,CPU的自我保護功能(識別出可疑的機器語言并進行屏蔽,以免破壞系統)在16位下不能用,但32位下能用。既然有這么多優點,當然要使用32位模式了。
■■■■■
可是,如果用32位模式就不能調用BIOS功能了。這是因為BIOS是用16位機器語言寫的。如果我們有什么事情想用BIOS來做,那就全部都放在開頭先做,因為一旦進入32位模式就不能調用BIOS函數了。(當然,也有從32位返回到16位的方法,但是非常費工夫,所以本書不予贅述。)
再回頭說說要使用BIOS做的事情。畫面模式的設定已經做完了,接下來還想從BIOS得到鍵盤狀態。所謂鍵盤狀態,是指NumLock是ON還是OFF等這些狀態。
所以,我們這次只修改了haribote.nas。修改后的程序就是projects/03_day下的harib00h。
本次的haribote.nas
; haribote-os ; TAB=4 ; 有關BOOT_INFO CYLS EQU 0x0ff0 ; 設定啟動區 LEDS EQU 0x0ff1 VMODE EQU 0x0ff2 ; 關于顏色數目的信息。顏色的位數。 SCRNX EQU 0x0ff4 ; 分辨率的X(screen x) SCRNY EQU 0x0ff6 ; 分辨率的Y(screen y) VRAM EQU 0x0ff8 ; 圖像緩沖區的開始地址 ORG 0xc200 ; 這個程序將要被裝載到內存的什么地方呢? MOV AL,0x13 ; VGA顯卡,320x200x8位彩色 MOV AH,0x00 INT 0x10 MOV BYTE [VMODE],8 ; 記錄畫面模式 MOV WORD [SCRNX],320 MOV WORD [SCRNY],200 MOV DWORD [VRAM],0x000a0000 ;用BIOS取得鍵盤上各種LED指示燈的狀態 MOV AH,0x02 INT 0x16 ; keyboard BIOS MOV [LEDS], AL fin: HLT JMP fin
看一下程序就能明白,設置畫面模式之后,還把畫面模式的信息保存在了內存里。這是因為,以后我們可能要支持各種不同的畫面模式,這就需要把現在的設置信息保存起來以備后用。我們暫且將啟動時的信息稱為BOOT_INFO。INFO是英文information(信息)的縮寫。
■■■■■
[VRAM]里保存的是0xa0000。在電腦的世界里,VRAM指的是顯卡內存(video RAM),也就是用來顯示畫面的內存。這一塊內存當然可以像一般的內存一樣存儲數據,但VRAM的功能不僅限于此,它的各個地址都對應著畫面上的像素,可以利用這一機制在畫面上繪制出五彩繽紛的圖案。
其實VRAM分布在內存分布圖上好幾個不同的地方。這是因為,不同畫面模式的像素數也不一樣。當畫面模式為〇×時使用這個VRAM;而畫面模式為◇△時可能使用那個VRAM,像這樣,不同畫面模式可以使用的內存也不一樣。所以我們就預先把要使用的VRAM地址保存在BOOT_INFO里以備后用。
這次VRAM的值是0xa0000。這個值又是從哪兒得來的呢?還是來看看我們每次都參考的(AT)BIOS支持網頁。在INT 0x10的說明的最后寫著,這種畫面模式下“VRAM是0xa0000~0xaffff的64KB”。
另外,我們還把畫面的像素數、顏色數,以及從BIOS取得的鍵盤信息都保存了起來。保存位置是在內存0x0ff0附近。從內存分布圖上看,這一塊并沒被使用,所以應該沒問題。
- Linux網絡管理與配置(第2版)
- 每天5分鐘玩轉Kubernetes
- Linux系統架構與運維實戰
- Linux內核完全注釋(20周年版·第2版)
- Hands-On DevOps with Vagrant
- Kali Linux滲透測試全流程詳解
- 新手易學:系統安裝與重裝
- Mobile First Design with HTML5 and CSS3
- Django Project Blueprints
- OpenSolaris設備驅動原理與開發
- Red Hat Enterprise Linux 6.4網絡操作系統詳解
- Windows 8實戰從入門到精通(超值版)
- Drupal 7 Cookbook
- Agile IT Security Implementation Methodology
- CSS揭秘