【问题标题】:When is an inode's file_operations linked to its character device file_operations?inode 的 file_operations 何时链接到它的字符设备 file_operations?
【发布时间】:2023-02-03 22:14:05
【问题描述】:
我正在阅读 LDD3,我想了解在执行系统调用时如何调用设备驱动程序文件操作。
根据我的理解,当执行开放系统调用时,struct file *filp 会从 inode 的 i_fop 中获取其 f_op 属性。
但是 inode 什么时候/在哪里得到它的 i_fop 属性填充 cdev 的 ops 属性?
我的直觉是,当我们在驱动程序中调用cdev_add时,我们的设备被添加到带有 MAJOR 和 MINOR 编号的cdev_map,但是 inode 还没有链接到字符设备。仅当调用 mknod 以在 /dev 目录中创建设备文件或通过系统调用打开设备文件时,才会链接 inode。
【问题讨论】:
标签:
linux-kernel
linux-device-driver
【解决方案1】:
struct inode的i_fop成员被init_special_inode()函数(在“fs/inode.c”中)设置为&def_chr_fops(在“fs/char_dev.c”中)用于字符特殊文件。它由底层文件系统调用(例如,当它在安装时填充其目录结构和索引节点时,或者当mknod() 在文件系统中创建新的字符特殊文件时。
打开文件时,struct inode的i_fop被vfs_open()函数调用的do_dentry_open()函数复制到struct file的f_op成员(在“fs/open.c”中) . do_dentry_open() 调用open 文件操作处理程序。对于字符特殊文件,来自def_chr_fops 的open 文件操作处理程序是chrdev_open() 函数(在“fs/char_dev.c”中)。
chrdev_open()函数查找与MAJOR/MINOR设备号关联的struct cdev(如果有的话)(来自inode的i_rdev成员),将ops成员从struct cdev复制到struct file' s f_op 成员替换文件操作,如果有替换open 处理程序,则调用该处理程序。