一步步编写操作系统 17 显存,显卡,显示器 上
為了能夠看到圖像,我們需要顯示器。無論是哪種顯示器,它都是由顯卡來控制的,我們沒必要了解液晶顯示器和普通CRT顯示器的差別。無底是哪種顯卡,它提供給我們的可編程接口都是一樣的:IO端口和顯存。
顯存是由顯卡提供的,它是位于顯卡內部的一塊內存,所以它稱為顯存。關注過顯卡產品的同學可能會知道,有的標明了DDR 512M,有的則聲稱是DDR2 1G。這指的就是顯存大小。顯卡的工作就是不斷地讀取這塊內存,隨后將其內容發送到顯示器。
我們能在顯示器上見到的各種色彩斑斕的圖像,說明顯卡可以讓顯示器工作在圖形模式,能夠在顯示器上看到linux終端上的黑屏白字,說明顯卡可以讓顯示器工作在字符模式。屏幕是由密密麻麻的像素組成的,顯存中的每一位都對應屏幕上的一個像素點。
我們打開一個網頁后,里面所加載的圖片,就是顯示器在圖形模式下的效果。按理說,顯存中的一位對應一個像素,該位要么是0,要么是1,如果讓它顯示顏色,一個像素頂多顯示黑白兩色啊,它是如何顯示彩色的呢?是啊,一位只能顯示 兩種顏色,看來只有增加位數來達到彩色的效果了。各位肯定聽說過24位真彩色吧,沒聽過也沒關系,就當您聽過了,哈哈,其實24位真彩色就是用24個bit表示一個顏色,也就是3字節的數據量來表示一種顏色。能表示多少種顏色呢,2的24次方等于16777216種。天啊,我平時就知道赤橙黃綠青藍紫七種顏色,我不是色盲,不過這么多顏色讓我分辨清楚,臣妾做不到啊。
之前有不少同學的理解只是概念性的,現在要應用到實踐中啦,在黑白圖形模式中,顯存位與屏幕像素是1對1的,因為只有兩種顏色,所以只要顯存中的對應位置為1,屏幕上的相應像素就被點亮,呈現的是白色。若該位為0,該像素就不會被點亮,只要不管該像素就是黑色,所以用黑色壁紙當桌面,才真正是在物理上保護了顯示器。而在真彩色中,是用24位對應一個像素,所以才呈現出彩色。
顯示器分不清楚給它的數據是文本還是圖像,在它眼里全都是圖像,粒度更細致點來說,全是像素信息:像素的位置及像素的顏色。只有人才能分得出這是文字、那是花草、那是星空。所以,對于圖像的輸出,最直觀的想法是:人們想輸出什么圖像就是計算出要將哪些像素點亮。這簡短的一句話,有沒有讓您心中仿佛有一萬只草泥馬奔騰而過?什么,沒有?那您幫我輸出愛因斯坦的肖像給我看,注意,我要看清他的頭發。現在草泥馬是兩萬只了?哈哈。聽上去這種用像素拼湊圖像的方法真的不亞于愚公移山。
計算機的發明是為了解決問題而不是帶來問題,聰明的工程師當然有更人道的方法,解決問題的方式是一個字符對應一字節的編碼,只要往顯存中寫入這個編碼,顯卡就知道這是要打印此字符,由它幫你完成像素的拼湊。比如字符A的編碼就是0x41,在它后面的字符B的編碼增加1,即0x42。
編碼本質上就是按照某種約定生成一組數據,這種約定可以是某種數學關系,如算法、公式,或者是某種固定關系,如像“藏頭詩”這類,關鍵字是文本中固定的位置,或者將這種對應關系事先寫到表格中,通過查表得到輸出。解碼就是根據此約定來做逆運算。破譯就是找出編碼中使用的是哪種約定并進行解碼。
最常見的編碼就是交警指揮交通時的手勢,每種手勢的意義司機都清楚,但如果不懂交通規則,自然就不明白了。
這樣,大家都約定好了,以后字符A就用16進制數字0x41來表示,甭管是誰發來的這個數,我就認為這是字符A。當然這還是有應用的前提,也得分場合,不是說只要0x41就是字符A,應該說是接收端把接收的內容當做文本來處理時,0x41才被賦予字符A的意義。數字的意義是被生產者和消費者共同定義的,主要是看處理雙方如何看待這一組數字,這就是約定的體現。就比如,小孩子太淘氣了,他在媽媽的眼里仍然是小寶貝,可在外人的眼里:這是誰家的熊孩子。
既然是約定,大家都要共同遵守才行,不能我發0x38代表A,你認為0x38是delete,堅決不能另起山頭自立門戶。所以為了大家都有據可依,一套字符編碼橫空出世,從此大家可以不出門便知三分天下,在家里上上網就知道江湖中的血雨腥風,這就是名氣響當當的ASCII碼。
ASCII碼(American Standard Code for Information Interchange,美國信息互換標準代碼)。它是由美國國家標準學會(American National Standard Institute , ANSI )制定的,是標準單字節字符編碼方案,用于描述純文本。標準ASCII 碼也叫基本ASCII碼,用7位二進制數來表示大、小寫字母,數字0~9、標點符號、以及一些控制字符。標準ASCII表中的字符分為兩大類,一類是不可見字符,控制字符屬于此類,其余為可見字符。
有了這套標準,任何字處理軟件只要認真遵守,就能得到別人的理解和認可。不知您想過沒有,在我們人類看了ASCII這套標準后,我們已經變成了字處理軟件,我們要想往顯示器或任何一個文本處理系統中輸出文本信息,我們也得必須按照這套規則來編碼了。于是乎,我們往屏幕上輸出字符A,我們要輸出數字0x41。輸出字符a,我們輸出數字0x61。那我想往屏幕上輸出0,直接輸出數字0能行嗎?由于ASCII是一套“字符”標準,它只會打印出字符,數字0可不是在屏幕上輸出的0,屏幕上的0那可是字符’0’,所以想輸出0,得輸出數字0x30。
介紹了這么多,現在就差體驗一把了,之前說過了,顯存是顯卡給我們的接口,咱們得往顯存里寫點東西才行,可是顯存在哪里,怎樣寫?下節再說。
為了能夠看到圖像,我們需要顯示器。無論是哪種顯示器,它都是由顯卡來控制的,我們沒必要了解液晶顯示器和普通CRT顯示器的差別。無底是哪種顯卡,它提供給我們的可編程接口都是一樣的:IO端口和顯存。
顯存是由顯卡提供的,它是位于顯卡內部的一塊內存,所以它稱為顯存。關注過顯卡產品的同學可能會知道,有的標明了DDR 512M,有的則聲稱是DDR2 1G。這指的就是顯存大小。顯卡的工作就是不斷地讀取這塊內存,隨后將其內容發送到顯示器。
我們能在顯示器上見到的各種色彩斑斕的圖像,說明顯卡可以讓顯示器工作在圖形模式,能夠在顯示器上看到linux終端上的黑屏白字,說明顯卡可以讓顯示器工作在字符模式。屏幕是由密密麻麻的像素組成的,顯存中的每一位都對應屏幕上的一個像素點。
我們打開一個網頁后,里面所加載的圖片,就是顯示器在圖形模式下的效果。按理說,顯存中的一位對應一個像素,該位要么是0,要么是1,如果讓它顯示顏色,一個像素頂多顯示黑白兩色啊,它是如何顯示彩色的呢?是啊,一位只能顯示 兩種顏色,看來只有增加位數來達到彩色的效果了。各位肯定聽說過24位真彩色吧,沒聽過也沒關系,就當您聽過了,哈哈,其實24位真彩色就是用24個bit表示一個顏色,也就是3字節的數據量來表示一種顏色。能表示多少種顏色呢,2的24次方等于16777216種。天啊,我平時就知道赤橙黃綠青藍紫七種顏色,我不是色盲,不過這么多顏色讓我分辨清楚,臣妾做不到啊。
之前有不少同學的理解只是概念性的,現在要應用到實踐中啦,在黑白圖形模式中,顯存位與屏幕像素是1對1的,因為只有兩種顏色,所以只要顯存中的對應位置為1,屏幕上的相應像素就被點亮,呈現的是白色。若該位為0,該像素就不會被點亮,只要不管該像素就是黑色,所以用黑色壁紙當桌面,才真正是在物理上保護了顯示器。而在真彩色中,是用24位對應一個像素,所以才呈現出彩色。
顯示器分不清楚給它的數據是文本還是圖像,在它眼里全都是圖像,粒度更細致點來說,全是像素信息:像素的位置及像素的顏色。只有人才能分得出這是文字、那是花草、那是星空。所以,對于圖像的輸出,最直觀的想法是:人們想輸出什么圖像就是計算出要將哪些像素點亮。這簡短的一句話,有沒有讓您心中仿佛有一萬只草泥馬奔騰而過?什么,沒有?那您幫我輸出愛因斯坦的肖像給我看,注意,我要看清他的頭發。現在草泥馬是兩萬只了?哈哈。聽上去這種用像素拼湊圖像的方法真的不亞于愚公移山。
計算機的發明是為了解決問題而不是帶來問題,聰明的工程師當然有更人道的方法,解決問題的方式是一個字符對應一字節的編碼,只要往顯存中寫入這個編碼,顯卡就知道這是要打印此字符,由它幫你完成像素的拼湊。比如字符A的編碼就是0x41,在它后面的字符B的編碼增加1,即0x42。
編碼本質上就是按照某種約定生成一組數據,這種約定可以是某種數學關系,如算法、公式,或者是某種固定關系,如像“藏頭詩”這類,關鍵字是文本中固定的位置,或者將這種對應關系事先寫到表格中,通過查表得到輸出。解碼就是根據此約定來做逆運算。破譯就是找出編碼中使用的是哪種約定并進行解碼。
最常見的編碼就是交警指揮交通時的手勢,每種手勢的意義司機都清楚,但如果不懂交通規則,自然就不明白了。
這樣,大家都約定好了,以后字符A就用16進制數字0x41來表示,甭管是誰發來的這個數,我就認為這是字符A。當然這還是有應用的前提,也得分場合,不是說只要0x41就是字符A,應該說是接收端把接收的內容當做文本來處理時,0x41才被賦予字符A的意義。數字的意義是被生產者和消費者共同定義的,主要是看處理雙方如何看待這一組數字,這就是約定的體現。就比如,小孩子太淘氣了,他在媽媽的眼里仍然是小寶貝,可在外人的眼里:這是誰家的熊孩子。
既然是約定,大家都要共同遵守才行,不能我發0x38代表A,你認為0x38是delete,堅決不能另起山頭自立門戶。所以為了大家都有據可依,一套字符編碼橫空出世,從此大家可以不出門便知三分天下,在家里上上網就知道江湖中的血雨腥風,這就是名氣響當當的ASCII碼。
ASCII碼(American Standard Code for Information Interchange,美國信息互換標準代碼)。它是由美國國家標準學會(American National Standard Institute , ANSI )制定的,是標準單字節字符編碼方案,用于描述純文本。標準ASCII 碼也叫基本ASCII碼,用7位二進制數來表示大、小寫字母,數字0~9、標點符號、以及一些控制字符。標準ASCII表中的字符分為兩大類,一類是不可見字符,控制字符屬于此類,其余為可見字符。
有了這套標準,任何字處理軟件只要認真遵守,就能得到別人的理解和認可。不知您想過沒有,在我們人類看了ASCII這套標準后,我們已經變成了字處理軟件,我們要想往顯示器或任何一個文本處理系統中輸出文本信息,我們也得必須按照這套規則來編碼了。于是乎,我們往屏幕上輸出字符A,我們要輸出數字0x41。輸出字符a,我們輸出數字0x61。那我想往屏幕上輸出0,直接輸出數字0能行嗎?由于ASCII是一套“字符”標準,它只會打印出字符,數字0可不是在屏幕上輸出的0,屏幕上的0那可是字符’0’,所以想輸出0,得輸出數字0x30。
介紹了這么多,現在就差體驗一把了,之前說過了,顯存是顯卡給我們的接口,咱們得往顯存里寫點東西才行,可是顯存在哪里,怎樣寫?下節再說。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 17 显存,显卡,显示器 上的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LPR转换最后期限:要不要转?转了后利息
- 下一篇: 孟晚舟说时常被姚安娜惊喜到 祝贺主演短片