linux图形界面基本知识

linux图形界面基本知识
发信站: 饮水思源 (2007年10月10日21:02:03 星期三), 站内信件
作者:GuCuiwen email:win2linux@163.com
原来的标题叫“linux图形界面编程基本知识”,被我们老大改了.

    很多LINUX初学者分不清楚linux和X之间,X和Xfree86之间,X和KDE,GNOME等之间是什
么关系.常常混淆概念,我想以比较易于理解的方式说明一下X,X11,XFREE,WM,KDE,GNOME
等之间的关系.由于本人水平有限可能存在错误,请高手指正.

一,linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程序实现的.

图形界面并不是linux的一部分,linux只是一个基于命令行的操作系统,linux和Xfree的
关系就相当于当年的DOS和 WINDOWS3.0一样,windows3.0不是独立的操作系统,它只是DOS
的扩充,是DOS下的应用程序级别的系统,不是独立的操作系统,同样 XFree只是linux下的
一个应用程序而已.不是系统的一部分,但是X的存在可以方便用户使用电脑.WINDOWS95及
以后的版本就不一样了,他们的图形界面是操作系统的一部分,图形界面在系统内核中就
实现了,没有了图形界面windows就不成为windows了,但linux却不一样,没有图形界面lin
ux还是linux,很多装linux的WEB服务器就根本不装X服务器.这也WINDOWS和linux的重要
区别之一.

二.X是协议,不是具体的某个软件:

X 是协议,就像HTTP协议,IP协议一样.这个概念很多初学者甚至学习LINUX有一定时间的
人都混淆,一个基于X的应用程序需要运行并显示内容时他就联接到X服务器,开始用X协议
和服务器交谈.比如一个X应用程序要在屏幕上输出一个圆那么他就用X协议对X服务器说:
喂!我需要在屏幕上画一个圆.X应用程序只负责告诉X服务器在屏幕的什么地方用什么颜
色画一个多大的圆,而具体的"画"的动作,比如这个圆如何生成,用什么显卡的驱动程序去
指挥显卡完成等等工作是由X服务器来完成的.X服务器还负责捕捉键盘和鼠标的动作,假
设X服务器捕捉到鼠标的左键被按下了,他就告诉X应用程序:亲爱的应用程序先生,我发现
鼠标被按下了,您有什么指示吗?如果X应用程序被设计成当按下鼠标左健后再在屏幕上画
一个正方形的话,X应用程序就对X服务器说:请再画一个正方形,当然他会告诉服务器在什
么地方用什么颜色画多大的正方形,但不关心具体怎么画--那是服务器的事情.

那么协议是需要具体的软件来实现的,这就是下面我要讲的:

三,X和XFree86的关系.

有了协议就需要具体的软件来实现这个协议.就好比我们有了交通法规就需要交警去根据
法规维护交通秩序一样.Xfree86就是这样一个去根据法规实现协议的 "交警".他按照X协
议的规定来完成X应用程序提交的在屏幕上显示的任务.当然不仅仅是某个特定的交警才
可以去维护和实现这个法规,比如还可以由交通协管员来实现交通法规,必要的时候警察
也可以介入,当然前提是他们都要懂得交通法规,也就是要懂得协议.所以实现X协议的软
件也并不只有 XFree86,XFree86只是实现X协议的一个免费X服务器软件.商业上常用MOTI
F,现在还有XORG,还有很多很小的由爱好者写的小的X服务器软件.甚至可以在WINDOWS上
有X服务器运行,这样你可以在linux系统上运行一个X应用程序然后在另一台windows系统
上显示.多么神奇. 你可以用google找到这样的X服务器软件.只不过在LINUX上最常用的
是XFree86.(现在的linux发行版都用Xorg了)顺便说一句,苹果电脑的图形界面用的也是X
协议,而且被认为是做的最好的X协议图形界面,并且他对X协议的实施是做在系统内核里
的,所以性能明显好很多,这就是为什么很多大型三维图形设计软件都是在苹果平台上的
原因.

为了便于理解拿HTTP协议来比较:


协议是HTTP (hyper text transmission protocol)
实现这个协议的常用服务器有:apache IIS 等
请求这些服务器传输文件的客户有:IE ,MOZILLA ,NETSCAPE等.

协议是X

实现这个协议的常用服务器有Xfree86 ,Xorg ,Xnest等

请求这些服务器来完成显示任务的客户:所有的X应用程序.

只不过HTTP协议的服务器和客户端通常都在两台不同的电脑(服务器和客户机)之间来实
现,所以一般人对这个比较容易理解.而X协议的服务器和客户端程序通常在同一台电脑上
,因此很多用户都感到对此很难理解.既然是协议,那么肯定和平台无关的,因此可以让X应
用程序显示在任何装有X服务器的远程计算机上.甚至显示在装有Xnest服务器的windows
系统上.只不过在大多数情况下,X应用程序都用本机的X服务器,然后X服务器将显示结果
输出到本机的显示器.这也是很多人不理解X是一种协议的原因.

四,X和X11R6又是什么关系?

不知道初学者有没有注意到/usr/X11R6这个目录,这是XFree的默认安装目录
X11R6 实际上是 X Protocol version 11 Release 6
(X协议第11版第六次发行)的意思,就是说目前用的X协议是第11版的,然后经过了6次小的
修正.不同版本的X协议是不能通信的.就象我们现在IPV4和IPV6不能通信一样,不过不用
担心,现在的X服务器软件和X应用程序都遵循X11R6.

另外XFree86 3.3.6 XFree86 4.3.6 等这些版本是实现X协议的软件XFree86的版本号.这
是初学者经常高混淆的概念.

协议版本和实现协议的软件的版本--这两个概念的区别你分清楚了吗?

五,X服务器和WM(window manager 窗口管理器)之间是什么关系.

平时大家起动图形界面是怎么启动的呢?
如果你是一开己就进入图形界面那就太遗憾了.应为你错过了了解X服务器起动过程的好
时机.不过没关系.你打开一个XTERM输入:

init 3

就可以安全的回到字符界面.

好了,等做完以下实验你就完全明白X和WM(window manager 窗口管理器)之间是什么关系
了.

先输入以下命令:
#startx

起动图形界面,你看到的是一个和平时使用一样的完整的图形界面操作环境.
你可以最大化,最小化,移动,关闭窗口等.

按ctrl+alt+backspace反回字符界面.

输入:
#xinit

再次启动图形界面,你看到了什么,你看到一个XTERM.而且不能移动.但是你可以在这个XT
ERM中输入命令打开X应用程序,如果我输入:
#mozilla
打开浏览器,你看到的浏览器和平时有什么不同吗?他在屏幕中间,不能移动,不能最小化,
不能最大化,没有边框.

为什么同样一个X应用程序会有这样的不同呢?因为我们用startx起动图形界面的时候同
时也启动了一个WM(即窗口管理器),如果你用KDE就起动了KDE,如果你用GNOME就起动了GN
OME.但是你用xinit起动图形界面的时候却没有起动WM.

现在你明白窗口管理器的作用了吗?他的作用就是最大化,最小化,移动,关闭窗口等.而这
些不是X服务器来负责完成的.

如果你用xinit起动图形界面并在xterm中输入twm,看看会有什么?
xterm被加上了一个边框,你可以通过这个边框移动,最大化,最小化这个xterm,twm就是XF
ree86中自带的窗口管理器,是一个比较简陋的最简单的窗口管理器,但是他具有窗口管理
器的全部特征.

如果你不输入twm而输入gnome-session就可以起动GNOME
或者输入startkde起动KDE.

通过以上的实验你就可以清楚的明白他们之间的关系.

六,关于KDE和GNOME

KDE 和GNOME是LINUX里最常用的图形界面操作环境,他们不仅仅是一个窗口管理器那么简
单, KDE是K Desktop Environment 的缩写.他不仅是一个窗口管理器,还有很多配套的应
用软件和方便使用的桌面环境,比如任务栏,开始菜单,桌面图标等等.

GNOME是GNU Network Object Model Environment 的缩写.和KDE一样,也是一个功能强大
的综合环境.

另外在其它UNIX系统中,常常使用CDE作为这样一个环境.

其它的小型窗口管理器有:
window maker,after step,blackbox,fvwm,fvwm2,等等都是常用的优秀窗口管理器.REDH
AT9中有 window maker 但是默认不安装,大家可以装来试试.只要xinit再wmaker&就可以
用windowmaker了.

七,linux图形界面层次关系总结

linux本身-->X服务器<-[通过X协议交谈]->窗口管理器(综合桌面环境)-->X应用程序.

   Xfree86服务器的实现包括两个部分,一部分是和显卡直接打交道的低层,一部分是和X
应用程序打交道的上层.上层负责接收应用程序的请求和鼠标键盘的动作.而和显卡直接
打交道的底层负责指挥显卡生成图形,其实就是显卡驱动.上层接收到应用程序的请求后,
将请求内容做适当处理,然后交给显卡驱动来指挥显卡完成画图的动作.另外,上层的捕捉
键盘和鼠标动作的部分会向应用程序提供鼠标和键盘的状态信息,应用程序接收到这些信
息后决定是否再有相应的动作.

平时说的VESA,VGA ,fbdev等其实就是针对不同模式显卡的驱动程序.
VESA(Video Electronics Standards Association)
VGA (Video Graphics Array)
fbdev (FrameBuffer Device)

都是不同的显卡标准,不过这些标准都已经很老了.现在的显卡都兼容这几种模式.

framebuffer模式的显卡本身不具有任何运算数据的能力,他好比是一个暂时存放水的水
池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理.
在这中情况下,所有显示任务都有CPU完成,CPU负担很重.
从frambuffer这个名字我们就能猜测到他的功能了(数据侦缓冲).

在linux内核中有有framebuffer机制,摹仿framebuffer显卡的这种功能.他的好处是把显
卡的硬件结构抽象掉,把所有的显卡都当做一个"水池"来用.应用程序也可以直接读取这
个水池的内容.framebuffer的设备名是 /dev/fb
可以用命令:
#dd if=/dev/zero of=/dev/fb
清空屏幕.如果你的X用的是framebuffer的驱动,屏幕将全变黑.通过移动鼠标,切换窗口
等动作可以让原先的内容重新显示.

如果你不用framebuffer驱动,可以在字符模式下做这个试验.屏幕将全部被清空.
以下的命令:
#dd if=/dev/fb of=fbfile
可以将fb中的内容保存下来,以后可以重新写回屏幕:
#dd if=fbfile of=/dev/fb

作用类似于屏幕截图,但是截下的图不能用普通图片浏览器看.

现在知道linux中framebuffer设备的神奇了吧.
linux字符界面在高分辨率下,启动时会有一个小企鹅logo,这个logo就是用framebuffer
功能写上屏幕的.

VESA和VGA比FB要好很多,但是他的显示能力也很有限.CPU仍旧要处理大部分的显示任务.

现在的显卡就不一样了,CPU几乎不参数显示任务,而专注于运算工作.我们平时在linux下
装显卡驱动,其实就是替换掉XFree86中底层的那一部分. 使他有更强的显示能力.比如你
的显卡是nvidia的,XFree默认的驱动是"nv",他是一个nvidia显卡的通用驱动,但是他不
能发挥 nvidia显卡的性能.这个"nv"驱动模块可以在:

/usr/X11R6/lib/modules/drivers

目录下找到,文件名是:nv_drv.o

这个目录下还有很多显卡驱动模块.
apm_drv.o dummy_drv.o nsc_drv.o sis_drv.o
ark_drv.o fbdev_drv.o nv_drv.o tdfx_drv.o
ati_drv.o glint_drv.o r128_drv.o tga_drv.o
atimisc_drv.o i128_drv.o radeon_drv.o trident_drv.o
chips_drv.o i740_drv.o rendition_drv.o tseng_drv.o
cirrus_alpine.o i810_drv.o s3_drv.o vesa_drv.o
cirrus_drv.o linux s3virge_drv.o vga_drv.o
cirrus_laguna.o mga_drv.o savage_drv.o
cyrix_drv.o neomagic_drv.o siliconmotion_drv.o

fbdev vga evsa 等都在其中.

只要在XF86Conf文件中的Section module段中指定了什么驱动,X就用哪个驱动.
代码:

Section "Module"
       Load  "dbe"
       Load  "extmod"
       Load  "fbdevhw" #这里用的是fbdev
       Load  "glx"
       Load  "record"
       Load  "freetype"
       Load  "type1"
       Load  "dri"
EndSection

这是XFree86 4.0以上版本的方法.即X主程序和驱动模块是分开的.

主程序是/usr/X11R6/bin/XFree86 (即上层部分)
然后主程序启动的时候根据配置文件决定用哪一个驱动.

但是,在XFree86以前的版本(3.3.6)中, X主程序和驱动模块是合在一起的,因此,以前的X
free86 3.3.6 有很多针对不同显卡的版本.

另外其他的X服务器如KDrive 也是驱动也主程序整合的,因此同样是KDrive X服务器会有
VESA ,SVGA ,和 fbdev的版本之分.因为这些都是轻量级的X服务器,为了简化结构他做
成这样.

Xfree86 4 做成驱动和主程序分离的好处是用户可以自己添加升级驱动.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图形系统开发基础,我是转帖的,感觉不错,属于入门级别。 1:搭建Linux下的图形系统开发环境 图形输出在嵌入式开发中,多数是向FrameBuffer中写数据,然后会显示在LCD中,在Linux下做图形开发的时候,需要模拟各种环境,比如16位色的环境,32位色的环境等,这个时候需要在Linux中做一个配置的修改: [Copy to clipboard] [ - ]CODE: [root@localhost root]# vi /boot/grub/grub.conf 上面这条命令是用来编辑grub引导配置文件。该配置文件原来的内容为: [Copy to clipboard] [ - ]CODE: # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz title Red Hat Linux (2.6.26) root (hd0,0) kernel /vmlinuz-2.6.26 initrd /initrd-2.6.26.img 将其修改为: [Copy to clipboard] [ - ]CODE: # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/sda2 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz title Red Hat Linux (2.6.26) root (hd0,0) kernel /vmlinuz-2.6.26 vga=0x314 initrd /initrd-2.6.26.img 其实仅仅是在kernel /vmlinuz-2.6.26这一行末尾处加了一个vga=0x314,将Framebuffer设置为800x600x16的显示模式,其中800x600是屏幕分辨率,16表示显示的是16bit的彩色。下面详细的说一下关于vesa vga参数的含义: [Copy to clipboard] [ - ]CODE: 4bit 8bit 15bit 16bit 24bit 32bit 640x400 x 0x300 x x x x 640x480 x 0x301 0x310 0x311 0x312 x 800x600 0x302 0x303 0x313 0x314 0x315 x 1024x768 x 0x305 0x316 0x317 0x318 x 1280x1024 x 0x307 0x319 0x31A 0x31B x 1600x1200 x 0x31C 0x31D 0x31E 0x31F x 而在现在的开发环境中,和嵌入式平台中,用16bit的颜色的还是主流,所以,主要介绍一下16bit的颜色的类型,而颜色是由RGB组成: 常见16位颜色的类型分为: (1)565:依次排列为Red,Green,Blue,二进制表示为: [Copy to clipboard] [ - ]CODE: Red Green Blue RRRRR GGGGGG BBBBB (2)1555:依次排列为Alpha,Red,Green,Blue [Copy to clipboard] [ - ]CODE: Alpha Red Green Blue A RRRRR GGGGG BBBBB 565排列的颜色: 0xFFFF的颜色是白色,在RGB565中排列形式为: [Copy to clipboard] [ - ]CODE: R G B 11111 111111 111111 0xF800的颜色是红色,在RGB565中排列的形式为: [Copy to clipboard] [ - ]CODE: R G B 11111 000000 000000 0X7e0的颜色是绿色,在RGB565中排列的形式为: [Copy to clipboard] [ - ]CODE: R G B 00000 111111 000000 假设Alpha值为1的1555排列的颜色: 0XFC00的颜色是红色,在ARGB1555中排列形式为: [Copy to clipboard] [ - ]CODE: A R G B 1 11111 00000 00000 0X83E0的颜色是绿色,在ARGB1555中排列形式为: [Copy to clipboard] [ - ]CODE: A R G B 1 00000 11111 00000 其他颜色就不在这里一一赘述,需要在实践中慢慢累积与总结。 RGB简介 前面介绍了做了很多表来体现的就是RGB颜色排列形式,那么什么是RGB呢? 概述   RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。   RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。例如:纯红色R值为255,G值为0,B值为0;灰色的R、G、B三个值相等(除了0和255);白色的R、G、B都为255;黑色的R、G、B都为0。RGB图像只使用三种颜色,就可以使它们按照不同的比例混合,在屏幕上重现16777216种颜色。   在 RGB 模式下,每种 RGB 成分都可使用从 0(黑色)到 255(白色)的值。 例如,亮红色使用 R 值 246、G 值 20 和 B 值 50。 当所有三种成分值相等时,产生灰色阴影。 当所有成分的值均为 255 时,结果是纯白色;当该值为 0 时,结果是纯黑色。    应用   目前的显示器大都是采用了RGB颜色标准,在显示器上,是通过电子枪打在屏幕的红、绿、蓝三色发光极上来产生色彩的,目前的电脑一般都能显示32位颜色,约有一百万种以上的颜色。   原理   RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和(两盏灯的亮度嘛!),越混合亮度越高,即加法混合。   有色光可被无色光冲淡并变亮。如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。知道它的混合原理后,在软件中设定颜色就容易理解了。    红、绿、蓝三盏灯的叠加情况,中心三色最亮的叠加区为白色,加法混合的特点:越叠加越明亮。   红、绿、蓝三个颜色通道每种色各分为255阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色数值相同时为无色彩的灰度色,而三色都为255时为最亮的白色,都为0时为黑色。  RGB 颜色称为加成色,因为您通过将 R、G 和 B 添加在一起(即所有光线反射回眼睛)可产生白色。 加成色用于照明光、电视和计算机显示器。 例如,显示器通过红色、绿色和蓝色荧光粉发射光线产生颜色。绝大多数可视光谱都可表示为红、绿、蓝 (RGB) 三色光在不同比例和强度上的混合。 这些颜色若发生重叠,则产生青、洋红和黄。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值