分类: 嵌入式
2009-09-17 13:01:27
内核划分: 进程管理 内存管理(malloc/free) 文件系统 设备控制 网络
设备类型: 字符设备 块设备 网络接口
第二章
1.初始化函数
static int __init initialization_function(void) { /* Initialization code here */ } module_init(initialization_function);
对每一个设施, 有一个特定的内核函数来完成这个注册. 传给内核注册函数的参数常常是一些数据结构的指针, 描述新设施以及要注册的新设施的名子. 数据结构常常包含模块函数指针, 模块中的函数就是这样被调用的.
2.清理函数
static void __exit cleanup_function(void) { /* Cleanup code here */ } module_exit(cleanup_function);如果你的模块没有定义一个清理函数, 内核不会允许它被卸载.3.初始化中的错误处理首先第一的事情是决定模块是否能够无论如何继续初始化它自己.如果证实你的模块在一个特别类型的失败后完全不能加载, 你必须取消任何在失败前注册的动作. 经常地, 唯一的方法就是重启系统.goto 的正确使用4.用户空间驱动的好处在于:
完整的 C 库可以连接. 驱动可以进行许多奇怪的任务, 不用依靠外面的程序(实现使用策略的工具程序, 常常随着驱动自身发布).
程序员可以在驱动代码上运行常用的调试器, 而不必走调试一个运行中的内核的弯路.
如果一个用户空间驱动挂起了, 你可简单地杀掉它. 驱动的问题不可能挂起整个系统, 除非被控制的硬件真的疯掉了.
用户内存是可交换的, 不象内核内存. 一个不常使用的却有很大一个驱动的设备不会占据别的程序可以用到的 RAM, 除了在它实际在用时.
一个精心设计的驱动程序仍然可以, 如同内核空间驱动, 允许对设备的并行存取.
如果你必须编写一个封闭源码的驱动, 用户空间的选项使你容易避免不明朗的许可的情况和改变的内核接口带来的问题.
用户空间的设备驱动的方法有几个缺点. 最重要的是:
中断在用户空间无法用. 在某些平台上有对这个限制的解决方法, 例如在 IA32 体系上的 vm86 系统调用.
只可能通过内存映射 /dev/mem 来使用 DMA, 而且只有特权用户可以这样做.
存取 I/O 端口只能在调用 ioperm 或者 iopl 之后. 此外, 不是所有的平台支持这些系统调用, 而存取/dev/port可能太慢而无效率. 这些系统调用和设备文件都要求特权用户.
响应时间慢, 因为需要上下文切换在客户和硬件之间传递信息或动作.
更不好的是, 如果驱动已被交换到硬盘, 响应时间会长到不可接受. 使用 mlock 系统调用可能会有帮助, 但是常常的你将需要锁住许多内存页, 因为一个用户空间程序依赖大量的库代码. mlock, 也, 限制在授权用户上.
最重要的设备不能在用户空间处理, 包括但不限于, 网络接口和块设备.