Framebuffer Driver(轉載)

中文名爲:幀緩衝驅動

一、FrameBuffer的原理

FrameBuffer 是出現在 2.2.xx 內核當中的一種驅動程序接口。

Linux是工作在保護模式下,所以用戶態進程是無法象DOS那樣使用顯卡BIOS裏提供的中斷調用來實現直接寫屏,Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。Framebuffer機制模仿顯卡的功能,將顯卡硬件結構抽象掉,可以通過Framebuffer的讀寫直接對顯存進行操作。用戶可以將Framebuffer看成是顯示內存的一個映像,將其映射到進程地址空間之後,就可以直接進行讀寫操作,而寫操作可以立即反應在屏幕上。這種操作是抽象的,統一的。用戶不必關心物理顯存的位置、換頁機制等等具體細節。這些都是由Framebuffer設備驅動來完成的。

但Framebuffer本身不具備任何運算數據的能力,就只好比是一個暫時存放水的水池.CPU將運算後的結果放到這個水池,水池再將結果流到顯示器.中間不會對數據做處理. 應用程序也可以直接讀寫這個水池的內容.在這種機制下,儘管Framebuffer需要真正的顯卡驅動的支持,但所有顯示任務都有CPU完成,因此CPU負擔很重

framebuffer的設備文件一般是 /dev/fb0、/dev/fb1 等等。

在使用Framebuffer時,Linux是將顯卡置於圖形模式下的.

在應用程序中,一般通過將 FrameBuffer 設備映射到進程地址空間的方式使用,比如下面的程序就打開 /dev/fb0 設備,並通過 mmap 系統調用進行地址映射,隨後用 memset 將屏幕清空(這裏假設顯示模式是 1024x768-8 位色模式,線性內存模式):

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); //這個命令應該只有在root可以執行

FrameBuffer 設備還提供了若干 ioctl 命令,通過這些命令,可以獲得顯示設備的一些固定信息(比如顯示內存大小)、與顯示模式相關的可變信息(比如分辨率、象素結構、每掃描線的字節寬度),以及僞彩色模式下的調色板信息等等。

通過 FrameBuffer 設備,還可以獲得當前內核所支持的加速顯示卡的類型(通過固定信息得到),這種類型通常是和特定顯示芯片相關的。比如目前最新的內核(2.4.9)中,就包含有對 S3、Matrox、nVidia、3Dfx 等等流行顯示芯片的加速支持。在獲得了加速芯片類型之後,應用程序就可以將 PCI 設備的內存I/O(memio)映射到進程的地址空間。這些 memio 一般是用來控制顯示卡的寄存器,通過對這些寄存器的操作,應用程序就可以控制特定顯卡的加速功能。

PCI 設備可以將自己的控制寄存器映射到物理內存空間,而後,對這些控制寄存器的訪問,給變成了對物理內存的訪問。因此,這些寄存器又被稱爲"memio"。一旦被映射到物理內存,Linux 的普通進程就可以通過 mmap 將這些內存 I/O 映射到進程地址空間,這樣就可以直接訪問這些寄存器了。

當然,因爲不同的顯示芯片具有不同的加速能力,對memio 的使用和定義也各自不同,這時,就需要針對加速芯片的不同類型來編寫實現不同的加速功能。比如大多數芯片都提供了對矩形填充的硬件加速支持,但不同的芯片實現方式不同,這時,就需要針對不同的芯片類型編寫不同的用來完成填充矩形的函數。

FrameBuffer 只是一個提供顯示內存和顯示芯片寄存器從物理內存映射到進程地址空間中的設備。所以,對於應用程序而言,如果希望在 FrameBuffer 之上進行圖形編程,還需要自己動手完成其他許多工作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章