Chinaunix首页 | 论坛 | 博客
  • 博客访问: 970878
  • 博文数量: 120
  • 博客积分: 6454
  • 博客等级: 准将
  • 技术积分: 1739
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-28 17:45
文章分类

全部博文(120)

文章存档

2014年(1)

2013年(1)

2012年(11)

2011年(16)

2010年(6)

2009年(11)

2008年(30)

2007年(44)

分类: LINUX

2009-03-05 16:41:41

    FrameBuffer 是出现在内核当中的一种驱动程序(Procedures)(Procedures)接口。这种接口将显示设备抽像为帧缓冲区。用户可以将他看成是显示计算机内存的一个映像,将其映射到进程地址空间之后,就可以直接或者间接进行读写操作,而不能是写操作可以马上反应在屏幕上。
    该驱动程序(Procedures)(Procedures)的设备文件一般是 /dev/fb0,/dev/fb1 等等。譬如,假设现在的显示模式是 1024x768-8 位色,则可以通过如下的系统命令清空屏幕: 

$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768


    在应用程序(Procedures)(Procedures)中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,譬如下面的程序(Procedures)就打开 /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 设备,还可以获得当前内核所支持的加速显示卡的类型(通过固定信息得到),这种类型通常是和特定显示芯片相关的。譬如目前最新的内核中,就包含有对 SIII。Matrox,nVidia,3Dfx 等等流行显示芯片的加速支持。在获得了加速芯片类型之后,应用程序(Procedures)就可以将 PCI 设备的计算机内存I/O(memio)映射到进程的地址空间。这些 memio 一般是用来控制显示卡的寄存器,通过对这些寄存器的操作,应用程序(Procedures)(Procedures)就可以控制特定显卡的加速功能。 PCI 设备可以将自己的控制寄存器映射到物理计算机内存空间,而不能是后,对这些控制寄存器的访问,给变成了对物理计算机内存的访问。所以我们可以得出结论,这些寄存器又被称为“memio”。一旦被映射到物理计算机内存,Linux 的普通进程就可以通过 mmap 将这些计算机内存 I/O 映射到进程地址空间,这样就可以直接或者间接访问这些寄存器了。 当然,因为不相同的显示芯片具有不相同的加速能力,对memio 的使用和定义也各自不同,这时,就需要针对加速芯片的不同类型来编写实现不相同的加速功能。譬如大多数芯片都提供了对矩形填充的硬件加速支持,但不相同的芯片实现方式不同,这时,就需要针对不相同的芯片类型编写不相同的用来完成填充矩形的函数。 说到这里,读者可能已经意识到 FrameBuffer 只是一个提供显示计算机内存和显示芯片寄存器从物理计算机内存映射到进程地址空间中的设备。所以,对于应用程序(Procedures)而不能是言,如果希望在 FrameBuffer 之上进行图形编程,还需要完成其他许多工作。

    举个例子来讲,FrameBuffer 就像一张画布,使用什么样子的画笔,如何画画,还需要您自己动手完成。

阅读(1487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~