A.1. 从2.0到2.2的变化

A.1.1. 从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 之间进行的刷新操作函数 flush

file_operations 中的 close

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

file_operations 中的 read,write

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

proc_register_dynamic

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

Signals

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

queue_task_irq

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

模块参数

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

对称多线程

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