A.1. 2.0 和 2.2 版本之间的更改

A.1.1. 2.0 和 2.2 版本之间的更改

我对整个内核的了解还不够深入,无法记录所有的更改。在转换示例(或者实际上是改编 Emmanuel Papirakis 的更改)的过程中,我遇到了以下差异。我将它们全部列在这里,以帮助模块程序员,特别是那些从本书以前版本学习并且最熟悉我使用的技术的程序员,转换到新版本。

希望转换为 2.2 版本的人员可以访问 Richard Gooch 的网站,获取更多资源。

asm/uaccess.h

如果您需要put_userget_user您必须#include它。

get_user

在 2.2 版本中,get_user接收用户内存中的指针和内核内存中的变量,以便用信息填充。 这样做的原因是get_user如果我们要读取的变量是两个或四个字节长,现在可以一次读取两个或四个字节。

file_operations

此结构现在在openclose函数之间有一个 flush 函数。

closefile_operations

在 2.2 版本中,close函数返回一个整数,因此它允许失败。

read,writefile_operations

这些函数的头文件已更改。它们现在返回ssize_t而不是整数,并且它们的参数列表也不同。 inode 不再是参数,另一方面,文件中的偏移量是参数。

proc_register_dynamic

此函数不再存在。相反,您调用常规的proc_register并在结构的 inode 字段中放置零。

信号

任务结构中的信号不再是 32 位整数,而是一个_NSIG_WORDS整数数组。

queue_task_irq

即使您想安排一个任务从中断处理程序内部发生,您也使用queue_task, 而不是queue_task_irq.

模块参数

您不再只是将模块参数声明为全局变量。在 2.2 中,您还必须使用MODULE_PARM来声明它们的类型。 这是一个很大的改进,因为它允许模块接收以数字开头的字符串参数,例如,而不会感到困惑。

对称多处理

内核不再位于一个巨大的自旋锁内,这意味着内核模块必须意识到 SMP