Linux设备驱动第 2 章之 在用户空间编写驱动程序

2.9. 在用户空间编写驱动程序

        首次接触内核的Unix开发者可能对编写模块比较紧张,然而编写用户空间程序来直接对设备端口进行读写就容易得多。

        相对于内核空间编程,用户空间编程具有自己的优点。有时编写一个所谓的用户空间驱动程序是替代内核空间驱动程序的一个不错的方法。用户空间驱动程序优点如下:

        可以和整个C库链接。驱动程序不用借助外部程序就可以完成许多非常规任务。

        可以使用通常的调试器调试驱动程序代码,而不用费力地调试正在运行的内核。

        如果用户空间驱动程序被挂起,则简单地杀掉它就行了。驱动程序带来的问题不会挂起整个系统,除非所驱动的硬件已经发生严重故障。

        和内核内存不同,用户内存可以换出。如果驱动程序很大但是不经常使用,则除了正在使用的情况之外,不会占用太多内存。

        良好设计的驱动程序仍然支持对设备的并发访问。

        如果必须编写封闭源码的驱动程序,则用户空间驱动程序可更加容易地避免因为修改内核接口而导致的不明确的许可问题。

        例如,USB驱动程序可在用户空间编写;具体可参考libusb项目,以及内核源代码中的gadgetfs。X服务器是用户空间驱动程序的一个例子。它十分清楚硬件可以做什么,不可以做什么,并且为所有的X客户提供图形资源。值得注意的是目前基于帧缓冲区的图形环境正在慢慢成为发展趋势。这种环境下对于实际的图形操作,X服务器仅仅是一个基于真正内核空间驱动程序的服务器。

        通常,用户空间的驱动程序被实现为一个服务器进程,其任务是替代内核作为硬件控制的唯一代理。客户应用程序可连接到该服务器并和设备执行实际的通信;这样,好的驱动程序进程可运行对设备的并发访问。其实这就是X服务器的本质。

扫描二维码关注公众号,回复: 2171742 查看本文章

        除具备上述优点外,用户空间驱动程序有很多缺点,例如:

        中断在用户空间中不可用。对该限制,在某些某些平台上有相应的解决办法,比如IA32架构上的vm86系统调用。

        只有通过mmap映射/dev/mem才能直接访问内存,但只有特权用户才可以执行这个操作。

      只有在调用ioperm或iopl后才可以访问IO端口。并不是所有平台都支持这两个系统调用,并且访问/dev/port可能非常慢,因而并非十分有效。同样只有特权用户才能引用这些系统调用和访问设备文件。

        响应时间很慢。这是因为在客户端和硬件之间传递数据和动作需要上下文切换。

        更严重的是,如果驱动程序被换出到磁盘,响应时间将令人难以忍受。使用mlock系统调用或许可以缓解这一问题,但由于用户空间程序一般需要链接多个库,因此,通常需要占用多个内存页。同样,mlock也只有特权用户才能引用。

        用户空间中不能处理一些非常重要的设备,包括但不限于网络接口和块设备。

        看到用户空间驱动程序做不了太多工作。然而依然存在一些有意义的应用,例如,对SCSI扫描设备和CD刻录设备的支持。这两种情况下,用户空间驱动程序都依赖内核空间驱动程序SCSI generic,它导出底层通用的SCSI功能到用户空间程序,然后再由用户空间驱动程序驱动自己的硬件。

        有一种情况适合在用户空间处理,这就是当准备处理一种新的、不常见的硬件时。在用户空间中可以研究如何管理这个硬件而不用担心挂起整个系统。一旦完成,很容易将用户空间驱动程序封装到内核模块中。

        

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/81004421