道家人 发表于 2024-8-3 19:47:01

Linux 内核源码分析---文件体系关联与字符装备操作

文件体系关联

装备文件都是由标准函数处理,类似于平凡文件。装备文件也是通过虚拟文件体系来管理的,宁静凡文件都是通过完全相同的接口访问。
inode 中装备文件的成员数据

虚拟文件体系每个文件都关联到一个 inode,用于管理文件的属性。
https://i-blog.csdnimg.cn/direct/b91ecf83536a4c44807de32cca4d4421.png
https://i-blog.csdnimg.cn/direct/b0c4e4d8244f4dd9b5388c5ff0c9a090.png
https://i-blog.csdnimg.cn/direct/c07e6cbc79bd42db937cdc923af7f0ee.png
唯一地标识与一个装备文件关联的装备,内核在 i_mode 中存储文件范例(面向块,面向字符)而且在 i_rdev 中存储主从装备号。主从装备号在内核中归并为一种变量范例为 dev_t。
在内核开发当中以为必要的时候会进行修改,只应该使用两个函数imajor和iminor来从i_rdev提取主装备早和从装备号,这两个函数都只必要一个指向inode实例的指针作为参数。
const struct file_operations *i_fop;是一组函数指针的聚集,包括很多文件操作(打开、读取、写入等等),这些由虚拟文件体系使用来处理块装备。内核会根据inode表现块装备还是字符装备,使用i_bdev或i_cdev指向更详细的信息。
实际上,inode是VFS使用的一个对象,用于存放内核在操作文件或目录时所必要的全部信息。索引节点有两种:一种是 VFS 索引节点,存在内存中;另一种详细文件体系的索引节点,存在磁盘当中,使用时将其读入内存填充VFS的索引节点,之后对 VFS 索引节点的任何修改都将写回磁盘更磁盘的索引节点。
标准文件操作

在打开一个装备文件时,各种文件体系的实现根本都会调用init_special_inode函数,为块装备或字符装备创建一个 inode。
通过mode参数传递进来的装备范例之外,底层文件体系还必须返回主从装备号。代码中会根据装备范例,向 inode 提供差别的文件操作。
https://i-blog.csdnimg.cn/direct/14037df8ab3942a0b35cdd8cec9c84c7.png
块装备标准操作

与字符装备相比,块装备操作的指针会集中到一个叫作blk_fops通用的结构体。
https://i-blog.csdnimg.cn/direct/d6e2416af3fc431fac774ef3a227ab5a.png
读写操作由通用的内核例程进行完成,内核中缓存自动用于块装备。
file_operations和block_device_operations结构体范例比较类似。file_operations由 VFS 层用来与用户空间通讯,其中的例程会调用 block_device_operations 中的函数,以实现跟块装备进行通讯。block_device_operations 必须针对各种块装备分别实现,对装备的属性加以抽象,而在此根本上建立的file_operations,使它同样的操作即可处理所有的块装备。
字符装备标准操作

每个装备文件都必要一组独立、自界说操作。
https://i-blog.csdnimg.cn/direct/9c750155fc6b42b7b57b1d98a3194d28.png
字符装备操作

字符装备是由struct cdev表现,同时内核维护一个数据库,包括所有活动的cdev实例。
https://i-blog.csdnimg.cn/direct/6d2dd572943d4cd7aaca639a51026d36.png
打开装备文件

通过 chrdev_open 打开字符装备的通用函数。
https://i-blog.csdnimg.cn/direct/34dc4c7c81724485a82a7edb303f44e4.png
https://i-blog.csdnimg.cn/direct/b31b404d2eaf4de3a3b7a774f599e8f2.png
假设表现装备文件的 inode 没有被打开过,根据给出的装备编号,kobject_lookup 查询字符装备的数据库,并返回与该驱动程序关联的kobject实例,该返回值可用于获取cdev实例。
https://i-blog.csdnimg.cn/direct/666c8f54fd024c73bb5c7d9d4ae7cd3f.png
得到对应于装备的cdev实例,内核通过 cdev->ops 还可以访问特定于装备的file_operations。
装备各种数据结构之间的关联关系如图:
https://i-blog.csdnimg.cn/direct/3739d9e3bf0c47ebbaf6ca612ba74270.png
读写操作

读写字符装备文件,其实虚拟文件和装备驱动程序代码之间已建立关联。调用标准库的读写操作,向内核发出一些体系调用,最终会调用 file_operations 结构中的相关操作(重点为 read 和 wirte)。只必要调用内核函数来完成操作。
https://i-blog.csdnimg.cn/direct/9ff095eb201948ca9ece4646c5d9956f.png
【一文秒懂】Linux字符装备驱动

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux 内核源码分析---文件体系关联与字符装备操作