FrameBuffer


http://blog.csdn.net/luxiaoxun/article/details/7622988

http://blog.csdn.net/godspirits/article/details/4031748

http://www.linuxidc.com/Linux/2011-06/37494.htm

http://www.net527.cn/a/caozuoxitong/Linux/2012/1201/25131.html

 

幀緩沖(framebuffer)是Linux為顯示設備提供的一個接口,把顯存抽象后的一種設備,他允許上層應用程序在圖形模式下直接對顯示緩沖區進行 讀寫操作。framebuffer是LCD對應的一中HAL(硬件抽象層),提供抽象的,統一的接口操作,用戶不必關心硬件層是怎么實施的。這些都是由 Framebuffer設備驅動來完成的。 
    幀緩沖設備對應的設備文件為/dev/fb*,如果系統有多個顯示卡,Linux下還可支持多個幀緩沖設備,最多可達32個,分別為/dev/fb0到 /dev/fb31,而/dev/fb則為當前缺省的幀緩沖設備,通常指向/dev/fb0,在嵌入式系統中支持一個顯示設備就夠了。幀緩沖設備為標准字 符設備,主設備號為29,次設備號則從0到31。分別對應/dev/fb0-/dev/fb31。

幀緩沖驅動的應用廣泛,在linux的桌面系統中,Xwindow服務器就是利用幀緩沖進行窗口的繪制。尤其是通過幀緩沖可顯示漢字點陣,成為Linux漢化的唯一可行方案。 

Linux FrameBuffer 本質上只是提供了對圖形設備的硬件抽象,在開發者看來,FrameBuffer 是一塊顯示緩存,往顯示緩存中寫入特定格式的數據就意味着向屏幕輸出內容。所以說FrameBuffer就是一塊白板。例如對於初始化為16 位色的FrameBuffer 來說, FrameBuffer中的兩個字節代表屏幕上一個點,從上到下,從左至右,屏幕位置與內存地址是順序的線性關系。
    幀緩存可以在系統存儲器(內存)的任意位置,視頻控制器通過訪問幀緩存來刷新屏幕。 幀緩存也叫刷新緩存 Frame buffer 或 refresh buffer, 這里的幀(frame)是指整個屏幕范圍。  
    幀緩存有個地址,是在內存里。我們通過不停的向frame buffer中寫入數據, 顯示控制器就自動的從frame buffer中取數據並顯示出來。全部的圖形都共享內存中同一個幀緩存。
    CPU指定顯示控制器工作,則顯示控制器根據CPU的控制到指定的地方去取數據 和 指令, 目前的數據一般是從顯存里取, 如果顯存里存不下,則從內存里取, 內存也放不下,則從硬盤里取,當然也不是內存放不下,而是為了節省內存的話,可以放在硬盤里,然后通過 指令控制顯示控制器去取。幀緩存 Frame Buffer,里面存儲的東西是一幀一幀的, 顯卡會不停的刷新Frame Buffer, 這每一幀如果不捕獲的話, 則會被丟棄,也就是說是實時的。這每一幀不管是保存在內存還是顯存里, 都是一個顯性的信息,這每一幀假設是800x600的分辨率, 則保存的是800x600個像素點,和顏色值。
    顯示器可以顯示無限種顏色,目前普通電腦的顯卡可以顯示32位真彩、24位真彩、16位增強色、256色。除256色外,大家可以根據自己的需要在顯卡的允許范圍之內隨意選擇。很多用戶有一種錯誤概念,認為256色是最高級的選項,而實際上正好相反。256色是最低級的選項,它已不能滿足彩色圖像的顯示需要。16位不是16種顏色,而是2的16次平方(256×256)種顏色,但256色就是256(2的8次平方)種顏色。所以16位色要比256色豐富得多。

 

一、FrameBuffer的原理

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

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

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

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

可以用命令: #dd if=/dev/zero of=/dev/fb 清空屏幕.

如果顯示模式是 1024x768-8 位色,用命令:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768 清空屏幕;

用命令: #dd if=/dev/fb of=fbfile  可以將fb中的內容保存下來;

可以重新寫回屏幕: #dd if=fbfile of=/dev/fb;

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

比如,假設現在的顯示模式是
1024x768-8 位色,則可以通過如下的命令清空屏幕:
$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768

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

一個幀緩沖設備和內存設備類似/dev/mem,並且有許多共性。你可以read,write,seek以及mmap()。不同僅僅是幀緩沖的內存不是所有的內存區,而是顯卡專用的那部分內存。

幀緩沖(frame buffer)是Linux視頻系統的核心概念,

因為視頻適配器可能基於不同的硬件體系架構,較高內核層和應用程序的實現可能會因視頻卡的不同而不同,這會導致在使用不同視頻卡的時需要采用不同的方案。隨之而來的低可移植性和冗余的代碼需要大量的投入和維護開銷。幀緩沖的概念解決了這個問題,它進行了一般化的抽象並規定編程接口,從而開發人員可以以與平台無關的方式編寫應用層和較高內核層程序。因此,內核的幀緩沖接口允許應用程序與底層圖形硬件的變化無關,如果應用和顯示器驅動程序遵循幀緩沖接口,應用程序不用改變就可以在不同類型的視頻硬件上運行。

1.framebuffer在操作系統中處於什么位置呢?framebuffer屬於驅動層
驅動和應用中間? 同上
和framebuffer一級的還有什么技術?
也就是說在開發一個系統的時候除了framebuffer還有什么別的選擇?
獨一無二,其他的選擇功能就不完全一樣了, 當然看你具體要實現什么, 可能你要實現的那個功能也是用其他方法可以實現的.

2.我們在開發一個新系統的時候如果想要用framebuffer的話,是否還需要自己寫相關顯示芯片基於framebuffer的驅動呢?
在Linux系統中有通用framebuffer驅動vesafb, 也有各自芯片的framebuffer, 芯片的framebuffer一般都有其加速功能, 當然vesafb對某些顯示芯片也有加速功能. 自己寫你必須要有技術資料,否則寫出來的就是類似vesafb了.

那么如果我的芯片本身支持一些加速的特殊處理,在freambuffer中怎么體現?
根據技術資料來處理, 一般都是些寄存器的操作吧.

3.如何知道顯示芯片是否支持framebuffer的操作?
一般都支持
選擇framebuffer時候需要注意什么?
有相應的則使用相應的, 如果沒有選擇vesafb
怎樣知道自己的系統是否適合使用framebuffer呢?
在內核中可以看到有沒有你顯卡型號的framebuffer,在 make menuconfig中查找, 如果有看到選上就是, 對應的內核目錄為linux-2.6.*/drivers/video/ .

framebuffer就相當於一個中間層,對驅動和硬件進行一個封裝和管理,便於用戶開發圖形界面或進行視頻輸出操作。

自從Linux支持了framebuffer以后,很多GUI開發都是基於framebuffer而進行的

簡單的說就是 你寫到fb里面的數據會立刻以像素的方式顯示到屏幕上,
你可以把一個位圖文件copy到fb里面然后這個圖像就會立刻顯示到屏幕上。
很多圖像庫就是基於framebuffer的。
除了framebuffer還有xwindow 也可以做gui。

設備文件:/dev/fb0 ...

 

想再問一下,那framebuffer和Xserver是什么關系呢?
我們現在很多的GUI也有直接建立在Xserver上的。我想問這類的選擇都有那些??

Linux 下的顯卡驅動有兩層, 一個是kernel層的也就是framebuffer驅動, 另一個是Xserver層驅動, 在進入X-windows之前是由framebuffer來驅動, 進入X-windows之后由XSERVER層的驅動作用(/etc/X11/xorg.conf中可以設置顯卡等驅動), 當然如果你想要在X-WINDOWS上用framebuffer驅動也可以, 可以使用Xserver中的fbdev驅動, 這個驅動可以指定你要使用kernel層的framebuffer, 比如在xorg.conf中這樣寫

Section "Device"
Identifier "Videocard0"
Driver "fbdev"
VendorName "Videocard vendor"
BoardName "VESA driver (generic)"
BusID "PCI:0:14:0"
Option "fbdev" "/dev/fb1" #使用/dev/fb1這個framebuffer驅動
EndSection

framebuffer 是一塊顯示內存,相當於存放着一楨視頻數據當然是I楨。硬件會將這塊內存中的數據以事先設定好的格式以及一定的刷新速率來進行顯示。格式中規定了一個像素 所占的字節,是否有透明等。所有的圖形庫都是在framebuffer之上的,將數據寫入framebuffer讓硬件顯示出來。

那我要是想在Framebuffer上搭建自己的Gui的話,那么是不是事件相關的事情就要自己處理了??
Framebuffer有這方面的封裝么?

順便再問一下,在看Framebuffer的時候都說他是基於控制台驅動程序,不太明白是什么意思?
能說明一控制台驅動程序是什么呢?


framebuffer驅動有提供很多硬件接口, 比如DirectFB, QT等都是基於這些硬件接口來工作的.
應該說控制台程序是基於framebuffer的,
控制台驅動程序指的應該就是framebuffer驅動吧.

 

 

 

vga=ask在kernel4.0以上不再支持

不同的顯卡,輸出的菜單是不一樣的

內核源碼下的Documentation/svga.txt說的很清楚

但是ubuntu14。04中添加vga=ask,卻報leagcy vga is no longer supported的錯,不太明白,

   The video mode to be used is selected by a kernel parameter which can be
specified in the kernel Makefile (the SVGA_MODE=... line) or by the "vga=..."
option of LILO (or some other boot loader you use) or by the "vidmode" utility
(present in standard Linux utility packages). You can use the following values
of this parameter:

 

下面是在centos7.2中可以正常顯示菜單

vi /boot/grub/grub.conf在內核行后加入vga=ask或788就啟用了framebuffer
788是十進制

788對應 0x314即800x600x16 vesa模式

791對應 0x317即1024x768x16 vesa模式

    KNL    Is a kernel start-up parameter.
    BOOT    Is a boot loader parameter.

    VGA    The VGA console has been enabled.

    vga=        [BOOT,X86-32] Select a particular video mode
            See Documentation/x86/boot.txt and
            Documentation/svga.txt.
            Use vga=ask for menu.
            This is actually a boot loader parameter; the value is
            passed to the kernel using a special protocol.


    FB    The frame buffer device is enabled.

    video=        [FB] Frame buffer configuration
            See Documentation/fb/modedb.txt.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM