framebuffer简介
Linux framebuffer(/dev/fb)是用来屏蔽图形显示硬件的抽象层。如果不对硬件进行抽象屏蔽,不同硬件显卡,可能需要编写不同的驱动和应用程序。而引入framebuffer进行统一的抽象后,开发人员可以不用关心硬件平台的差异,以统一的方式编写应用层和较高内核层程序。linuxfb提供接口,让用户的应用程序可以直接访问framebuffer(显示缓存区)来实现显示功能,而不用关心framebuffer的具体实现细节。
framebuffer提供了显卡的抽象描述,同时代表了显卡上的显存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。用户将framebuffer映射到进程空间后,就可以直接进行读写操作,写操作会直接反映在屏幕显示的画面上。这种方式尤其适用于没有实际物理显存的嵌入式设备。
带GPU硬件的设备,在显示时,图形的旋转、渲染等,大部分由GPU完成。而framebuffer仅仅是一个映射,将用户写入的信息直接显示在屏幕上,所以所以的图形处理,都是在用户层实现、由CPU完成,因而CPU的负担会加重。
linuxfb设备
在linux内核嵌入式设备,或者linux内核的电脑上,执行ls -l | grep fb
可以看到系统中的linuxfb设备。
正在调试嵌入式设备,有3个fb设备,分别为fb0、fb1、fb2:
装有Ubuntu系统的PC,有1个fb设备,fb0:
可以看到/dev/fbx设备的属性是crw,字符型设备。主设备号是29,从设备号从0到31,分别对应/dev/fb0到/dev/fb31。
linuxfb驱动
framebuffer属于驱动层,在linux内核源码下,/drivers/video/fbdev/vesafb.c是通用的framebuffer驱动,该目录下还有其他一些显示芯片framebuffer的驱动。
利用linuxfb截屏
在嵌入式开发中,有时想获取屏幕当前显示内容,可以利用指令,简单的从framebuffer中读取当前显示内容:
cat /dev/fb0 > frame.raw
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt bgr24 -s 320X240 -i frame.raw -f image2 -vcodec png frame.png