有關於directFB和freebuffer的學習

2021-07-11 01:10:06 字數 2013 閱讀 5399

參考**:**1,**2,**3,**4

directfb 專案是由德國 convergence 公司推動的 open source 計畫的一部分,它是專門為滿足嵌入式裝置要求而開發的小巧、強大、靈活和易於使用的圖形系統,並且試圖成為乙個建構於 linux framebuffer device 之上的新圖形標準。它在 framebuffer 的基礎上提供了圖形加速、輸入裝置處理提取、透明視窗和多重顯示層的功能,能夠對嵌入式系統 gui 有較好的支援。與那些通用的嵌入式 gui 系統相比,它具有非常簡潔、高效的體系結構和硬體圖形加速功能。directfb依靠核心中的framebuffer裝置驅動(/dev/fb)所提供的現有介面來訪問圖形硬體。這就意味著directfb必須要有乙個能夠正常工作的framebuffer裝置驅動才能正常執行。有些晶元組需要在linux核心中有特定的framebuffer驅動。

directfb向上提供了什麼介面:

概述:directfb最主要的是設定環境變數,其所有功能塊都是通過.so檔案,在上層應用(如qt等)執行的時候,動態載入的。

1.

2.3.

directfb向下層的framebuffer的互動:

概述:主要是通過

gfxdriver模組和下層的framebuffer互動。互動時通過共享記憶體實現的,那麼共享位址是怎麼傳遞的呢?

1.呼叫dfb_fbdev_open()開啟framebuffer裝置(如:「/dev/fb0」);

2.呼叫ioctl( dfb_fbdev->fd, fbioget_fscreeninfo, &shared->fix)獲取顯示卡記憶體和型別等固定資訊;

3.把framebuffer裝置檔案對映進虛擬記憶體,並儲存記憶體基址;

4.呼叫dfb_su***ce_pool_initialize初始化平面記憶體池。

5.通過ioctl獲取螢幕可變資訊和調色盤等資訊。

framebuffer執行的時候,可以看到/dev/fb0,fb1...。

framebuffer(幀緩衝)概述:

幀緩衝(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。

通過/dev/fb,應用程式的操作主要有這幾種: 

1. 讀/寫(read/write)/dev/fb:相當於讀/寫螢幕緩衝區。 

2. 對映(map)操作:由於linux工作在保護模式,每個應用程式都有自己的虛擬位址空間,在應用程式中是不能直接訪問物理緩衝區位址的。而幀緩衝裝置可以通過mmap()對映操作將螢幕緩衝區的物理位址對映到使用者空間的一段虛擬位址上,然後使用者就可以通過讀寫這段虛擬位址訪問螢幕緩衝區,在螢幕上繪圖了。 

3. i/o控制:對於幀緩衝裝置,對裝置檔案的ioctl操作可讀取/設定顯示裝置及螢幕的引數,如解析度,螢幕大小等相關引數。ioctl的操作是由底層的驅動程式來完成的。

對framebuffer的操作如下:

//開啟顯示裝置

fbfd = open("/dev/fb0"

, o_rdwr);  

//獲取螢幕資訊,螢幕資訊儲存在finfo裡面

if(ioctl(fbfd, fbioget_fscreeninfo, &finfo))    

相關概念之平面池(

su***ce pool):

待新增。

new和malloc,delete和free的區別

先說new和malloc new的底層也是通過malloc來開闢記憶體的,new比malloc多一項功能,就是開闢完記憶體,還可以進行初始化 int p new int 10 test p new test 第一條語句是new的基本操作,10代表開闢整型記憶體的初始值。第二條語句會在堆上開闢test...

delphi中物件的create和free

在d中每個應用程式可以獲得的記憶體空間分為兩種 堆 heap 和棧 stack 堆又稱為 自由儲存區 其中的記憶體空間的分配與釋放是必須由程式設計師來控制的。例如,用getmem函式獲取了一定大小的記憶體空間,則在使用完後,必須呼叫freemem函式將空間釋放,否則就會發生所謂的 記憶體洩漏 借債還...

求教關於被調函式中的malloc與free

問題一 在子函式中動態分配記憶體 p int malloc a sizeof int 這個函式的目的是返回p return p 我想問問,該在什麼地方進行free p 呢?如果在子函式中的return前free是肯定不行的,在之後free?子函式的return之後,不就結束函式呼叫了嗎?那時候fre...