【问题标题】:Using structures to set the functions使用结构设置功能
【发布时间】:2012-01-28 14:55:06
【问题描述】:

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

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

我还发现,即使声明了函数,它们也并不总是被实现。任何人都可以提供帮助。例如,在内核源代码中:kernel/dma.c,尽管

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

已定义,仅实现 proc_dma_open。

【问题讨论】:

  • 不,其他函数(seq_read、seq_lseek 和 single_release)只是在别处实现。
  • @fge 我在内核源代码的 dma.c、dma.h 或 seq_file.h 中找不到 seq_readsingle_releaseseq_lseek。 ``
  • 这个例子有点“奇怪”。通常,在填充此类结构时,您会使用指向函数的指针来填充它们。在这里,您使用了一些“标准”函数(seq_xxx,在 fs/seq_file.c 中实现)和您自己的函数(proc_dma_open)。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      指向函数的指针是 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);
      

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        • 2011-08-30
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        相关资源
        最近更新 更多