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

打印 上一主题 下一主题

主题 576|帖子 576|积分 1728

文件体系关联

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

虚拟文件体系每个文件都关联到一个 inode,用于管理文件的属性。



唯一地标识与一个装备文件关联的装备,内核在 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 提供差别的文件操作。

块装备标准操作

与字符装备相比,块装备操作的指针会集中到一个叫作blk_fops通用的结构体。

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

每个装备文件都必要一组独立、自界说操作。

字符装备操作

字符装备是由struct cdev表现,同时内核维护一个数据库,包括所有活动的cdev实例。

打开装备文件

通过 chrdev_open 打开字符装备的通用函数。


假设表现装备文件的 inode 没有被打开过,根据给出的装备编号,kobject_lookup 查询字符装备的数据库,并返回与该驱动程序关联的kobject实例,该返回值可用于获取cdev实例。

得到对应于装备的cdev实例,内核通过 cdev->ops 还可以访问特定于装备的file_operations。
装备各种数据结构之间的关联关系如图:

读写操作

读写字符装备文件,其实虚拟文件和装备驱动程序代码之间已建立关联。调用标准库的读写操作,向内核发出一些体系调用,最终会调用 file_operations 结构中的相关操作(重点为 read 和 wirte)。只必要调用内核函数来完成操作。

【一文秒懂】Linux字符装备驱动

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

道家人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表