FrameBuffer 是出現(xiàn)在 2.2.xx 內(nèi)核當(dāng)中的一種驅(qū)動(dòng)程序接口。這種接口將顯示設(shè)備抽象為幀緩沖區(qū)。用戶可以將它看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫操作,而寫操作可以立即反應(yīng)在屏幕上。該驅(qū)動(dòng)程序的設(shè)備文件一般是 /dev/fb0、/dev/fb1 等等。比如,假設(shè)現(xiàn)在的顯示模式是 1024x768-8 位色,則可以通過(guò)如下的命令清空屏幕: $ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
|
在應(yīng)用程序中,一般通過(guò)將 FrameBuffer 設(shè)備映射到進(jìn)程地址空間的方式使用,比如下面的程序就打開(kāi) /dev/fb0 設(shè)備,并通過(guò) mmap 系統(tǒng)調(diào)用進(jìn)行地址映射,隨后用 memset 將屏幕清空(這里假設(shè)顯示模式是 1024x768-8 位色模式,線性內(nèi)存模式): int fb;unsigned char* fb_mem;fb = open ("/dev/fb0", O_RDWR);fb_mem = mmap (NULL, 1024*768, PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);memset (fb_mem, 0, 1024*768);
|
FrameBuffer 設(shè)備還提供了若干 ioctl 命令,通過(guò)這些命令,可以獲得顯示設(shè)備的一些固定信息(比如顯示內(nèi)存大?。⑴c顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息等等。 通過(guò) FrameBuffer 設(shè)備,還可以獲得當(dāng)前內(nèi)核所支持的加速顯示卡的類型(通過(guò)固定信息得到),這種類型通常是和特定顯示芯片相關(guān)的。比如目前最新的內(nèi)核(2.4.9)中,就包含有對(duì) S3、Matrox、nVidia、3Dfx 等等流行顯示芯片的加速支持。在獲得了加速芯片類型之后,應(yīng)用程序就可以將 PCI 設(shè)備的內(nèi)存I/O(memio)映射到進(jìn)程的地址空間。這些 memio 一般是用來(lái)控制顯示卡的寄存器,通過(guò)對(duì)這些寄存器的操作,應(yīng)用程序就可以控制特定顯卡的加速功能。 PCI 設(shè)備可以將自己的控制寄存器映射到物理內(nèi)存空間,而后,對(duì)這些控制寄存器的訪問(wèn),給變成了對(duì)物理內(nèi)存的訪問(wèn)。因此,這些寄存器又被稱為"memio"。一旦被映射到物理內(nèi)存,Linux 的普通進(jìn)程就可以通過(guò) mmap 將這些內(nèi)存 I/O 映射到進(jìn)程地址空間,這樣就可以直接訪問(wèn)這些寄存器了。 當(dāng)然,因?yàn)椴煌娘@示芯片具有不同的加速能力,對(duì)memio 的使用和定義也各自不同,這時(shí),就需要針對(duì)加速芯片的不同類型來(lái)編寫實(shí)現(xiàn)不同的加速功能。比如大多數(shù)芯片都提供了對(duì)矩形填充的硬件加速支持,但不同的芯片實(shí)現(xiàn)方式不同,這時(shí),就需要針對(duì)不同的芯片類型編寫不同的用來(lái)完成填充矩形的函數(shù)。 說(shuō)到這里,讀者可能已經(jīng)意識(shí)到 FrameBuffer 只是一個(gè)提供顯示內(nèi)存和顯示芯片寄存器從物理內(nèi)存映射到進(jìn)程地址空間中的設(shè)備。所以,對(duì)于應(yīng)用程序而言,如果希望在 FrameBuffer 之上進(jìn)行圖形編程,還需要完成其他許多工作。舉個(gè)例子來(lái)講,F(xiàn)rameBuffer 就像一張畫布,使用什么樣子的畫筆,如何畫畫,還需要你自己動(dòng)手完成。 |