一.顯存、顯卡以及顯示器的概述
????????顯卡用于連接CPU和顯示器,我們調(diào)用顯示器時,其實就是利用顯卡提供的IO接口間接地對顯示器進行操作,所以顯卡也稱之為顯示適配器。接下來我們將優(yōu)化之前寫的MBR程序(參考:【操作系統(tǒng)】BIOS與MBR之間的過渡實踐),使我們的程序通過直接操作顯卡來輸出,顯卡給我們的輸入接口有顯存和端口,而本文中主要用到顯存。
????????如果看過我之前發(fā)過的文章(參考:【操作系統(tǒng)】BIOS開機自檢)就可以知道,內(nèi)存布局中關于顯存地址分布如下:
????????顯卡支持三種模式:文本模式、黑白圖形模式以及彩色圖形模式,本文中我們將使用文本模式,以實現(xiàn)類似Linux控制臺風格的字符界面。從起始地址0XB800到C7FFF這片32KB大小的內(nèi)存區(qū)域用于文本顯示,我們只需要把要顯示在顯示器上的字符直接輸入到0XB800開始的顯存中,顯存有了數(shù)據(jù),會直接將數(shù)據(jù)搬到顯示器屏幕上,至于數(shù)據(jù)怎么搬到屏幕上的不用我們了解,我們只要保證寫入的數(shù)據(jù)符合格式就好了。
???????? 由于在文本模式下,字符不僅可以顯示黑白顏色,也可以打印出彩色,所以每個顯示在屏幕上的字符都由2個連續(xù)的字節(jié)表示,一個字節(jié)存儲ASCII碼的數(shù)據(jù),另一個字節(jié)存儲字符的屬性:
????????在屏幕上每個字符的低字節(jié)是字符的ASCII碼,高字節(jié)屬于字符的屬性信息,其中低4位是字符前景色,高4位是字符背景色,顏色由RGB三色調(diào)和,第11位和第15位分別控制亮度位以及是否閃爍(1為高亮/閃爍,0為正常/不閃)。
二.改進MBR并解析
????????有了上面的知識,我們就可以通過改編之前的MBR程序來調(diào)用顯存了,代碼如下:
????????我們保留原先的MBR程序滾屏的操作,將通過BIOS輸出改成通過顯存輸出。我們重點來分析第9~10行,以及第19~32行代碼,其他代碼在另外一篇文章已經(jīng)解析過了,不再次贅述。
- 第9~10行
????????在第一節(jié)我們已經(jīng)知道,內(nèi)存地址0XB8000為顯存的文本模式,在實模式下,內(nèi)存的訪址方式是“段基址×16+段內(nèi)偏移地址”,所以我們直接在段寄存器gs(通過通用寄存器ax中轉,原因已在上一篇文章說明,不再贅述)中存入0xb800即可。在此有個小知識點:在進行內(nèi)存訪址時,CPU將ds作為默認的段基址寄存器,如果不用CPU默認寄存器,我們就需要自行指定具體的段基址寄存器,而這個行為叫做“段跨越前綴”。
9 mov ax,0xb800
10 mov gs,ax
- 第19~32行
????????我們直接拿前面兩段作為例子,后面的都是大同小異:
????????“mov ?byte [gs:0x00] ‘1’”是以gs為段基址寄存器,以0為偏移地址起始的內(nèi)存中,寫入大小為1byte大小的字符為”1”的ASCII碼,當然,如果你對ACSII碼十分熟悉,也可以寫成“mov ?byte [gs:0x00] 0x31”。
???????? 而第二行則是字符的屬性,具體參數(shù)可以參照上文中所提及的。
三.運行
?????????代碼編寫完成后,我們保存一下代碼(本文保存文件名為A.S),并且使用nasm對代碼進行編譯:
nasm ?–o ?A.bin ?A.S
????????此時,我們就可以開始運行調(diào)試了,我們需要用到之前寫過的一篇文章(【操作系統(tǒng)】Bochs安裝和配置)里面的兩個東西:
- ????????使用Bximage工具生成的空白鏡像(本文文件名為test.img),大小隨意,大于512個字節(jié)即可
- ????????Bochs模擬硬件環(huán)境的配置文件(文章中文件名為boch.disk)
? ? ? ? 我們首先將生成的A.bin文件寫入到空白鏡像中:
dd ?if=./A.bin ?of=./test.img ?bs=512 ?count=1 ?conv=notrunc
????????上述代碼的具體參數(shù)可以自行百度,不再次贅述,將代碼寫入到鏡像后,我們再將鏡像文件加入到Bochs的模擬硬件環(huán)境配置文件中,根據(jù)文章中所描述的,我們直接將新生成的鏡像寫入配置文件的以下位置即可:
? ? ? ? 保存一下修改后的配置文件,我們開始運行Bochs模擬器進行模擬操作:
./Bochs ?–f ? boch.disk(你自己的硬件配置文件名)
?????????運行成功后,會顯示以下信息,并且默認為【6】:
? ? ? ? 此時我們再按一次回車,即可開始模擬:
? ? ? ? 我們在控制臺中輸入“c”(具體含義請查看上面所說的文章),繼續(xù)往下運行,就能看到彈出的窗口中出現(xiàn)了我們所要的字符串:文章來源:http://www.zghlxwxcb.cn/news/detail-819470.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-819470.html
到了這里,關于【操作系統(tǒng)】優(yōu)化MBR程序:讓MBR調(diào)用顯存吧的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!