|
|
第 1 帖 | |
|
|
标题: 对FrameBuffer的一夜hack。。。 大家都知道Unix/Linux系统是由命令驱动的。那么最基本的系统是命令行的(就是想DOS一样的界面)。X-Window-System是Unix/Linux上的图形系统,它是通过X-Server来控制硬件的。但有一些Linux的发行版在引导的时候就会在屏幕上出现图形,这时的图形是不可能由X来完成的,那是什么机制呢?答案是FrameBuffer。
FrameBuffer不是一个图形系统,更不是窗口系统。它比X要低级,简单来说FrameBuffer就是一种机制的实现。这种机制是把屏幕上的每个点映射成一段线性内存空间,程序可以简单的改变这段内存的值来改变屏幕上某一点的颜色。X的高度可移植性就是来自于这种机制,不管是在那种图形环境下,只要有这种机制的实现就可以运行X。所以在几乎所有的平台上都有相应的X版本的移植。 好了,闲话少说,下面我们来看看可以利用FrameBuffer来干点什么。首先看看你是否有了相应的驱动:找一下在/dev/下是否有fb*这个设备文件,这是个字符类的特殊文件。 代码:
有了这个我们可以play with FrameBuffer了。(一下的操作不一定要在X下,可以在启动了FrameBuffer的虚拟控制台下) 代码:
代码:
代码:
通过以上的操作,我想你也猜到了。文件/dev/fb0就是控制屏幕上的每一点的颜色的文件。我们可以写程序来改变这个文件的内容,就可以方便的在屏幕上画图了:-) 我下面就来写一个小程序,探测一下屏幕的属性。 代码:
在fb_fix_screeninfo中有 __u32 smem_len 是这个/dev/fb0的大小,也就是内存大小。 __u32 line_length 是屏幕上一行的点在内存中占有的空间,不是一行上的点数。 在fb_var_screeninfo 中有 __u32 xres ,__u32 yres 是x和y方向的分辨率,就是两个方向上的点数。 __u32 bits_per_pixel 是每一点占有的内存空间。 把上面的程序编译以后运行,在我的机器上的结果如下: 代码:
好了,现在你应该对FrameBuffer有一个大概的了解了吧。那么接下来你一定会想在屏幕上画一些东西,让我们先从画一个点开始吧。先说说我的想法:在类Unix系统中,一切东西都是文件。我们对屏幕的读写就可以转换成对/dev/fb0的读写。那么就把/dev/fb0用open打开,再用lseek定位要读写的位置,最后调用read或者write来操作。通过这么一大段的操作我们才完成了对一个点的读或者写。这种方法开销太大了。还有一种方法,我们把/dev/fb0映射到程序进程的内存空间中来,然后得到一个指向这段存储空间的指针,这样就可以方便的读写了。但是我们要知道能映射多少和该映射多少,这能很方便的从上面一个程序得出的参数来决定。 下面是程序代码: 代码:
这些就是我对FrameBuffer的初步研究,匆忙之间写些东西不成文章,以后要写些更高级一点的函数的实现。
__________________
在未上大学时,我一直以为自己是个天才。 正在上大学时,我以为自己将是个天才。 读完大学后,我才发现自己是并且从来就是一个彻头彻尾的傻瓜, 自大。。。浮躁。。。终究一无是处。 此帖于 06-09-09 01:06 被 wsw 编辑. |
|
|
|
|
|
|
|
第 2 帖 | |
|
|
好东西。感到好熟悉,十几年前在DOS下写图形界面的程序就是读写0xa000那段内存,输出汉字也没问题。原来linux也能这样用。有时间琢磨琢磨。
|
|
|
|
|
|
|
|
第 3 帖 | |
|
|
好贴。支持你的努力
|
|
|
|
|
|
|
|
第 4 帖 | |
|
|
好文章,让我了解了fb是怎么工作的。
|
|
|
|
|
|
|
|
第 5 帖 | |
|
|
Gtk Qt 是不是通过操作 fb 来画图的呢?
这样画的图在鼠标移过时,图就会被更新,那更新出来的图,是存在那里的呢? fb 里存放的数据是否存有正在看的电影的显示呢?
__________________
my new pc: Intel Duo 1.86GHz/ 2G Mem/ GIGABYTE 965P-S3/ 250G hardware/ 艾尔莎 影雷者 7600/ DVD write rom/ netcard Marvell 88E8056/ 联志机箱/ http://gimpstore.cn/ 追求一种自由,共享,与技术的极限和快乐的生活! gimp 教程 http://www.linux-wiki.cn/work/gimp/ |
|
|
|
|
|
|
|
第 6 帖 | |
|
|
强人+强贴..........
__________________
笔记本 Debian linux 3.1 英文界面 Windows XP Pro English Edition IBM T23 PIII1.2G 512M 80Gb 台式机 Fedora Core 6 英文界面 Windows Server 2003 Standard Dell GX620 P IV 3.0G 512M 80Gb SATA 服务器 Fedora 8 英文界面 Windows XP En Oem Dell GX270 P IV 2.8G 512M 80Gb SATA |
|
|
|
|
|
|
|
第 7 帖 | |
|
|
framebuffer 要比X-window-system低级。而GTK和QT是建立在Xlib上的,至于如何来实现鼠标那应该是X-server的事情了,在安装X-window-system(debian)时会让你选择要不要内核的framebuffer支持,理论上选和不选都可以。如果不选,X会用它自带的驱动来实现对线性内存空间的读写改变屏幕显示。
这只是一个机制,实现不一定非要framebuffer不可。但在Linux(kernel>2.2)上用framebuffer来实现X总是可以的。 |
|
|
|
|
|
|
|
第 8 帖 | |
|
|
嘿嘿,又长见识了,望楼主多分享经验及心得,值得加精鼓励
![]()
__________________
nO ^^4+73R wH1<h d!5+R0z j00 42E U$1N9 7r% LpHZ 4+ l3457 oN(& |
|
|
|
|
|
|
|
第 9 帖 | |
|
|
希望多看到这种文章
__________________
Athlon 2000+ / sata 80G / Abit Kv7 /nv Fx5200U Debian GNOME / FreeBSD KDE 做一件令自己感动是事情…… |
|
|
|
|
|
|
|
第 10 帖 | |
|
|
有个叫 direct frame buffer 的项目,做的类似于楼主所说的事情:
http://www.directfb.org/
__________________
by 断了的猫 (arch linux) blog: http://rushrush.cublog.cn 新浪微博: http://t.sina.com.cn/mao8421 |
|
|
|
|
|
|
|
第 11 帖 | |
|
|
谢谢楼主分享,回去好好研究一下
__________________
Debian Testing Dell D630 2G RAM Nvidia Quadro NVS 135m display card |
|
|
|
|
|
|
|
第 12 帖 | |
|
|
qt的嵌入式版qte使用的是framebuffer
|
|
|
|
|
|
|
|
第 13 帖 | |
|
|
不错不错,才开始学
|
|
|
|
|
|
|
|
第 14 帖 | |
|
|
后面的分析写的很好,简单易懂,学习了,谢谢楼主
|
|
|
|
|
|
|
|
第 15 帖 | |
|
|
好喜欢!!!
__________________
Sometimes I wish I could save you and there're so many things that I want you to know。 |
|
|
|
|
|