在编写内核模块/驱动程序时,大多数情况下,某些结构被初始化为指向某些特定功能。作为初学者,有人可以解释这一点的重要性。
我在编写字符设备驱动程序时看到了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。
答案 0 :(得分:1)
如果您曾使用过像C ++这样的面向对象语言,请将file_operations
视为基类,将您的函数视为其虚拟方法的实现。
答案 1 :(得分:1)
函数seq_read
,seq_lseek
和single_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);
当指针“存在”可以传递给系统调用的结构中时,这是一个非常强大的功能,允许挂钩进入系统函数。
在面向对象语言中,通过使用反射动态实例化类,可以实现相同类型的行为。