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

C linux内核模块如何知道其文件何时被打开?,c,linux-kernel,fopen,kernel-module,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+"); 当

这是一个新手内核模块问题。。。我有一个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.ko)中的
mymodule\u open
命令。它怎么知道要这样做?关于
mymodule\u open()
如何知道
fopen
何时打开
/dev/mymodule
,我无法将这些点连接起来

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

/dev/module
将与您的模块链接

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

差不多

struct file_operations fops = {
open    : my_module_open,
release : my_module_release,
ioctl   : my_module_ioctl,
};
设备文件将识别和打开模块,并使用主要和次要编号。首先使用设备文件,然后使用文件操作结构


还可以查看
设备注册
设备文件操作

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

/dev/module
将与您的模块链接

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

差不多

struct file_operations fops = {
open    : my_module_open,
release : my_module_release,
ioctl   : my_module_ioctl,
};
设备文件将识别和打开模块,并使用主要和次要编号。首先使用设备文件,然后使用文件操作结构


还可以查看
设备注册
设备文件操作

当用户空间点击fopen调用时,它会被路由到打开的“系统调用”并从那里到相应的/注册的驾驶员FOP打开呼叫,方法是识别设备文件的主要:次要编号

每个设备文件都有一个属于特定驱动程序的“major:minor”元组,相应的fops结构将声明/定义支持的操作

fopen(/dev/mymodule)->库函数(打开,文件参数)-> systemcall(打开,文件参数)->文件系统驱动程序(inode,打开, 更多参数)->文件系统驱动程序(主要:次要,打开, 更多参数)->fops\U结构(开放、更多参数)

注意:以上名称用于解释从fopen到mymodule_open的访问流,除此之外,这些名称不是绝对函数名称,即库函数、系统调用、文件系统驱动程序……


驱动程序知道/dev/mymodule文件打开,因为它是一个触发事件,如上所述,从fopen开始,每个级别的函数开始触发下一级别的函数调用,直到在驱动程序内部达到mymodule_open的最终函数时,用户空间点击fopen调用,通过识别设备文件的主:次编号,它被路由到打开的“系统调用”,并从那里路由到相应的/注册的驱动程序的fops打开的调用

每个设备文件都有一个属于特定驱动程序的“major:minor”元组,相应的fops结构将声明/定义支持的操作

fopen(/dev/mymodule)->库函数(打开,文件参数)-> systemcall(打开,文件参数)->文件系统驱动程序(inode,打开, 更多参数)->文件系统驱动程序(主要:次要,打开, 更多参数)->fops\U结构(开放、更多参数)

注意:以上名称用于解释从fopen到mymodule_open的访问流,除此之外,这些名称不是绝对函数名称,即库函数、系统调用、文件系统驱动程序……


驱动程序知道打开的/dev/mymodule文件,因为它是上面提到的触发事件,从fopen开始,每个级别的函数开始触发下一级别的函数调用,直到在驱动程序内部实现mymodule_open的最终功能

您将
mymodule_open
文件操作
结构链接,对吗?从那里把点连起来…读得很好。对于您的具体问题,请参阅“注意事项”部分:内核为每个设备维护一个开放的“refcount”。如果您执行
xf1=fopen(“/dev/mymodule”,…);xf2=fopen(“/dev/mymodule”,…)然后
fclose(xf2);fclose(xf1)
,您的
mymodule\u open
将仅为
xf1
调用,而
mymodule\u close
仅为
xf1
调用。也就是说,无论执行了多少次嵌套打开,驱动程序只会在第一次打开时收到回调,而在最后一次关闭时只会收到关闭调用。您将
mymodule\u open
file\u operations
结构链接,对吗?从那里把点连起来…读得很好。对于您的具体问题,请参阅“注意事项”部分:内核为每个设备维护一个开放的“refcount”。如果您执行
xf1=fopen(“/dev/mymodule”,…);xf2=fopen(“/dev/mymodule”,…)然后
fclose(xf2);fclose(xf1)
,您的
mymodule\u open
将仅为
xf1
调用,而
mymodule\u close
仅为
xf1
调用。也就是说,无论执行了多少次嵌套打开,驱动程序只会在第一次打开时收到回调,而在最后一次关闭时只会收到关闭调用。