使用结构来设置功能

时间:2011-12-27 16:09:15

标签: linux linux-kernel linux-device-driver kernel kernel-module

在编写内核模块/驱动程序时,大多数情况下,某些结构被初始化为指向某些特定功能。作为初学者,有人可以解释这一点的重要性。

我在编写字符设备驱动程序时看到了struct file_operations

此外,我发现尽管声明了函数,但它们并未始终实现。也许任何人都可以提供帮助。例如,在内核源代码中:kernel / dma.c,eventhough

static const struct file_operations proc_dma_operations = {
    .open       = proc_dma_open,
    .read       = seq_read,
    .llseek     = seq_lseek,
    .release    = single_release,
};

已定义,仅实现了proc_dma_open。

3 个答案:

答案 0 :(得分:1)

如果您曾使用过像C ++这样的面向对象语言,请将file_operations视为基类,将您的函数视为其虚拟方法的实现。

答案 1 :(得分:1)

函数seq_readseq_lseeksingle_release在内核源文件linux-3.1.6/include/linux/seq_file.h中声明,并在内核源文件linux-3.1.6/fs/seq_file.c中定义。它们可能是许多文件操作的共同点。

答案 2 :(得分:0)

指向函数的指针是C语言中非常强大的工具,允许实时重定向函数调用。大多数(如果不是所有)操作系统都有类似的机制,例如旧的MS-DOS中臭名昭着的INT 21函数25/35允许TSR程序存在。

在C中,您可以将函数指针指定给变量,然后通过该变量调用该函数。可以在初始时根据某些参数更改该函数,也可以在运行时根据某些行为更改该函数。

以下是一个例子:

int fn(int a)
{
   ...
   return a;
}

...

int (*dynamic_fn)(int);
...
dynanic_fn = &fn;
...
int i = dynamic_fn(0);

当指针“存在”可以传递给系统调用的结构中时,这是一个非常强大的功能,允许挂钩进入系统函数。

在面向对象语言中,通过使用反射动态实例化类,可以实现相同类型的行为。