我对整个内核的了解还不够深入,无法记录所有的变更。在转换示例(或者实际上是改编 Emmanuel Papirakis 的变更)的过程中,我遇到了以下差异。我将所有这些差异列在这里,以帮助模块程序员,特别是那些从本书以前的版本学习并且最熟悉我使用的技术的人,转换到新版本。
希望转换为 2.2 版本的用户还可以访问 Richard Gooch 的网站上的额外资源。
如果您需要put_user或get_user您必须#include它。
在 2.2 版本中,get_user接收用户内存中的指针和内核内存中的变量,以填充信息。原因是get_user现在可以一次读取两个或四个字节,如果我们读取的变量是两个或四个字节长。
此结构现在在open和close函数之间有一个 flush 函数。
在 2.2 版本中,close函数返回一个整数,因此它允许失败。
这些函数的头文件已更改。它们现在返回ssize_t而不是整数,并且它们的参数列表也不同了。inode 不再是参数,另一方面,文件偏移量是参数。
即使您想从中断处理程序内部调度任务,您也使用queue_task,而不是queue_task_irq.
您不再只是将模块参数声明为全局变量。在 2.2 中,您还必须使用MODULE_PARM来声明它们的类型。这是一个很大的改进,因为它允许模块接收以数字开头的字符串参数,例如,而不会感到困惑。
内核不再位于一个巨大的自旋锁内,这意味着内核模块必须意识到 SMP。