framebuffer 簡介

來源:互聯網
上載者:User

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

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

幀緩衝驅動應用廣泛,在 linux 的案頭系統中,X window 伺服器就是利用幀緩 衝進行視窗的繪製。尤其是通過幀緩衝可顯示漢字點陣,成為Linux 漢化的唯一可 行方案。

在開發人員看來,FrameBuffer 本質上是一塊顯示緩衝,往顯示緩衝中寫入特定格 式的資料就意味著向螢幕輸出內容。所以說 FrameBuffer 就是一塊白板。例如 對於初始化為 16 位色的 FrameBuffer 來說, FrameBuffer 中的兩個位元組代表螢幕上一個點,從上到下,從左至右,螢幕位置與記憶體位址是 順序的線性關係。

幀緩衝可以在系統儲存空間(記憶體)的任意位置,視頻控制器通過訪問幀緩衝來重新整理 螢幕。 幀緩衝也叫重新整理緩衝 Frame buffer 或 refresh buffer, 這裡的幀(frame)是指整個螢幕範圍。

幀緩衝有個地址,是在記憶體裡。我們通過不停的向 frame buffer 中寫入資料, 顯示控制器就自動的從 frame buffer 中取資料並顯示出來。全部的圖形都共用內 存中同一個幀緩衝。

CPU 指定顯示控制器工作,則顯示控制器根據CPU的控制到指定的地方去取資料 和指令, 目前的資料一般是從顯存裡取, 如果顯存裡存不下,則從記憶體裡取, 記憶體也放不下,則從硬碟裡取,當然也不是記憶體放不下,而是為了節省記憶體的話, 可以放在硬碟裡,然後通過 指令控制顯示控制器去取。幀緩衝 Frame Buffer 裡面儲存的東西是一幀一幀的, 顯卡會不停的重新整理 Frame Buffer, 這每一幀如 果不捕獲的話, 則會被丟棄,也就是說是即時的。這每一幀不管是儲存在記憶體 還是顯存裡, 都是一個顯性的資訊, 這每一幀假設是 800x600 的解析度, 則保 存的是 800x600 個像素點,和顏色值。

如何啟用 framebuffer

首先確認核心是否支援 framebuffer ,查看 /proc/fb 檔案是否存在,存在則 說明支援,否則,說明不支援。其次查看 framebuffer 裝置是否已啟用,若 /dev/fbx 檔案存在,則說明已經 啟用;否則說明沒有啟用。

在系統啟動時可通過向 kernel 傳送 vga=mode-number 的參數來啟用 FrameBuffer 裝置,如 vga=0x314,將會啟動 800*600*16bpp 模式 要 linux 預設啟用 framebuffer 裝置,需要將/etc/grub.conf改成如下形式:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=10
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
title Red Hat Linux (2.4.18-14)
root (hd0,0)
kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/ hdc=ide-scsi vga=0x314
initrd /boot/initrd-2.4.18-14.img

0x314 表示 800*600*16bpp,其它取值見下表:
color 640x400 640x480 800x600 1024x768 1280x1024 1600x1200
4bits ? ? 0x302 ? ? ?
8bits 0x300 0x301 0x303 0x305 0x307 0x31C
15bits ? 0x310 0x313 0x316 0x319 0x31D
16bits ? 0x311 0x314 0x317 0x31A 0x31E
24bits ? 0x312 0x315 0x318 0x31B 0x31F
32bits ? ? ? ? ? ?

framebuffer 裝置啟用後,在重啟系統時螢幕左上方會顯示一個小企鵝。

如何編程操作 framebuffer

幀緩衝裝置對應的裝置檔案為/dev/fb*,如果系統有多個顯示卡,Linux 下還可 支援多個幀緩衝裝置,最多可達 32 個,分別為 /dev/fb0 到 /dev/fb31 ,而 /dev/fb 則為當前預設的幀緩衝裝置,通常指向 /dev/fb0 。當然在嵌入式系統 中支援一個顯示裝置就夠了。幀緩衝裝置為標準字元裝置,主裝置號為 29,次 裝置號則從 0 到 31 ,分別對應 /dev/fb0 至 /dev/fb31 。通過 /dev/fb ,應用程式的操作主要有這幾種:

  1. 讀/寫(read/write)/dev/fb 檔案:相當於讀/寫螢幕緩衝區。通過 seek 介面定位讀寫位置,通過 read/write 介面讀寫具體資料;
  2. 映射(map)操作:由於 Linux 工作在保護模式,每個應用程式都有自己的 虛擬位址空間,在應用程式中是不能直接存取物理緩衝區地址的。為此, Linux 在檔案操作 file_operations 結構中提供了 mmap 函數,可將檔案的內容映射到使用者空間。對於幀緩衝裝置,則可通過映射操作,可將螢幕緩衝區的物理地址映射到使用者空間的一段虛擬位址中,之後使用者就可以通過 讀寫這段虛擬位址訪問螢幕緩衝區,在螢幕上繪圖了。實際上,使用幀緩衝裝置的應用程式都是通過映射操作來顯示圖形的。由於映射操作都是由核心來完成,下面 我們將看到,幀緩衝驅動留給開發人員的工作並不多。
  3. I/O控制:對於幀緩衝裝置,對裝置檔案的ioctl操作可讀取/設定顯示裝置及螢幕的參數,如解析度,顯示顏色數,螢幕大小等等。ioctl的 操作是由底層的驅動程式來完成的。

在應用程式中,一般通過將 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);

framebuffer 裝置還提供了若干 ioctl 命令,通過這些命令,可以獲得顯示裝置的一些固定資訊(比如
顯示記憶體大小)、與顯示模式相關的可變資訊(比如解析度、象素結構、每掃描線的位元組寬度),以及
偽彩色模式下的調色盤資訊等等。

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

PCI 裝置可以將自己的控制寄存器映射到實體記憶體空間,而後,對這些控制寄存器的訪問,給變成了對
實體記憶體的訪問。因此,這些寄存器又被稱為"memio"。一旦被映射到實體記憶體,Linux 的普通進程就可
以通過 mmap 將這些記憶體 I/O映射到進程地址空間,這樣就可以直接存取這些寄存器了。

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

framebuffer 只是一個提供顯示記憶體和顯示晶片寄存器從實體記憶體映射到進程地址空間中的裝置。所以,
對於應用程式而言,如果希望在 framebuffer 之上進行圖形編程,還需要自己動手完成其他許多工作。
工具cat

/dev/fb 是一個檔案,因此我們可以用對其讀寫。

cat /dev/fb0 > screensnap.txt  /* read current sreen to a file*/
cat screensnap.txt > /dev/fb0 /* 將 screensnap.txt 的內容貼到螢幕上 */


dd

可以用如下命令清空螢幕:
dd if=/dev/zero of=/dev/fb
如果顯示模式是 1024x768-8 位色,用如下命令清空螢幕:
dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
用如下命令可以將fb中的內容儲存下來和重新寫回螢幕:
dd if=/dev/fb of=fbfile
dd if=fbfile of=/dev/fb


fbset

fbset是一個可以查看和設定framebuffer的工具。具體使用方法可參看手冊。



  什麼是FrameBuffer? 收藏

FrameBuffer 是出現在 2.2.xx 核心當中的一種驅動程式介面。這種介面將顯示設
備抽象為框架緩衝區。使用者可以將它看成是顯示記憶體的一個映像,將其映射到進程地
址空間之後,就可以直接進行讀寫操作,而寫操作可以立即反應在螢幕上。該驅動
程式的裝置檔案一般是 /dev/fb0、/dev/fb1 等等。比如,假設現在的顯示模式是
1024x768-8 位色,則可以通過如下的命令清空螢幕:

$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768
在應用程式中,一般通過將 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);FrameBuffer 裝置還提供了若干 ioctl 命令,通過這些命令,可以獲得顯示裝置
的一些固定資訊(比如顯示記憶體大小)、與顯示模式相關的可變資訊(比如分辨
率、象素結構、每掃描線的位元組寬度),以及偽彩色模式下的調色盤資訊等等。
通過 FrameBuffer 裝置,還可以獲得當前核心所支援的加速顯示卡的類型(通過
固定資訊得到),這種類型通常是和特定顯示晶片相關的。比如目前最新的核心
(2.4.9)中,就包含有對 S3、Matrox、nVidia、3Dfx 等等流行顯示晶片的加速
支援。在獲得了加速晶片類型之後,應用程式就可以將 PCI 裝置的記憶體I/O
(memio)映射到進程的地址空間。這些 memio 一般是用來控制顯示卡的寄存器,
通過對這些寄存器的操作,應用程式就可以控制特定顯卡的加速功能。PCI 裝置可以將自己的控制寄存器映射到實體記憶體空間,而後,對這些控制寄存器
的訪問,給變成了對實體記憶體的訪問。因此,這些寄存器又被稱為"memio"。一旦
被映射到實體記憶體,Linux 的普通進程就可以通過 mmap 將這些記憶體 I/O 映射到
進程地址空間,這樣就可以直接存取這些寄存器了。當然,因為不同的顯示晶片具有不同的加速能力,對memio 的使用和定義也各自不
同,這時,就需要針對加速晶片的不同類型來編寫實現不同的加速功能。比如大多
數晶片都提供了對矩形填充的硬體加速支援,但不同的晶片實現方式不同,這時,
就需要針對不同的晶片類型編寫不同的用來完成填充矩形的函數。說到這裡,讀者可能已經意識到 FrameBuffer 只是一個提供顯示記憶體和顯示晶片
寄存器從實體記憶體映射到進程地址空間中的裝置。所以,對於應用程式而言,如果
希望在 FrameBuffer 之上進行圖形編程,還需要完成其他許多工作。舉個例子來
講,FrameBuffer 就像一張畫布,使用什麼樣子的畫筆,如何畫畫,還需要你自己
動手完成。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.