需要了解的设备文件三大结构:inode,file,file_operations

网友投稿 276 2022-11-24

需要了解的设备文件三大结构:inode,file,file_operations

struct inode

这里面与本文相关的成员主要有:

struct inode --602-->i_mode表示访问权限控制 --604-->UID --605-->GID --606-->i_flags文件系统标志 --630-->硬链接数计数 --635-->i_size以字节为单位的文件大小 --636-->最后access时间 --637-->最后modify时间 --638-->最后change时间 --669-->i_dentry; //目录项链表 --673-->i_count引用计数,当引用计数变为0时,会释放inode实例 --675-->i_writecount写者计数 --679-->创建设备文件的时候i_fops填充的是def_chr_fops,blk_blk_fops,def_fifo_fops,bad_sock_fops之一,参见创建过程中调用的init_special_inode() --683-->特殊文件类型的union,pipe,cdev,blk.link etc,i_cdev表示这个inode属于一个字符设备文件,本文中创建设备文件的时候会把与之相关的设备号的驱动对象cdev拿来填充 --702-->inode的私有数据

上面的几个成员只有struct def_chr_fops 值得一追,后面有大用:

//fs/char_dev.c429 const struct file_operations def_chr_fops = { 430 .open = chrdev_open,431 .llseek = noop_llseek,432 };

struct file

Linux内核会为每一个进程维护一个文件描述符表,这个表其实就是struct file[]的索引。open()的过程其实就是根据传入的路径填充好一个file结构并将其赋值到数组中并返回其索引。下面是file的主要内容

struct file --882-->f_path里存储的是open传入的路径,VFS就是根据这个路径逐层找到相应的inode --883-->f_inode里存储的是找到的inode --884-->f_op里存储的就是驱动提供的file_operations对象,这个对象在open的时候被填充,具体地,应用层的open通过层层搜索会调用inode.i_fops->open,即chrdev_open() --891-->f_count的作用是记录对文件对象的引用计数,也即当前有多少个使用CLONE_FILES标志克隆的进程在使用该文件。典型的应用是在POSIX线程中。就像在内核中普通的引用计数模块一样,最后一个进程调用put_files_struct()来释放文件描述符。 --892-->f_flags当打开文件时指定的标志,对应系统调用open的int flags,比如驱动程序为了支持非阻塞型操作需要检查这个标志是否有O_NONBLOCK。 --893-->f_mode;对文件的读写模式,对应系统调用open的mod_t mode参数,比如O_RDWR。如果驱动程序需要这个值,可以直接读取这个字段。 --905-->private_data表示file结构的私有数据

我在Linux设备管理(二)_从cdev_add说起一文中已经分析过chrdev_open(),这里仅作概述。

可以看出,这个函数有三个任务(划重点!!!):

chrdev_open() --352-389-->利用container_of等根据inode中的成员找到相应的cdev --390-->用cdev.fops替换filp->f_op,即填充了一个空的struct file的f_op成员。 --392-->回调替换之后的filp->f_op->open,由于替换,这个其实就是cdev.fops

至此,我们知道了我们写的驱动中的open()在何时会被回调,这样我们就可以实现很多有意思的功能,比如, 我们可以在open中通过inode->cdev来识别具体的设备,并将其私有数据隐藏到file结构的private_data中,进而识别同一个驱动操作一类设备; 我们也可以在回调cdev.fops->open()阶段重新填充file结构的fop,进而实现同一个驱动操作不同的设备,这种思想就是内核驱动中常用的分层! 最后总结一下这些结构之间的关系:

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【该来的,终究还是来了】解析苹果IDFA新规:精准营销失灵,行业割裂,玩家该何去何从?
下一篇:USB Type-C 能达到以往任何 USB 版本更大功率
相关文章

 发表评论

暂时没有评论,来抢沙发吧~