【发布时间】:2020-12-06 10:28:18
【问题描述】:
我试图弄清楚基本内核驱动程序背后的代码是如何工作的。
我有以下结构:
static struct file_operations fops =
{
.open = dev_open,
.read = dev_read,
.write = dev_write,
.release = dev_release,
};
而我的 dev_open 函数定义为:
static int dev_open(struct inode *, struct file *);
现在我也熟悉了,打开设备文件的原型是在 linux/fs.h 中定义的:
http://lxr.linux.no/linux+v3.10/include/linux/fs.h#L1517
这是该链接中的特定行:
int (*open) (struct inode *, struct file *);
现在我的问题是.open = dev_open, 和int (*open) (struct inode *, struct file *); 之间的关系是什么
这是在 linux/fs.h 中定义的?是否将dev_open的地址传递给linux/fs.h中定义的函数指针int (*open)?一定有某种关系,或者将 struct fops 定义为“文件操作”类型有什么意义?
在这里提出并回答了一个类似的问题,但我觉得我的问题被遗漏了: File operations in drivers
谢谢
【问题讨论】:
-
int (*open) (struct inode *, struct file *);行为struct file_operations定义了一个字段。字段名称为open,字段类型为指向函数的指针,对应接受2个参数(类型为struct inode*和struct file*)并返回int。跨度> -
知道成员初始化器
.open = dev_open的含义与.open = &dev_open完全相同可能会有所帮助。 C 对函数上的一元*和&运算符有奇怪的规则。在这两种情况下,fops.open都被初始化为指向dev_open函数。 -
在
struct file_operations中,open成员需要显式声明为函数指针int (*open)(struct inode *, struct file *);。结构或联合类型的成员可以具有“指向函数的指针”类型,但不能具有“函数”类型,因此不能将open成员声明为int open(struct inode *. struct file *);。
标签: driver linux-device-driver kernel-module