Linux的XServer
linux本⾝没有图形界⾯,linux现在的图形界⾯的实现只是linux下的应⽤程序实现的:
图形界⾯并不是linux的⼀部分,linux只是⼀个基于命令⾏的操作系统,linux和Xfree的关系就相当于当年的DOS和WINDOWS 3.0 ⼀样,
windows 3.0不是独⽴的操作系统,它只是DOS的扩充,是DOS下的应⽤程序级别的系统,不是独⽴的操作系统,同样XFree只是 linux下的⼀个应⽤程序⽽已。
不是系统的⼀部分,但是X的存在可以⽅便⽤户使⽤电脑。WINDOWS 95及以后的版本就不⼀样了,他们的图形界⾯是操作系统的⼀部分,
图形界⾯在系统内核中就实现了,没有了图形界⾯windows就不成为windows 了,但linux却不⼀样,没有图形界⾯linux还是linux,
很多装linux的WEB服务器就根本不装X服务器。这也WINDOWS和linux 的重要区别之⼀。
X是协议,不是具体的某个软件:
  X是协议,就像HTTP协议,IP协议⼀样。这个概念很多初学者甚⾄学习 LINUX有⼀定时间的⼈都混淆,⼀个基于X的应⽤程序需要运⾏并显⽰内容时他就联接到X服务器,
开始⽤X协议和服务器交谈。⽐如⼀个X应⽤程序要在屏幕上输出⼀个圆,X应⽤程序只负责告诉X服务器在屏幕的什么地⽅⽤什么颜⾊画⼀个多⼤的圆,⽽具体的"画"的动作,
⽐如这个圆如何⽣成,⽤什么显卡的驱动程序去指挥显卡完成等等⼯作是由X服务器来完成的。X服务器还负责捕捉键盘和⿏标的动作,假设X服务器捕捉到⿏标的左键被按下了,
他就告诉X应⽤程序:亲爱的应⽤程序先⽣,我发现⿏标被按下了,您有什么指⽰吗?协议是需要具体的软件来实现的,这就是下⾯我要讲的:
如何判断linux是否安装了x-server
rpm -q X-server 查询是否安装
yum list installed 查询已经安装的软件包
linux图形界⾯⼜称x系统,其主要包含如下⼏个部分:
a)xserver
b)显⽰管理器(Display Manager) 例如(gdm kdm xdm等)
c)窗⼝管理器(Window Manager) 例如(metacity ,fluxbox等)
d)DM 和 WM之上的⼀些图形应⽤程序
在使⽤中⼀般都是b,c,d三者集合起来构成⼀个完整的集成⼯作环境,例如KDE ,GNOME等,这就是我们平时所说的⼴义上的xclient
a)xserver 主要提供基本的显⽰接⼝共xclient使⽤,并将⽤户的操作等也反映给xclient,是xclient与硬件的⼀个中间层。xserver相关的两个主要部分是
(1) f
Files:          X系统使⽤的字体存放⽬录(字体的具体使⽤由FontConfig⼯具主持)
InputDevice:    输⼊设备,如键盘⿏标的信息
tablet monitor驱动程序
Monitor:        显⽰器的设置,如分辨率,刷新率等
Device:        显⽰卡信息
Screen:        由Monitor和Device组装成⼀个Screen,表⽰由它们向这个Screen提供输出能⼒
ServerLayout:  将⼀个Screen和InputDevice组装成⼀个ServerLayout,在具有多个显⽰设备的系统中,可能有多个Screen和多个ServerLayout,⽤以实现不同的硬件搭配。
在最近的xorg版本中,X Server已经开始⾃动侦测硬件,现在的f已经都成了默认名称。具体细节还待查,但基本原理还是不变的。
(2) X session(X会话)
X session是指X server启动后直到X server关闭之间的这段时间。这期间⼀切跟X相关的动作都属于X session的内容。管理X session的程序称为Display Manager,常听说的gdm或kdm就是gnome/kde所分别对应的Display Manager。
开启⼀个X session,也就是开始了图形界⾯的使⽤。在开启的过程中,Display Manager会对⽤户进⾏认证(也就是⽤户名密码的输⼊),运⾏事先设置好的程序(⽐如scim输⼊法就是这个时候启动的)等等。
这个开启过程要执⾏的⼀系列操作都可以在/etc/X11/Xsession以及/etc/X11/Xsession.d/⽬录下看到,其他还有⼀些配置⽂件如Xsession.options, Xresource等,都是执⾏的X session的初始化过程。仔细阅读这些脚本或配置⽂件,可以帮助你更好地理解X
b)Display Manager
上⾯说过,Display Manager(后简称DM)是管理X session的程序,常见的有gdm, kdm, xdm等。对于默认进⼊X界⾯的Linux系统,必须将DM程序在开机时执⾏,即:/etc/rc2.d/S13gdm。下⾯我们从⼿⼯启动X的过程,看⼀下DM为我们做了哪些⼯作。
如果没有设置DM在开机时运⾏的话,⼿动启动X使⽤startx命令。man startx
可以知道,startx的作⽤可以看作是Display Manager的⼀种隐性实现。它使⽤xinit命令,分别根据/etc/X11/xinit/xinitrc
和/etc/X11/xinit/xserverrc中所指定的设置唤起X。
其中,xserverrc执⾏X server的运⾏任务;xinitrc则运⾏Xsession命令。从/etc/X11/Xsession脚本的内容可以看出,它也就是进⼊/etc
/X11/Xsession.d/⽬录轮询地执⾏所有脚本。很明显,这些也就是前⾯所说的Xsession初始化⼯作。
综合起来说,Display Manager完成三个任务:1, X Server的启动; 2, X session的初始化; 3, X session的管理。
c)Window Manager
X Server提供了基本的图形显⽰能⼒。然⽽具体怎么绘制应⽤程序的界⾯,却是要由应⽤程序⾃⼰解决的。⽽Window Manager(桌⾯管理器,后简称WM)就是⽤来提供统⼀的GUI组件的(窗⼝、外框、菜单、按钮等)。否则,应⽤程序们各⾃为政,既增加了程序开发的负担,不统⼀的桌⾯风格对视觉也是不⼩的挑战。
WM的启动由DM控制,在gdm的登录窗⼝,我们可以进⾏选择。常见的WM有:Metacity(Gnome默认的WM), fluxbox, fvwm, E17等。
d)X Clients
最后,就是X Client了。X客户端程序,顾名思义,就是使⽤X服务的程序。firefox,gedit等等都属于X Client程序。X Client部分值得考虑⼀下的就是DISPLAY环境变量。它主要⽤于远程X Client的使⽤。该变量表⽰输出⽬的地的位置,由三个要素组成:
[host]:display[.screen]
host指⽹络上远程主机的名称,可以是主机名、IP地址等。默认的host是本地系统,你可以在⾃⼰系统上echo $DISPLAY看⼀下。
display和screen分别代表输出画⾯的编号和屏幕的编号。具体细节由于硬件的缺乏,还有待进⼀步研究。
独⽴安装x window所需要的每⼀个包
yum install xorg-x11-server-Xorg
yum install xorg-x11-server-utils
yum install xorg-x11-utils
yum install xorg-x11-xinit
yum install xorg-x11-apps
yum install xorg-x11-twm
yum install xterm
xorg-x11-drv-fbdev-0.4.3-2.el6.x86_64
xorg-x11-drv-intel-2.21.12-2.el6.x86_64
组合安装x window
yum groupinstall "X Window System"
yum groupinstall GNOME Desktop Environment
yum groupinstall KDE Desktop Environment
安装完毕后,执⾏startx,即可进⾏X window(KDE)。
启动X主要有两种⽅法:
⼀是Display Manager,如XDM、GDM、KDM,此种⽅法通过图形界⾯登录;
⼀种是通过xinit,此种⽅法适⽤于字符界⾯登录。我们常⽤于登录X的startx命令也是通过传递参数给xinit来启动X的,
也就是说,最终启动X的是xinit。startx只是⼀个bash脚本。
xinit启动过程
先看⼿册页    man xinit
xterm是⼀个x window system上的终端模拟器;
xinit是启动Xserver和Xclient的。xinit会运⾏⼀个xinitrc的⽂件,这个⽂件你可以⾃⼰编写,可以把xterm写进xinitrc的。
xinit 的⽤法为: xinit [[client] options ] [-- [server] [display] options] 。其中 client ⽤于指定⼀个基于 X 的应⽤程序, client 后⾯的 options 是传给这个应⽤程序的参数, server 是⽤于指定启动哪个 X 服务器,⼀般为 /usr/bin/X 或 /usr/bin/Xorg , display ⽤于指定 display number ,⼀般为 0 ,表⽰第⼀个 display , option 为传给 server 的参数。
如果不指定 client , xinit 会查 HOME ( 环境变量 ) ⽬录下的 .xinitrc ⽂件,如果存在这个⽂件, xinit 直接调⽤ execvp 函数执⾏该⽂件。如果这个⽂件不存在,那么 client 及其 options 为:  xterm -geometry +1+1 -n login -display :0 。
如果不指定 server , xinit 会查 HOME( 环境变量 ) ⽬录下的 .xserverrc ⽂件,如果存在这个⽂件, xinit 直接调⽤ execvp 函数执⾏该⽂件。如果这个⽂件不存在,那么 server 及其 display 为:  X :0 。如
果系统⽬录中不存在 X 命令,那么我们需要在系统⽬录下建⽴⼀个名为X 的链接,使其指向真正的 X server 命令( Ubuntu 下为 Xorg )。
下⾯是⼏个关于 xinit 应⽤的例⼦:
1)xinit /usr/bin/xclock -- /usr/bin/X :0
该例⼦将启动 X server ,同时将会启动 xclock 。请注意指定 client 或 server 时,需要⽤绝对路径,否则 xinit 将因⽆法区别是传给 xterm 或server 的参数还是指定的 client 或 server ⽽直接当成是参数处理。
2)在 HOME 下新建 .xinitrc ⽂件,并加⼊以下⼏⾏:
xsetroot -solid gray &
xclock -g 50x50-0+0 -bw 0 &
xterm -g 80x24+0+0 &
xterm -g 80x24+0-0 &
twm
当 xinit 启动时,它会先启动 X server ,然后启动⼀个 clock ,两个 xterm ,最后启动窗⼝管理器 twm 。
请注意:
最后⼀个命令不能后台运⾏,否则所有命令都后台运⾏的话 xinit 就会返回退出,同样的,除最后⼀个命令外都必须后台运⾏,否则后⾯的命令将只有在该命令退出后才能运⾏。
看到这⾥,眼尖的⼈或许早以看出 xinit 的功能完全可以由脚本来实现,例如要启动 X Server 和⼀个 xterm ,就像 xinit 默认启动的那样,只需要在新建⼀个脚本或在 rc.local 中加⼊:
X&
export DISPLAY=:0.0
xterm
这个实现完全正确,然⽽却并没有完全实现 xinit 所具有的功能, xinit 所有的⼀项功能就是当最后⼀个
启动的 client (如上⾯第⼆个例⼦中的 twm 窗⼝管理器)退出后, X 服务器也会退出。⽽我们的脚本实现中当我们退出 xterm 后并不会退出 X server 。
因为 startx 就是通过调⽤ xinit 启动 X 的。 xinit 是⼀个⼆进制⽂件,并⾮是⼀个脚本。它的主要功能是启动⼀个 X 服务器,同时启动⼀个基于 X 的应⽤程序。
因此startx的⽤法跟xinit⼀样:startx [ [ client ] options ... ] [ -- [ server ] options ... ]
startx的⼏种启动⽅式
由对 startx 脚本的分析,我们可以知道 startx 主要有三种启动⽅式:
a) ⼀种是⾃⼰指定要启动的 client 和 server ,例如: startx /usr/bin/xclock -- /usr/bin/X :0 ;
b)⼀种是通过在 $HOME 下新建 .xinitrc ⽂件来指定要启动的多个 client 和 .xserverrc 来指定要启动的 server;
c)还有⼀种是直接输⼊ startx ⽽不指定参数,这也就是我们启动 gnome 桌⾯的⽅法。
在 c 这种启动⽅法中, startx 脚本会先去看系统⽬录( /etc/X11/xinit/ )下的 rc ⽂件是否存在,如果不存
在就会⽤默认的 xterm 和 /usr/bin/X 来启动 xinit 。显然, startx 启动的不是 xterm ,⽽是 gnome 桌⾯,因此 gnome 的启动是通过系统⽂件 /etc/X11/xinit/xinitrc 来指定的。
综上所述, startx 的默认启动过程为: startx 调⽤并将系统⽂件 /etc/X11/xinit/xinitrc 和 /etc/X11/xinit/xserverrc 作为参数传给 xinit , xinit 就会先执⾏系统⽂件 /etc/X11/xinit/xserverrc 以启动 X Server ,然后执⾏ /etc/X11/xinit/xinitrc ,⽽ xinitrc 则会执⾏脚本 /etc/X11/Xsession ,⽽ Xsession 则会按顺序调⽤执⾏ /etc/X11/Xsession.d ⽬录下的⽂件,从⽽最终调⽤了 gnome-session 这个⽤于启动 GNOME 桌⾯环境的程序
启动Xserver
user@host:~$X :0 &
在Xserver上启动xterm
user@host:~$xterm -display :0 &
在Xserver上的xterm中执⾏
user@host:~$metacity &
以初始化⼀个简单的窗⼝管理器
在Xserver上的xterm中即可执⾏firefox等需要X环境的程序
图形2d,3d加速简介
为了是linux下图形更加流畅,必须使⽤加速。常⽤的加速⽅法如下
加速常见有三种⽅式
a)ShadowFB
ShadowFB是xserver⾃带的与体系结构⽆关的2D加速⽅式,它将系统framebuffer复制⼀份,并且在拷贝回framebuffer中实现图形旋转等操作,这样可以起到⼀定加速作⽤,但是效果不好。
b) XAA
XAA全称XFree86 Acceleration Architecture,是由 Harm Hanemaayer 在1996年写的⼀个显卡硬件2D加速的驱动结构,⽬前⼤多数的显卡去动均⽀持这种驱动模式
c) EXA
EXA是X.Org发起的⽤于取代XAA加速的驱动结构,修改的宗旨是是XRender更加好⽤。
历史上对2D 和3D加速已经做了区分,2D加速主要使⽤的是XAA结构,3D加速主要是通过DRM(Direct Rendering Manage) 提供.⽽EXA提供了⽐XAA更好集成XRender的结构,同时也提⾼了XAA的2D加速效果。
EXA采⽤的⽅法是通过实现对OpenGL的加速以实现同时对2D,3D图像的加速,这样2D图像就可以看作是3D图像的⼀个⼦集。
⼀个基于Xlib的简单例⼦了解Client流程
Xlib是对X协议的的⼀个简单的封装,可以让程序员不⽤了解细节⽽编写图形相关程序。实际上程序员直接调⽤Xlib的很少,更多使⽤的是
GTK+ ,QT等图形库。这些⼜是基于Xlib的图形库。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。