Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用结构设置函数_Linux_Linux Kernel_Linux Device Driver_Kernel_Kernel Module - Fatal编程技术网

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++之类的面向对象语言,请将 FieleActudio< /Cuff>作为基类,在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);
当指针“存在”在一个可以传递给系统调用的结构中时,这是一个非常强大的特性,允许挂钩到系统函数中


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

函数,
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)。