一步步编写操作系统 18 操作显卡,显存,显示器 下
接上回,大家看下顯卡各種模式的內存分布。
?
各外部設備都是通過軟件指令的形式與上層接口通信的,顯卡(顯示適配器)也不例外,所以它也有自己的bios。位置是0xC0000到0xC7FFF。顯卡支持三種模式,文本模式、黑白圖形模式,彩色圖形模式。我們只關注文本模式就好了,最終我們要實現類似linux 終端那樣的字符界面。
我們平時看的電影,一秒24楨,每一幀都是一幅圖片,有的還是高清電影,可想而知,1秒的其數據量也是很大的。為了提速,避免視覺上產生延時,硬件系統干脆讓我們直接和顯卡接觸,免得數據再經由第三道手而影響效率,直接把數據往顯存中填就好了。
之前和大家介紹過了,地址總線的范圍不只是主板上插的內存條的容量,內存條只是地址總線所能達到的范圍中的一小部分。指令中所需的任何一個地址,都是地址總線幫咱們去尋址的。地址只是個數字,地址總線把此數字指向哪個存儲介質,此地址就落到哪個介質上的某個存儲單元中。地址指向哪里,最終是地址總線說了算。如果有同學誤以為訪問某個rom的地址,是先訪問到我們的內存條后,再由計算機內的某種神奇力量將其映射到該rom,這就不對了。
從起始地址0xB8000到0xBFFFF,這片32KB大小的內存區域是用于文本顯示。我們往0xB8000處輸出的字符直接會落到顯存中,顯存中有了數據,自然顯卡就將其搬到顯示器屏幕上啦,這后續的事情咱們是不需要處理的,咱們只要保證寫進顯存的數據是正確的就ok啦。
屏幕上可以顯示多少個字符呢?這要取決于要用哪種文本模式了。
顯卡的文本模式也是分為多種模式的,用“列數*行數”來表示,如80*25, 40*25, 80*43 或者 80*50,它們的乘積是整個屏幕上可以容納的字符數。不同的模式可容納的字符數不同,如80*25表示一行80個字符,共25行。顯卡在加電后,默認就置為模式80*25,也就是一屏可以打印2000個字符。我們也在這個默認模式下工作了。
即使在文本模式下,也可以打印出彩色字符。可是ASCII碼都是1字節大小,即使標準ASCII碼也要用7位來為一個字符編碼,只剩下那1位頂多只能表示黑白兩種顏色。聰明的你肯定想到啦,必然是用一個字節來表示字符本身,再用另外的字節來表示其屬性。答對啦,事實也是如此。每個字符在屏幕上都是由2個字節來表示的,而且是連續的2個字節。
說到這里我們先算一筆賬,顯存是從0xB8000到0xBFFFF,范圍是32KB,一屏可以顯示2000個字符,顯示器上的每個字符占2字節大小,故每屏字符實際占用4000字節。這樣,我們的32KB的顯存可以容納32KB/4000B約等于8屏的數據。所以您懂了為什么linux可以用alt + Fn鍵實現tty的切換,當然這只是原理,具體的實現要涉及到顯卡的寄存器設置。顯卡上的寄存器還是非常多的,我怕此時將它們列出來會打擊大家學習積極性,以后需要時再說吧。
屏幕上每個字符的低字節是字符的ASCII碼,高字節是字符屬性元信息。在高字節中,低4位是字符前景色,高4位是字符的背景色。顏色是用RGB紅綠藍三種基色調和,第4位用來控制亮度,若置1則呈高亮,若為0則為一般正常亮度值。第7位用來控制字符是否閃爍(不是背景閃爍)。這兩字節如圖:
?
大家知道,用R紅色、G綠色、B藍色這三種顏色以任意比例混合,只可以搭配出其它顏色,其它顏色被認為都可以收這三種顏色組合而成。不過由于在文本模式下的顏色是極其有限,所以RGB的各部分比例要么是1(全部),要么是0(沒有),所以其組合出的顏色屈指可數,為了讓大家測試字符顏色更加方便,給大家提供這三種顏色的組合。
?
從上面可以看出只要亮度位I置1,顏色就是變亮變淺。大家可以結合K位來測試上面的顏色.
好了,上面內容摘自《操作系統真象還原》,大家有機會支持一下。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 18 操作显卡,显存,显示器 下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以各国拥有的黄金储备,如果重启金本位,哪
- 下一篇: sql server 数据库忘记sa账户