这是一个新手内核模块问题...我的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
知道的方式,我无法连接点。
答案 0 :(得分:2)
内核中有一个模块注册机制,用于设备驱动程序或内核模块。
/dev/module
将与您的模块相关联。
设备操作和文件操作结构与设备文件一起映射。
类似
struct file_operations fops = {
open : my_module_open,
release : my_module_release,
ioctl : my_module_ioctl,
};
设备文件将在主要和次要编号的帮助下识别和打开模块。首先是设备文件,然后是文件操作结构。
另请参阅device registration
和device 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的最终函数内部司机