linux内核模块如何知道其文件何时被打开?

时间:2016-03-16 03:35:47

标签: c linux-kernel fopen kernel-module

这是一个新手内核模块问题...我的mymodule.c有一个函数:

static int mymodule_open(struct inode *inode, struct file *filp)
{
    //printk(KERN_INFO "open called\n");
    /* Success */
    return 0;
}

和用户级程序,其中变量初始化后的第一行是:

FILE *pFile = fopen("/dev/mymodule", "r+");

当我运行用户级程序时,fopen以某种方式调用mymodule.c中的mymodule_open命令(编译为mymodule.ko)。怎么知道这样做?关于mymodule_open()何时打开fopen/dev/mymodule知道的方式,我无法连接点。

2 个答案:

答案 0 :(得分:2)

内核中有一个模块注册机制,用于设备驱动程序或内核模块。

/dev/module将与您的模块相关联。

设备操作和文件操作结构与设备文件一起映射。

类似

struct file_operations fops = {
open    : my_module_open,
release : my_module_release,
ioctl   : my_module_ioctl,
};

设备文件将在主要和次要编号的帮助下识别和打开模块。首先是设备文件,然后是文件操作结构。

另请参阅device registrationdevice file operations

答案 1 :(得分:2)

当用户空间点击 fopen 时,它会被路由到打开&#34;系统调用&#34; 并从那里到相应/已注册的驱动程序的fops-open 通过识别设备文件的主要编号<次要编号来调用

每个设备文件都有一个&#34; 专业:次要&#34;元组属于特定的驱动程序,相应的fops结构将声明/定义支持的操作。

  

fopen(/ dev / mymodule) - &gt; library_function(open,file_arguments) - &gt;   systemcall(open,file_arguments) - &gt; filesystem_driver(inode,open,   more_arguments) - &gt; filesystem_driver(主要:minor,open,   more_arguments) - &gt; fops_structure(open,more_arguments)

注意:上面的名称是为了解释从fopen到mymodule_open的到达流程,除此之外,这些名称不是绝对的函数名称,即library_function,systemcall,filesystem_driver ... < / p>

驱动程序知道/ dev / mymodule文件是否打开,因为它是一个触发事件,如上所述,从fopen开始,每个级别的函数开始触发下一级函数调用,直到达到mymodule_open的最终函数内部司机