发信人: mark7312(小马哥)
整理人: qiaoqian(2001-12-30 23:53:40), 站内信件
|
Linux是一个备受大家关注的操作系统,但毕竟它还很年轻,在一些硬件的兼容性上存在一些问题。随着Linux用户的不断增加,硬件厂商和软件厂商都开始在不断地完善基于Linux的硬件驱动程序,Linux对显卡的支持问题是一个很常见的硬件问题。在Linux下如果不能正确安装显卡,性能会有很大的折扣,而且显示效果也很差,因此我们今天就和大家探讨一下关于在Linux下使用流行显卡的方法。
Linux最新内核支持的显卡
现在,得到Linux版本的显卡驱动程序不再像以前那样困难了。随着XFree86 4的推出,很多显卡都已通过它内建的DRI (Direct Rendering Infrastructure,直接着色基本结构)层和OpenGL功能得到支持(XFree86 4可以到ftp.xfree86.org或你的Linux网址上下载) 。目前很多的显卡生产商都已加入支持DRI的潮流中,惟一的例外就是nVIDIA, 它单独发布自己的驱动程序,必须另外下载和安装。后面将详述此类显卡的安装。
如果硬件加速程序没有加载(或没正确安装),游戏的速度会很低,只有到5帧/s左右。而正确安装后性能会大大提升,差别相当大。
DRI支持下列公司的显卡:
Matrox公司:
G200 和 G400. 据说也支持G450,但目前没得到证实。
Intel公司:
i810、i810-dc100、i810e,i815是否支持目前尚未知。
ATI公司:
Rage Fury, Rage Magnum, Xpert2000, Xpert 128, Xpert 99, All-in-Wonder 128 AGP, Radeon SDR, Radeon DDR. PCI接口的显卡只有很少的支持,不支持Rage 128。
上述的DRI驱动应该内建在你所购买的Linux操作系统里。为了正常工作,它们都需要加载一个内核模块。 而nVIDIA的驱动,只能从它的网址下载并需要手工安装。当然,它也需要加载指定内核模块。
nVIDIA提供下列产品的Linux驱动:
TNT 和 TNT2芯片、
GeForce 256、GeForce2 MX、GeForce2 Pro、GeForce2 GTS、GeForce 2 Ultra、GeForce2 Go、GeForce3芯片组 Quadro2 MXR和Quadro2 Pro 芯片组,几乎涵盖目前所有的产品。
检查3D支持
在Xfree86 4.0中有两个程序用来检查是否有3D支持:glxinfo 和 xdpyinfo。前者给出X窗口系统的GL支持情况,后者给出X系统的一般显示能力。要想了解复杂的显示环境,两个都很必要。
想检查是否有3D支持,在X系统的命令行状态输入“glxinfo”,然后从含“OpenGL renderer string”的那行往下看,如:
$ glxinfo
OpenGL renderer string: Mesa DRI Voodoo3 20000224
这说明Voodoo3的DRI驱动被找到并正常运行。其实,还可以看到很多的输出信息,给出详细的显卡功能信息,包括双缓冲(Double
-buffering),颜色深度缓冲(Depth buffering)、模板缓冲(Stencil buffering)、积聚缓冲(Accumulation buffering)等等。
如果DRI驱动没加载,显示的信息就是:
$ glxinfo
OpenGL renderer string: Mesa GLX Indirect
这表明,你的系统里使用慢速着色方式(Indirect表示纯软件加速),那玩起游戏来速度肯定不会爽的。
如果你有nVIDIA的显卡,显示信息就是:
$ glxinfo
OpenGL renderer string: RIVA TNT2/AGP/SSE
xdpyinfo命令显示屏幕的分辨率和颜色深度等功能的信息,就nVIDIA而言,我们感兴趣的就是含有下面字符的行:
GLX
NV-GLX
NVIDIA-GLX
如果看不到上面全部的三个单词,你也得不到硬件加速,等待你的只能是低劣的游戏画面和那慢得如牛的速度。
因此,我强烈建议大在安装驱动之前使用上述方法进行检测,以免出现一些不必要的麻烦。
加载DRI驱动
因为Linux显卡驱动是完全开放和自由发放的,你的Linux版本应该在编译XFree86内核时就已包含它们,并且在安装Linux时自动安装它们。如果不是这样的话,也不要担心,我们将仔细说明安装步骤。
要想让显卡驱动工作,需要重新编译XFree86。XFree86的大小是Linux kernel的两倍,没有容易配置的图形界面。重编这个工作,建议初学者找有经验的人来完成。
加载DRI驱动的步骤如下:
1.编译有DRI支持的X系统。
2.安装正确的Linux kernel模块。
3. 创建XF86配置文件,以加载新的显卡驱动。
如果你的X系统已经有DRI支持,那文件系统里就应该有两套模块:在/usr/X11R6/lib/modules/dri的XFree86模块和在/lib/modules/2.4.x/kernel/drivers/char/
drm里的kernel模块。 浏览相关目录,就会看到:
# ls /lib/modules/2.4.3/kernel/drivers/
char/drm
gamma.o i810.o mga.o r128.o radeon.o tdfx.o
# ls /usr/X11R6/lib/modules/dri
gamma_dri.so* mga_dri.so* sis_dri.so*
i810_dri.so* r128_dri.so* tdfx_dri.so*
注意:对SiS的支持正在进行,但不完整。
如果没见到这些文件,可以访问http://dri.sourceforge.net/doc/DRIcompile.html这个网址,学学如何构建自己的X系统。
如果见到相关文件,下一步就是加载正确的kernel模块。i810.o支持Intel i810 主板的内建显卡,mga.o是Matrox显卡的驱动,r128.o或radeon.o支持ATI显卡,tdfx.o是3Dfx显卡的驱动,而gamma.o是3DLabs显卡的。手工加载合适的驱动,并添加到/etc/modules.conf (或 /etc/conf.modules):
# modprobe tdfx
# echo tdfx >> /etc/modules.conf
最后一步是创建一个新的XF86Config文件。建议修改前,备份老配置文件。配置文件根据Linux的版本不同而不同,Redmond Linux使用的是/etc/X11/XF86Config-4文件。
打开配置文件,确认在[Module]部分有下面两行:
Load "glx"
退出并重启X系统,这时新装的显卡驱动应该就可以发挥作用了。
加载nVIDIA驱动
nVIDIA公司没把驱动加入XFree86的开放资源内,如果你有nVIDIA显卡,需要到http://www.nvidia.com/得到正确驱动。打开nVIDIA网站的“Support Center→Drivers→Linux Drivers”,有两个软件包要下载:NVIDIA_kernel和NVIDIA_GLX。两者都必须要有,提供的格式也不同,笔者选择的是RPM格式。
在写本文时,最新版本是build 769。就是NVIDIA_kernel-0.9-769.src.rpm 和NVIDIA_GLX-0.9-769.i386.rpm。前者安装前需要重编译,而后者自安装。命令如下:
# rpm --rebuild NVIDIA_kernel-0.9-769.src.rpm
# rpm -ivh /usr/src/ RedmondLinux/RPMS/
i586/NVIDIA_kernel-0.9-769.i586.rpm
# rpm -ivh NVIDIA_GLX-0.9-769.i386.rpm
下一步,需要修改XF86Config配置文件,方法同上。不过,在[Device]部分,加入:
Driver "nvidia"
确保加载glx,没加载dri和GLcore驱动:
# Load "glx"
# Load "dri"
# Load "GLcore"
至此,万事大吉,退出并重启X系统。
不过,nVIDIA的驱动对某些版本的Linux还是有些Bug。在笔者加载它的驱动并重启后,屏幕上有错误信息如下:
BUG IN DYNAMIC LINKER ld.so: dl-version.c: 217: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed!
ERROR: KUniqueApplication: Trying to launch kdeinit.
BUG IN DYNAMIC LINKER ld.so: dl-version.c: 217: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed!
ERROR: KUniqueApplication: Can't setup DCOP communication.
BUG IN DYNAMIC LINKER ld.so: dl-version.c: 217: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed!
并且桌面不出现,根据nVIDIA的说法:“在加载glibc动态库和libdl.so时,对那些使用dlopen()函数的应用而言的确有些问题。我们已经修复了一些,但不是全部。”
|
|