帮忙framebuffer扫盲

这两天看了一些关于Linux下Gui的介绍,但是对Framebuffer有一些疑问,请高人帮忙解答一下:
1.framebuffer在操作系统中处于什么位置呢?驱动和应用中间?和framebuffer一级的还有什么技术?  
  也就是说在开发一个系统的时候除了framebuffer还有什么别的选择?
2.我们在开发一个新系统的时候如果想要用framebuffer的话,是否还需要自己写相关显示芯片基于framebuffer的驱动呢?
  那么如果我的芯片本身支持一些加速的特殊处理,在freambuffer中怎么体现?
3.如何知道显示芯片是否支持framebuffer的操作?选择framebuffer时候需要注意什么?怎样知道自己的系统是否适合使用framebuffer呢?

在这里先谢谢啦 :)
 

更多2分享到:

发表于: 2009-04-22 11:06:08 楼主

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

回复次数:32

CSDN官网

CSDN官网

morris88

morris88

morris88 T7

Blank Blank Blank

帧缓冲设备提供了显卡的抽象描述。他同时代表了显卡上的显存,应用程序通过定义好的接口可以访问显卡,而不需要知道底层的任何操作。该设备使用特殊的设备节点,通常位于/dev目录,如/dev/fb*.

1.用户角度的/dev/fb*
从用户的角度看,帧缓冲设备和其他位于/dev下面的设备类似。他是一个字符设备,通常主设备号是29,次设备号定义帧缓冲的个数。
通常,使用如下方式(前面的数字代码次设备号)

        0 = /dev/fb0    First frame buffer
        1 = /dev/fb1    Second frame buffer
      ...
        31 = /dev/fb31  32nd frame buffer   

考虑到向下兼容,你可以创建符号链接:

      /dev/fb0current -> fb0
     /dev/fb1current -> fb1

and so on...

帧缓冲设备也是一种普通的内存设备,你可以读写其内容。例如,对屏幕抓屏:

  cp /dev/fb0 myfile

你也可以同时有多个显示设备,例如你的主板上出了内置的显卡还有另一独立的显卡。对应的帧缓冲设备(/dev/fb0 and /dev/fb1 etc.)可以独立工作。
应用程序如 X server一般使用/dev/fb0作为默认的显示帧缓冲区。你可以自定把某个设备作为默认的帧缓冲设备,设置$FRAMEBUFFER环境变量即可。在sh/bash:

    export FRAMEBUFFER=/dev/fb1

在csh中:

    setenv FRAMEBUFFER /dev/fb1

设定后,X server将使用第二个帧缓冲区设备。

2.程序员角度看/dev/fb*
正如你所知,一个帧缓冲设备和内存设备类似/dev/mem,并且有许多共性。你可以read,write,seek以及mmap()。不同仅仅是帧缓冲的内存不是所有的内存区,而是显卡专用的那部分内存。
/dev/fb*也允许尽行ioctl操作,通过ioctl可以读取或设定设备参数。颜色映射表也是通过Ioctl设定。查看<linux/fb.h>就知道有多少ioctl应用以及相关数据结构。

这里给出摘要:
  - 你可以获取设备一些不变的信息,如设备名,屏幕的组织(平面,象素,...)对应内存区    的长度和起始地址。
  - 也可以获取能够发生变化的信息,例如位深,颜色格式,时序等。如果你改变这些值,    驱动程序将对值进行优化,以满足设备特性(返回EINVAL,如果你的设定,设备不支持)
  - 你也可以获取或设定部分颜色表。  

所有这些特性让应用程序十分容易的使用设备。X server可以使用/dev/fb*而不需知道硬件的寄存器是如何组织的。 XF68_FBDev是一个用于位映射(单色)X server,唯一要做的就是在应用程序在相应的位置设定是否显示。

在新内核中,帧缓冲设备可以工作于模块中,允许动态加载。这类驱动必须调用register_framebuffer()在系统中注册。使用模块更方便!


详细的介绍参见:
http://www.dzkf.cn/html/qianrushixitong/2007/0429/2025.html

回复于: 2009-04-22 11:10:13#1 得分:20

对我有用[2] 丢个板砖[0] 引用 | 举报 | 管理

hairetz

hairetz

猫已经找不回了 T8

Blank Blank Blank 更多勋章

http://hi.baidu.com/abor/blog/item/8520942b7d5a24f9e6cd40fc.html
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 就像一张画布,使用什么样子的画笔,如何画画,还需要你自己
动手完成。 
 

回复于: 2009-04-22 11:31:27#2 得分:20

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理

zhou_CC

zhou_CC

zhou_CC T1

framebuffer在操作系统中处于什么位置呢?
以及和framebuffer一级的还有什么技术?  
开发一个系统的时候除了framebuffer还有什么别的选择?

回复于: 2009-04-22 13:31:49#3 得分:0

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理

sunwill_chen

sunwill_chen

sunwill_chen T2


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/ .

回复于: 2009-04-22 15:20:41#4 得分:30

对我有用[4] 丢个板砖[0] 引用 | 举报 | 管理

rzsheng

rzsheng

rzsheng T6

一楼,二楼的说得都很好。

framebuffer就相当于一个中间层,对驱动和硬件进行一个封装和管理,便于用户开发图形界面或进行视频输出操作。

自从Linux支持了framebuffer以后,很多GUI开发都是基于framebuffer而进行的

回复于: 2009-04-22 15:29:26#5 得分:2

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理

zhou_CC

zhou_CC

zhou_CC T1

引用 4 楼 sunwill_chen 的回复:
1.framebuffer在操作系统中处于什么位置呢?framebuffer属于驱动层 
驱动和应用中间? 同上 
和framebuffer一级的还有什么技术? 
也就是说在开发一个系统的时候除了framebuffer还有什么别的选择? 
独一无二,其他的选择功能就不完全一样了, 当然看你具体要实现什么, 可能你要实现的那个功能也是用其他方法可以实现的. 

2.我们在开发一个新系统的时候如果想要用framebuffer的话,是否还需要自己写相关显示芯片基于frame…

感谢sunwill_chen 的耐心回答
想再问一下,那framebuffer和Xserver是什么关系呢?
我们现在很多的GUI也有直接建立在Xserver上的。我想问这类的选择都有那些??
回复于: 2009-04-22 15:34:40#6 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

hjx855

hjx855

hjx855 T2

长见识了

回复于: 2009-04-22 15:35:52#7 得分:1

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

disikj

disikj

disikj T2

简单的说就是 你写到fb里面的数据会立刻以像素的方式显示到屏幕上,
你可以把一个位图文件copy到fb里面然后这个图像就会立刻显示到屏幕上。
很多图像库就是基于framebuffer的。
除了framebuffer还有xwindow 也可以做gui。

回复于: 2009-04-22 20:17:49#8 得分:5

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

zhou_CC

zhou_CC

zhou_CC T1

引用 8 楼 disikj 的回复:
简单的说就是 你写到fb里面的数据会立刻以像素的方式显示到屏幕上, 
你可以把一个位图文件copy到fb里面然后这个图像就会立刻显示到屏幕上。 
很多图像库就是基于framebuffer的。 
除了framebuffer还有xwindow 也可以做gui。

你说的这个我明白,但是我想知道在Framebuffer与Xwindows之外
还有什么底层描画库是我们在Linux开发Gui的时候常用的呢?
例如Qt/Embedded他基于的是什么?
回复于: 2009-04-22 20:54:56#9 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

xempo

xempo

xempo T3

设备文件:/dev/fb0 ...

回复于: 2009-04-22 20:58:36#10 得分:1

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

sunwill_chen

sunwill_chen

sunwill_chen T2

引用 6 楼 zhou_CC 的回复:
引用 4 楼 sunwill_chen 的回复:

想再问一下,那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
回复于: 2009-04-23 09:21:28#11 得分:10

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

zhou_CC

zhou_CC

zhou_CC T1

说白了Framebuffer是在内核中,而Xwindows只不过是一个用户进程而已。
我们的Gui如果想高效和移植性好那就直接和Framebuffer打交道就可以啦。
要是想简单点那就在XWindows上搭建自己的Gui。
但是Xwindows也封装了外设的处理,如鼠标和键盘等。
那我要是想在Framebuffer上搭建自己的Gui的话,那么是不是事件相关的事情就要自己处理了??
Framebuffer有这方面的封装么?

顺便再问一下,在看Framebuffer的时候都说他是基于控制台驱动程序,不太明白是什么意思?
能说明一控制台驱动程序是什么呢?谢啦 :)

回复于: 2009-04-23 10:09:20#12 得分:0

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理

bxhzct

bxhzct

bxhzct T2

这个问题个很好,终于学习了。/dev/fb* 的字符节点的含义,谢谢

回复于: 2009-04-23 11:27:53#13 得分:1

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

cfy84

cfy84

cfy84 T2

framebuffer是一块显示内存,相当于存放着一桢视频数据当然是I桢。硬件会将这块内存中的数据以事先设定好的格式以及一定的刷新速率来进行显示。格式中规定了一个像素所占的字节,是否有透明等。所有的图形库都是在framebuffer之上的,将数据写入framebuffer让硬件显示出来。

回复于: 2009-04-23 11:37:05#14 得分:4

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理

sunwill_chen

sunwill_chen

sunwill_chen T2

引用 12 楼 zhou_CC 的回复:
那我要是想在Framebuffer上搭建自己的Gui的话,那么是不是事件相关的事情就要自己处理了?? 
Framebuffer有这方面的封装么? 

顺便再问一下,在看Framebuffer的时候都说他是基于控制台驱动程序,不太明白是什么意思? 
能说明一控制台驱动程序是什么呢?

framebuffer驱动有提供很多硬件接口, 比如DirectFB, QT等都是基于这些硬件接口来工作的.
应该说控制台程序是基于framebuffer的, 
控制台驱动程序指的应该就是framebuffer驱动吧.
回复于: 2009-04-23 11:41:09#15 得分:5

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

once_and_again

once_and_again

once_and_again T6

引用 5 楼 rzsheng 的回复:
一楼,二楼的说得都很好。

framebuffer就相当于一个中间层,对驱动和硬件进行一个封装和管理,便于用户开发图形界面或进行视频输出操作。

自从Linux支持了framebuffer以后,很多GUI开发都是基于framebuffer而进行的
长见识了.
回复于: 2009-04-23 17:43:05#16 得分:1

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

xiaoguo1416

xiaoguo1416

xiaoguo1416 T1

非常感谢楼主的介绍

回复于: 2010-01-07 14:31:18#17 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

imafool

imafool

imafool T1

很多人看明白了,而我却看得糊涂,寒……

回复于: 2010-07-05 10:51:19#18 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

jay8830095

jay8830095

changing_better T2

看回复

回复于: 2011-05-24 11:13:10#20 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

zengyi820306

zengyi820306

zengyi820306 T1

哪位高人,能讲讲 framebuffer 与qt的关联么,原理流程以及具体怎么调用的,好像qt里的最后一个调用就是ioctrl函数,但是这怎么就跟内核的framebuffer 关联起来了??

回复于: 2011-11-08 23:10:48#21 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

eliry

eliry

eliry T1

不懂,求解!

回复于: 2011-12-22 15:48:14#22 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

cxxy328

cxxy328

cxxy328 T1

关于framebuffer的问题,求解
我的dev下只有fb
cat /dev/fb没有那个设备
用命令sudo modprobe -l | grep vesafb
sudo modprobe -l | grep vga16fb
知道我的是vga16fb
执行命令sudo modprobe -q vga16fb可以生成fb0
cat /dev/fb0没有任何数据啊
还有启动项中加不加参数也没影响
我4了vga=0x318,vga=0x37b
我的屏幕分辨率是1280X720,32bits

回复于: 2011-12-28 15:43:27#23 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

cxxy328

cxxy328

cxxy328 T1

关于framebuffer的问题,求解
我的dev下只有fb
cat /dev/fb没有那个设备
用命令sudo modprobe -l | grep vesafb
sudo modprobe -l | grep vga16fb
知道我的是vga16fb
执行命令sudo modprobe -q vga16fb可以生成fb0
cat /dev/fb0没有任何数据啊
还有启动项中加不加参数也没影响
我4了vga=0x318,vga=0x37b
我的屏幕分辨率是1280X720,32bits

回复于: 2011-12-28 15:44:45#24 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

liuchao35758600

liuchao35758600

灼眼的超哥 T1

引用 21 楼 zengyi820306 的回复:
哪位高人,能讲讲 framebuffer 与qt的关联么,原理流程以及具体怎么调用的,好像qt里的最后一个调用就是ioctrl函数,但是这怎么就跟内核的framebuffer 关联起来了??

qt绘制的图形需要写入framebuffer才能显示在屏幕上,否则,qt生成的图形只是在内存中,而不能显示到屏幕。
回复于: 2012-01-05 15:13:05#25 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

luke1989

luke1989

luke1989 T1

来学期啊

回复于: 2012-01-08 21:44:04#26 得分:0

对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理

chengliangqq

chengliangqq

chengliangqq T1

向各位高手学习了!

回复于: 2012-07-09 11:02:43#28 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

lvtingting2007

lvtingting2007

lvtingting2007 T1

好帖,谢谢

回复于: 2012-07-19 20:49:10#29 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

lovehuan54

lovehuan54

kevin-Liu T1

从上到下看了一遍,但可能是我愚钝,还是不太明白。对于framebuffer有了一个大概的认识,但对于如何使用framebuffer还是不太清楚。还有就是现在跟framebuffer相似的还有哪些技术。

回复于: 2012-07-23 10:33:07#30 得分:0

对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理

tiandaozhang

tiandaozhang

天道张 T1

学习了,好帖!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值