動手學操作系統(三、通過IO接口直接控制顯卡)
在之前的學習內容中,我們成功編寫了MBR主引導記錄,在終端上進行了打印顯示,在這一節我們使用MBR通過IO接口來直接控制顯卡輸出字符。
文章目錄
- 動手學操作系統(三、通過IO接口直接控制顯卡)
- 1. 什么是IO
- 2. 顯卡
- Reference
1. 什么是IO
為了兼容大量的硬件外設,CPU需要增加一“層”來解決不兼容的問題,在CPU和外設之間的這一層就是IO接口,IO接口的形式不限,它可以是電路板,芯片,插槽等等,它的作用就是在CPU和外設之間做相互協調的轉化。
IO接口的功能有:
- 設置數據緩沖,解決CPU與外設的速度不匹配
- 設置信號電平轉換電路
- 設置數據格式轉換
- 設置時序控制電路來同步CPU和外設
- 提供地址譯碼
同一時刻,CPU只能和一個IO接口通信,當很多IO接口都需要和CPU通信的時候,需要再增加一“層”來仲裁IO接口的競爭,這個部分就是輸入輸出控制中心(I/O control hub, ICH),一般被稱為南橋芯片。

2. 顯卡
顯卡想必不用過多的介紹,只需要理解我們為什么需要操作顯卡,我們在上一節使用了MBR在實模式下運行,使用了BIOS的0x10
中斷來打印了字符串,但是操作系統的正常工作狀態是保護模式,在保護模式下就沒有了中斷向量表,則BIOS的中斷也不能使用了,所以凡是涉及到需要向屏幕打印的操作,我們都需要操作顯卡來實現。
無論哪種顯卡,我們都只關心其向我們提供的可編程接口:IO端口和顯存。
顯卡的顯存地址分布如下

從起始地址0xB8000
到0xBFFFF
,這片32KB的內存區域是用于文本顯示的,我們往0xB8000
處輸出的字符會直接落到顯存中,顯存中有了數據,顯卡會自動將其顯示到屏幕上,這后續的處理過程交給顯卡自動完成即可,我們不需要關心。
在顯卡的文本模式下,每個字符由2
個連續字節組成,一個表示字符本身的ASCII碼,另一個表示該字符的其他顯示特性(顏色、閃爍等)

修改之前的mbr.S
文件如下
; ~/d2los/src/mbr.S
; 主引導程序
;
; LOADER_BASE_ADDR equ 0xA000
; LOADER_START_SECTOR equ 0x2
;------------------------------------------------------------
SECTION MBR vstart=0x7c00 mov ax,cs mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax; 清屏
; 利用0x06號功能,上卷全部行,可以清屏。
; -----------------------------------------------------------
; INT 0x10 功能號:0x06 功能描述:上卷窗口
; ------------------------------------------------------
; 輸入:
; AH 功能號= 0x06
; AL = 上卷的行數(如果為0,表示全部)
; BH = 上卷行屬性
; (CL,CH) = 窗口左上角的(X,Y)位置
; (DL,DH) = 窗口右下角的(X,Y)位置
; 無返回值:mov ax, 0600hmov bx, 0700hmov cx, 0 ; 左上角: (0, 0)mov dx, 184fh ; 右下角: (80, 25),; 因為VGA文本模式中,一行只能容納80個字符,共25行。; 下標從0開始,所以0x18=24,0x4f=79int 10h ; int 10h; 輸出背景色綠色,前景色紅色,并且跳動的字符串"1 MBR"mov byte [gs:0x00],'H'mov byte [gs:0x01],0xA4 ; A表示綠色背景,4表示前景色為紅色mov byte [gs:0x02],'e'mov byte [gs:0x03],0xA4mov byte [gs:0x04],'l'mov byte [gs:0x05],0xA4mov byte [gs:0x06],'l'mov byte [gs:0x07],0xA4mov byte [gs:0x08],'o'mov byte [gs:0x09],0xA4mov byte [gs:0x0A],' 'mov byte [gs:0x0B],0xA4mov byte [gs:0x0C],'W'mov byte [gs:0x0D],0xA4mov byte [gs:0x0E],'r'mov byte [gs:0x0F],0xA4mov byte [gs:0x10],'o'mov byte [gs:0x11],0xA4mov byte [gs:0x12],'l'mov byte [gs:0x13],0xA4mov byte [gs:0x14],'d'mov byte [gs:0x15],0xA4jmp $ ; 通過無限循環使程序停在此處times 510-($-$$) db 0db 0x55,0xaa
然后編譯,鏈接,執行
cd ~/d2los
nasm -o bin/mbr.bin src/mbr.S
cd ~/d2los
dd if=./bin/mbr.bin of=~/bochs/bin/hardisk60MB.img bs=512 count=1 conv=notrunc
~/bochs/bin/bochs -f ~/bochs/bin/bochsrc.disk
執行的效果如下

Reference
[1]《一個64位操作系統的設計與實現》
[2]《操作系統真象還原》