用户空间驱动

一个第一次涉及内核问题的 Unix 程序员, 可能会紧张写一个模块. 编写一个用户程序来 直接读写设备端口可能容易些. 确实, 有几个论据倾向于用户空间编程, 有时编写一个所谓的用户空间设备驱动对比钻研 内核是一个明智的选择. 在本节, 我们讨论几个理由, 为什么你可能在用户空间编写驱动. 本书是关于内核空间驱动的, 但是, 所以我们不超越这个介绍性的讨论. 用户空间驱动的好处在于: •
摘要由CSDN通过智能技术生成

一个第一次涉及内核问题的 Unix 程序员, 可能会紧张写一个模块. 编写一个用户程序来
直接读写设备端口可能容易些.
确实, 有几个论据倾向于用户空间编程, 有时编写一个所谓的用户空间设备驱动对比钻研
内核是一个明智的选择. 在本节, 我们讨论几个理由, 为什么你可能在用户空间编写驱动.
本书是关于内核空间驱动的, 但是, 所以我们不超越这个介绍性的讨论.
用户空间驱动的好处在于:
• 完整的 C 库可以连接. 驱动可以进行许多奇怪的任务, 不用依靠外面的程序(实现
使用策略的工具程序, 常常随着驱动自身发布).
• 程序员可以在驱动代码上运行常用的调试器, 而不必走调试一个运行中的内核的弯
路.
• 如果一个用户空间驱动挂起了, 你可简单地杀掉它. 驱动的问题不可能挂起整个系
统, 除非被控制的硬件真的疯掉了.
• 用户内存是可交换的, 不象内核内存. 一个不常使用的却有很大一个驱动的设备不
会占据别的程序可以用到的 RAM, 除了在它实际在用时.
• 一个精心设计的驱动程序仍然可以, 如同内核空间驱动, 允许对设备的并行存取.
• 如果你必须编写一个封闭源码的驱动, 用户空间的选项使你容易避免不明朗的许可
的情况和改变的内核接口带来的问题.
例如, USB 驱动能够在用户空间编写; 看(仍然年幼) libusb 项目, 在
libusb.sourceforge.net 和 “gadgetfs” 在内核源码里. 另一个例子是 X 服务器: 它确
切地知道它能处理哪些硬件, 哪些不能, 并且它提供图形资源给所有的 X 客户. 注意, 然
而, 有一个缓慢但是固定的漂移向着基于 frame-buffer 的图形环境, X 服务器只是作为
一个服务器, 基于一个内核空间的真实的设备驱动, 这个驱动负责真正的图形操作.
常常, 用户空间驱动的编写者完成一个服务器进程, 从内核接管作为单个代理的负责硬件
控制的任务. 客户应用程序就可以连接到服务器来进行实际的操作; 因此, 一个聪明的驱
动经常可以允许对设备的并行存取. 这就是 X 服务器如何工作的.
但是用户空间的设备驱动的方法有几个缺点. 最重要的是:
• 中断在用户空间无法用. 在某些平台上有对这个限制的解决方法, 例如在 IA32 体
系上的 vm86 系统调用.
• 只可能通过内存映射 /dev/mem 来使用 DMA, 而且只有特权用户可以这样做.
• 存取 I/O 端口只能在调用 ioperm 或者 iopl 之后. 此外, 不是所有的平台支持这
些系统调用, 而存取/dev/port 可能太慢而无效率. 这些系统调用和设备文件都要
求特权用户.
• 响应时间慢, 因为需要上下文切换在客户和硬件之间传递信息或动作.
• 更不好的是, 如果驱动已被交换到硬盘, 响应时间会长到不可接受. 使用 mlock 系
统调用可能会有帮助, 但是常常的你将需要锁住许多内存页, 因为一个用户空间程
序依赖大量的库代码. mlock, 也, 限制在授权用户上.
• 最重要的设备不能在用户空间处理, 包括但不限于, 网络接口和块设备.
如你所见, 用户空间驱动不能做的事情毕竟太多. 感兴趣的应用程序还是存在: 例如, 对
SCSI 扫描器设备的支持( 由 SANE 包实现 )和 CD 刻录器 ( 由 cdrecord 和别的工具实
现 ). 在两种情况下, 用户级别的设备情况依赖 “SCSI gneric” 内核驱动, 它输出了低层
的 SCSI 功能给用户程序, 因此它们可以驱动它们自己的硬件.
一种在用户空间工作的情况可能是有意义的, 当你开始处理新的没有用过的硬件时. 这样
你可以学习去管理你的硬件, 不必担心挂起整个系统. 一旦你完成了, 在一个内核模块中
封装软件就会是一个简单操作了.
用户空间驱动的优缺点:
用户空间驱动的优点:

1 完整的 C 库可以连接. 驱动可以进行许多奇怪的任务, 不用依靠外面的程序(实现使用策略的工具程序, 常常随着驱动自身发布);

2 程序员可以在驱动代码上运行常用的调试器, 而不必走调试一个运行中的内核的弯路;

3 如果一个用户空间驱动挂起了, 你可简单地杀掉它. 驱动的问题不可能挂起整个系统, 除非被控制的硬件真的疯掉了;

4 用户内存是可交换的, 不象内核内存. 一个不常使用的却有很大一个驱动的设备不会占据别的程序可以用到的 RAM, 除了在它实际在用时;

5 一个精心设计的驱动程序仍然可以, 如同内核空间驱动, 允许对设备的并行存取;

6 如果你必须编写一个封闭源码的驱动, 用户空间的选项使你容易避免不明朗的许可的情况和改变的内核接口带来的问题;

7 一种在用户空间工作的情况可能是有意义的, 当你开始处理新的没有用过的硬件时. 这样你可以学习去管理你的硬件, 不必担心挂起整个系统. 一旦你完成了, 在一个内核模块中封装软件就会是一个简单操作了。
用户空间驱动的缺点:
1 中断在用户空间无法用. 在某些平台上有对这个限制的解决方法, 例如在 IA32体系上的 vm86 系统调用;
2 只可能通过内存映射 /dev/mem 来使用 DMA, 而且只有特权用户可以这样做;

3 存取 I/O 端口只能在调用 ioperm 或者 iopl 之后. 此外,不是所有的平台支持这些系统调用, 而存取/dev/port可能太慢而无效率. 这些系统调用和设备文件都要求特权用户;

4 响应时间慢, 因为需要上下文切换在客户和硬件之间传递信息或动作;

5 更不好的是,如果驱动已被交换到硬盘, 响应时间会长到不可接受。 使用 mlock 系统调用可能会有帮助,但是常常的你将需要锁住许多内存页, 因为一个用户空间程序依赖大量的库代码. mlock, 也, 限制在授权用户上。最重要的设备不能在用户空间处理, 包括但不限于, 网络接口和块设备。
下面来看在前面的基础上加上中断的情况,由于用户空间不能操作中断,所以只能使用内核驱动,下面贴出代码,具体解析我在《GPIO中断程序》一文中有讲述,此处不再赘述。


    /*  
     * PB18_IRQTest.c  
     * This is  a test program for sam9260, using PB19(J5_18 pin) input a signal to PB18(J
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值