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