博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FrameBuffer
阅读量:5751 次
发布时间:2019-06-18

本文共 5910 字,大约阅读时间需要 19 分钟。

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.

 

转载于:https://www.cnblogs.com/createyuan/p/4437912.html

你可能感兴趣的文章
多项式前k项和java_多项式朴素贝叶斯softmax改变
查看>>
java数组只能交换0下标和n_编程练习-只用0交换排序数组
查看>>
centos7安装mysql视频教程_centos7安装mysql(完整)
查看>>
php图片赋值,php如何优雅地赋值
查看>>
【探索HTML5第二弹01】HTML5的前世今生以及来世
查看>>
Failed to connect to remote VM. Connection refused. Connection refused: connect
查看>>
freeze
查看>>
SAP HANA存储过程结果视图调用
查看>>
设计模式 ( 十八 ):State状态模式 -- 行为型
查看>>
OracleLinux安装说明
查看>>
nova分析(7)—— nova-scheduler
查看>>
Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
查看>>
OpenMediaVault 搭建git,ssh无法连接问题
查看>>
java多线程之:Java中的ReentrantLock和synchronized两种锁定机制的对比 (转载)
查看>>
【Web动画】SVG 实现复杂线条动画
查看>>
使用Wireshark捕捉USB通信数据
查看>>
Apache Storm 官方文档 —— FAQ
查看>>
iOS 高性能异构滚动视图构建方案 —— LazyScrollView
查看>>
Java 重载、重写、构造函数详解
查看>>
【Best Practice】基于阿里云数加·StreamCompute快速构建网站日志实时分析大屏
查看>>