Appendix A. Changes: 2.0 To 2.2

从2.0到2.2的变化

从2.0到2.2的变化

我对内核的了解并不很完全所以我也无法写出所有的变化。在修改代码 (更确切的说,是采用Emmanuel Papirakis的修改)时,我遇到了以下的这些修改。 我将它们都列出来以方便模块编写者们,特别是学习该档案先前版本并熟悉我提到的这些技巧 (但已经更换到新版本的)的那些人。

更多的这方面的参考资料在 Richard Gooch's的站点上。

asm/uaccess.h

如果你要使用put_userget_user你就需要 #include它。

get_user

在2.2版本中,get_user同时接收用户内存的指针和用来 设置信息的内核内存中变量的内存指针。变化的原因是因为当我们读取的变量是二或四个字节长的时候, get_user也可以读取二或四个字节长的变量。

file_operations

改结构体现在有了一个可以在openclose之间进行的刷新操作函数。

close in file_operations

2.2版本中,close返回整形值,所以可以检测是否失败。

read,write in file_operations

这些函数的头文件改变了。它们现在返回ssize_t而不是整形值, 且它们的参数表也变了。inode 不再是一个参数,文件中的偏移量也一样。

proc_register_dynamic

该函数已经不复存在。你应该使用用0作为inode参数的proc_register 函数来替代它。

Signals

在 task 结构体中的signals不再是一个32位整形变量,而是一个为 _NSIG_WORDS 整形的数组。

queue_task_irq

即使你想在中断处理内部调度一个任务,你也应该使用 queue_task而不是queue_task_irq

Module Parameters

你不必在将模块参数声明为全局变量。在2.2中,使用 MODULE_PARM去声明模块参数。这是一个进步, 这样就允许模块接受以数字开头的参数名而不会被弄糊涂。

Symmetrical Multi-Processing

内核本省已不再是一个spinlock,意味着你的模块也应该考虑 SMP的问题。