Linux 使用结构设置函数
在编写内核模块/驱动程序时,大多数情况下,一些结构被初始化为指向某些特定函数。作为这方面的初学者,有人能解释一下这一点的重要性吗 在编写字符设备驱动程序时,我看到了Linux 使用结构设置函数,linux,linux-kernel,linux-device-driver,kernel,kernel-module,Linux,Linux Kernel,Linux Device Driver,Kernel,Kernel Module,在编写内核模块/驱动程序时,大多数情况下,一些结构被初始化为指向某些特定函数。作为这方面的初学者,有人能解释一下这一点的重要性吗 在编写字符设备驱动程序时,我看到了struct file\u操作 我还发现,即使声明了函数,它们也不总是实现的。有人能帮我吗。例如,在内核源代码中:kernel/dma.c,eventhough static const struct file_operations proc_dma_operations = { .open = proc_dma_
struct file\u操作
我还发现,即使声明了函数,它们也不总是实现的。有人能帮我吗。例如,在内核源代码中: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,
};
定义,只执行PROGRIDMAYOPEN。
< P>如果您使用C++之类的面向对象语言,请将int fn(int a)
{
...
return a;
}
...
int (*dynamic_fn)(int);
...
dynanic_fn = &fn;
...
int i = dynamic_fn(0);
当指针“存在”在一个可以传递给系统调用的结构中时,这是一个非常强大的特性,允许挂钩到系统函数中
在面向对象语言中,同样的行为可以通过使用反射动态实例化类来实现。函数,
seq_lseek
和single_release
在内核源文件linux-3.1.6/include/linux/seq_file.h
中声明,并在内核源文件linux-3.1.6/fs/seq_file.c
中定义。它们可能在许多文件操作中都很常见。不,其他函数(seq_read、seq_lseek和single_release)只是在其他地方实现的。@fge我在内核源代码的dma.c、dma.h或seq_file.h中都找不到seq_read
、single_release
、seq_lseek
``这个例子有点“奇怪”。通常,在填充这些结构时,您会使用指向函数的指针来填充它们。这里,您使用一些“标准”函数(seq_xxx,在fs/seq_file.c中实现)和您自己的函数(proc_dma_open)。