1、文章编号:1000-1220(2002 )01-0047-03 Linux 用户空间打印机驱动程序的设计与实现刘 斌 王 沛 潘金贵(南京大学 计算机软件新技术国家重点实验室,南京大学 计算机科学与技术学院 江苏 南京 210093)摘要:当前,Linux 作为新兴的操作系统,正越来越受到人们的重视和研究,本文对 Linux打印系统进行了分析,提出了一种开放用户空间打印机驱动程序的通用方法,一定程度上解决了 Linux 打印机驱动程序开发困难的问题,同时,为了能够更好地解决开发 Linux 打印机驱动程序的问题,在总结了 Linux 和 Windows 打印系统特点的基础上,文中提出了一种新的
2、 Linux 打印系统结构。中图分类号:TP334 文献标识码:A1 引言自第一个操作系统诞生起就有了设备驱动程序的概念,因为操作系统本身就是用来驱动计算机这个“设备”的,驱动程序是属于操作系统的核心程序,它不仅直接参与操作系统的内部操作,而且和物理外设有密切关系,直接影响了它的工作效率,从经济角度来看,一种操作系统能否得到广大用户的认可,顺利在市场上推广,与它所支持外设的种类和数量的多寡有很大的关系,一个得不到硬件厂商支持的操作系统是没有什么前途的。反过来,硬件厂商所生产的外设如果没有适当的驱动程序驱动,也不过是一堆没有意义的废铁而已。当前作为唯一一种能够想和 Windows 抗衡的操作系统
3、,Linux 正越来越受到人们的重视。从技术角度来看,Linux 具有卓越的性能和惊人的稳定性,而且,它几乎免费的价格、完全开源的特性使得它逐渐受到人们的欢迎。但是,由于对计算机外设尤其是打印机的支持不足,使得人们在使用 Linux 时感到很不方便,甚至不愿使用 Linux,限制了 Linux 的迅速推广。Linux 缺乏打印机驱动程序,一个原因是支持 Linux 的硬件厂商还不多,另一个重要原因是 Linux 自身打印系统的特殊性造成的。Linux 打印系统没有对打印机驱动程序结构做出明确的定义,造成开发打印机驱动程序困难的局面。因此,研究 Linux 打印系统,寻找开发驱动程序的通用方法,
4、解决 Linux 平台可用打印机缺乏问题具有很强的现实意义。2 Linux 打印系统分析为了对打印任务进行控制,Linux 将打印系统分为上下两部分,上半部分和需要打印的应用程序合作,负责打印任务的生成和管理工作,分别由过滤器和 lpd 完成;下半部分负责与打印机通信,由运行于内核空间的驱动程序 lp 完成。Lpd 负责在过滤器和 lp 之间传递打印任务。由于 lpd 最早是为行式打印机设计的只打印 ASCII 字符的打印机,所以要使它胜任现在的打印任务文本、图形、Postscript 等格式的数据,需要为它添加过滤程序相当于 Windows 系统中打印机驱动程序。这部分驱动程序运行于用户空间
5、。图 1 表示了打印机驱动程序和其他系统程序的关系。Linux 一般要求系统配置 Postscript 打印机来实习较复杂的图形打印。因为 Linux 的应用程序大多支持 PS 格式的文件输出,而且这样可以简化打印机驱动程序的设计(几乎不需要打印机驱动程序) 。但是,目前市场上较为多见的还是只能处理图像格式的 GDI 打印机,这种打印机使用简单的控制命令控制动作,不参与图像格式的生成,要求驱动程序完成打印文档到打印格式文件的转换工作。为了支持 GDI 打印机,Linux 为打印系统加了一个过滤程序的结构,由过滤程序来完成 windows 打印系统中打印机驱动程序的工作。由于打印系统对驱动程序结
6、构定义的不完整,造成在为 GDI 打印机开发 Linux 驱动程序的过程中存在如下两个主要问题:1)驱动程序没有用户交互接口,用户不能设置文档打印属性。2)驱动程序要独自实现文档格式的图像格式的转换,难道较大。3 用户空间打印机驱动程序的设计在 Linux 系统中,应用程序和打印机驱动程序之间关系松散,两者间的数据交换只有打印文档的传送,驱动程序几乎是一个独立的应用程序。鉴于 Linux 打印系统的特点,我们对图 1 中过滤器的功能进行加强,让它具有图形用户交互界面,同时充分利用 linux 丰富的共享软件,实现对文档格式到图像格式的转换,减少开发驱动程序工作量,从而解决了开发打印机驱动程序的
7、两个主要问题。由于驱动程序的图形用户接口和对文档进行格式转换部分的功能相对独立,可以把它们分成两个独立的应用程序,彼此用管道连接进行数据交换,同时,为了在两者间建立管道,并对用户提供打印命令,另有一个总控脚本(系统流程如图 2) 。用户 总控脚本 GUI filter lpd spooler 数据流 控制流 驱动程序功能模块图 2 驱动程序流程图其中,GUI 是驱动程序与用户的图形交互接口,filter 负责对打印文档进行格式转换,正规系统运行在用户空间,相当于原来 Linux 打印系统中的过滤器,但由于增加了图形用户交互接口,增强了驱动程序的功能,提高了易用性。4 filter 的设计在打印
8、机驱动程序的构成中,filter 担负着重要的角色,它负责将打印文档格式转换为适合打印机的数据格式,filter 功能的强弱直接影响了驱动程序乃至打印机的整体性能表现。为了增加驱动程序的灵活性,filter 需要支持尽可能多的文档格式,实习尽可能多的格式转换模块,但也由此增加了驱动程序的开发难度和工作量,因此,合理、充分利用 Linux 自有的丰富共享软件资源,将极大的影响驱动程序的开发工作。同时,因为没有必要支持所有的格式,所以也要对支持的文档格式做出精心的选择,原则是对使用的较广泛的格式提供支持,较为罕见的格式不支持。经过调查和权衡,觉得支持一下几种数据格式(如表 1 所示):选择的依据:
9、1)文本是一种使用最为广泛的数据类型之一。2)Linux 环境下,PS 格式的数据是事实上的标准,几乎所有的应用软件都支持 PS 格式数据的输出。3)图像格式的文件使用广泛,且格式转换工具较为齐全,而且,以上所有数据格式都有相应的共享软件提供格式转换支持,便于构建所需的驱动程序。根据现有工具盒打印机的要求,对于文本数据,驱动程序先将其转换为 PS 数据,然后归入 PS 数据的转换流程;PS 数据先由一系列相应工具转换为 PGM 图像数据,然后归入图像数据的转换流程;对于各种图像数据,先由相应的转换工具转换为 PGM 图像数据,然后由驱动程序自开发的转换工具转换为打印机可理解的数据格式(系统流程
10、如图 3 所示) 。驱动程序中,filter 由十三个转换模块组成,但由于大量使用了 Linux 既存的共享工具,使得需要开发的模块只有 pnmscale、pgmtopbm 和 fjgs-conv 三个,这三个模块完成由图像PGM 数据格式到打印机 WIN-F(某种打印机所支持的一种数据格式)数据格式的转换。另外,由图形用户接口所搜集到的用户设置的打印参数也参与数据格式的转换。图 3 filter 流程图5 共享图形用户接口的设计在上面,我们讨论了一种打印机驱动程序的开发方法,该方法虽然具有一定的通用性,但它的局限性也是显而易见的:由于驱动程序的图形用户接口各自独立实现,很难保证显示风格的统一
11、,反而给用户的使用带来了不便,而且不同的图形接口的实习也带来了兼容性的隐患。实际上,驱动程序的图形用户接口的功能可分为属性和显示两部分。属性刻画打印机的功能,与打印机密切相关,而显示负责打印机各种属性的显示形态,与具体打印机没有什么关系,是可以共享的部分,即所有的打印机驱动程序可以共享同一个用户图形接口的显示模块来生成统一风格的图形用户接口,至于该显示什么属性则由显示模块和驱动程序协商解决,这样既保证了显示风格的统一,又保留了驱动程序的各自特性。为此,要对Linux 打印系统重新进行设计,添加共享图形用户接口显示模块(如图 4 所示) 。其中,CPPUI 是共享图形用户接口显示模块,它通过打印
12、机数据库(PDB)得到打印机驱动程序的有关信息,软化通过和打印机驱动程序交互来了解打印机驱动程序的图形用户接口,最后将用户对图形用户接口的设置返回给打印机驱动程序,由驱动程序处理打印文件生成打印数据,最后将处理好的打印数据交给 Linux 打印缓冲池,由缓冲池出啊给打印机打印。新的打印系统所带来的好处是显而易见的:(1)统一了打印机驱动程序图形用户接口的=显示风格;(2)CPPUI 所支持的打印机数据可以很方便的扩展,而且保持向前兼容;(3)简化了驱动程序的结构,驱动程序只需致力于驱动打印机的核心功能。(4)整个系统结构清楚,各模块间接口较简单,有利于打印机驱动程序的开发。6 结束语由于 Linux 自身对 GDI 打印机的支持不足,导致了 Linux 平台为这类打印机开发驱动程序困难的局面,不仅驱动程序匮乏,而且使用界面不友好。本文通过对 Linux 打印系统的分析,结合其特点提出了一种开发用户空间打印机驱动程序的方法,该方法使用图形用户接口,增加了驱动程序的易用性,且支持的数额局格式较广泛,并具有一定的通用性,但因此带来了图形用户接口显示风格不统一的问题,为此,本文又提出了一种更加妥善的解决方法共享图形用户接口,使得为 GDI 打印机开发驱动程序变得较为规范和容易。