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

How does a linux kernel module know when its file has been opened?

这是一个新手内核模块问题...我 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,我无法将这些点点滴滴联系起来。

内核中有设备驱动程序或内核模块的模块注册机制。

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

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

类似于

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

设备文件将在主要和次要number.First设备文件的帮助下识别并打开模块,然后是文件操作结构。

同时查看 device registrationdevice file operations

当用户 space 点击 fopen 调用时,它被路由到 open "system call" 并从那里corresponding/registered 驱动程序的 fops-open 调用 通过识别设备文件的 major:minor 编号 .

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

fopen(/dev/mymodule) -> library_function(open, file_arguments) -> systemcall(open, file_arguments) -> filesystem_driver(inode, open, more_arguments) -> filesystem_driver(major:minor, open, more_arguments) -> fops_structure (open, more_arguments)

注意:以上名称是为了解释从 fopen 到 mymodule_open 的 reach 流程,除此之外,名称不是绝对函数名称,即 library_function , 系统调用, filesystem_driver...

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

的功能