Linux源码阅读笔记16-文件系统关联及字符设备操作

文件系统关联

设备文件都是由标准函数处理,类似普通文件。设备文件也是通过虚拟文件系统来管理的,和普通文件都是通过完全相同的接口访问的。

inode中设备文件的成员数据

  • 虚拟文件系统每个文件都关联到一个inode,用于管理文件的属性。源码如下:

  • 唯一地标识与一个设备文件关联的设备,内核在i_mode中存储文件类型(面向块,面向字符),而且在i_rdev中存储主从设备号。主从设备号在内核中合并为一种变量类型为dev*_t
  • 在内核开发当中认为必要的时候会进行修改,只应该使用两个函数imajoriminor来从i_rdev提取主设备号和从设备号,这两个函数都只需要一个指向inode实例的指针作为参数。
  • const struct file_operations* i_fop是一组函数指针的集合,包括许多文件操作(打开,读取,写入等等),这些由虚拟文件系统使用来处理块设备。内核会根据inode表示块设备还是字符设备,使用i_bdevi_cdev指向更具体的信息。
  • 实际上,inodeVFS使用的一个现象,用于存放内核在操作文件或目录时所需要的全部信息。索引节点有两种:一种是VFS节点,存在内核中;另一种具体文件系统的索引节点,存在磁盘当中,使用时将其读入内存填充VFS节点,之后对VFS索引节点的任何修改都将写回磁盘和磁盘的索引节点。

标准文件操作

在打开一个设备文件时,各种文件系统的实现基本都会调用init_special_inode函数,为块设备或字符设备创建一个inode。具体源码如下:

void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
{inode->i_mode = mode;if (S_ISCHR(mode)) {inode->i_fop = &def_chr_fops;inode->i_rdev = rdev;} else if (S_ISBLK(mode)) {inode->i_fop = &def_blk_fops;inode->i_rdev = rdev;} else if (S_ISFIFO(mode))inode->i_fop = &pipefifo_fops;else if (S_ISSOCK(mode));	/* leave it no_open_fops */elseprintk(KERN_DEBUG "init_special_inode: bogus i_mode (%o) for"" inode %s:%lu\n", mode, inode->i_sb->s_id,inode->i_ino);
}
EXPORT_SYMBOL(init_special_inode);
  • 除了通过mode传递进来的设备类型之外,底层文件系统还必须返回主从设备号。代码中会根据设备类型,向inode提供不同的文件操作。

字符设备标准操作

每个设备文件都需要一组独立、自定义操作。具体源码如下:

/** Dummy default file-operations: the only thing this does* is contain the open that then fills in the correct operations* depending on the special file...*/
const struct file_operations def_chr_fops = {.open = chrdev_open,.llseek = noop_llseek,
};

块设备标准操作

与自负设备相比,块设备操作的指针会集中到一个叫做blk_fops通用的结构体。具体源码如下:

const struct file_operations def_blk_fops = {.open		= blkdev_open,.release	= blkdev_close,.llseek		= block_llseek,.read_iter	= blkdev_read_iter,.write_iter	= blkdev_write_iter,.iopoll		= blkdev_iopoll,.mmap		= generic_file_mmap,.fsync		= blkdev_fsync,.unlocked_ioctl	= block_ioctl,
#ifdef CONFIG_COMPAT.compat_ioctl	= compat_blkdev_ioctl,
#endif.splice_read	= generic_file_splice_read,.splice_write	= iter_file_splice_write,.fallocate	= blkdev_fallocate,
};

字符设备操作

前面说到过,字符设备是由struct cdev表示,同时内核维护一个数据库,包括所有活动的cdev实例。

表示字符设备具体源码如下

打开设备文件

通过chrdev_open打开字符设备的通用函数。具体源码如下:

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

  • 获得对应设备的cdev实例,内核通过cdev->ops还可以访问特定于设备的file_operations。接下来我们就设备的各种数据结构之间的关联关系如下图所示:

读写操作

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Go - context 速览,场景与用法】

作用 context字面意思上下文,用于关联管理上下文,具体有如下几个作用 取消信号传递:可以用来传递取消信号,让一个正在执行的函数知道它应该提前终止。超时控制:可以设定一个超时时间,自动取消超过执行时间…

Swift学习入门,新手小白看过来

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。 😊 座右铭:不…

文本分类动转静预测错误分析和挖掘稀疏数据和建立新数据集.ipynb

import os import paddle from paddlenlp.transformers import AutoModelForSequenceClassification params_pathcheckpoint/text_classes/ output_pathoutput/text_class model AutoModelForSequenceClassification.from_pretrained(params_path) model.eval() # 转换为具…

(十三)Spring教程——依赖注入之工厂方法注入

1.工厂方法注入 工厂方法是在应用中被经常使用的设计模式,它也是控制反转和单例设计思想的主要实现方法。由于Spring IoC容器以框架的方式提供工厂方法的功能,并以透明的方式开放给开发者,所以很少需要手工编写基于工厂方法的类。正是因为工厂…

如何从网站获取表格数据

1.手动复制粘贴 最简单的方法是直接在网页上手动选择表格内容,然后复制粘贴到Excel或其他表格处理软件中。这种方法适用于表格较小且不经常更新的情况。 2.使用浏览器插件 有许多浏览器插件可以帮助从网页中提取表格数据,例如: -TableCapt…

SSRF过滤攻击

SSRF绕过: 靶场地址:重庆橙子科技SSRF靶场 这个是毫无过滤的直接读取,但是一般网站会设置有对SSRF的过滤,比如将IP地址过滤。 下面是常用的绕过方式: 1.环回地址绕过 http://127.0.0.1/flag.php http://017700…

相机怎么选(不推荐,只分析)

title: 相机怎么选 tags: [相机, 单反相机] categories: [其他, 相机] 最近准备购买,相机怎么选,我去搜索了许多文章,整理了一篇小白挑选技术篇,供大家参考。 分类 胶片相机 需要装入胶卷才能使用的相机,拍照后可直…

永磁同步电机无速度算法--非线性磁链观测器

非线性磁链观测器顾名思义观测器的状态变量为磁链值,观测的磁链值收敛于电机实际磁链值,观测器收敛。非线性是由于观测器存在sin和cos项,所以是非线性观测器 一、原理介绍 表贴式永磁同步电机αβ轴电压方程: 将公式变换 定义状态变量X: 定…

easy-ui nowrap

​​easy-ui​​ 是一个基于 jQuery 的前端框架,用于构建现代化的 Web 应用程序。它提供了丰富的组件和功能,简化了 Web 应用的开发。 ​​nowrap​​ 是 ​​easy-ui​​ 中的一个属性,用于控制表格列(或其他容器)中…

大模型日报 2024-07-28

大模型日报 2024-07-28 大模型资讯 Meta发布全球最大最强的开源AI模型Llama 3.1 摘要: Meta公司宣布其最新的开源AI模型Llama 3.1具备最先进的能力,被称为全球最大和最强的AI模型。 阿里巴巴和腾讯迅速整合Meta的Llama 3.1 AI模型 摘要: 阿里巴巴和腾讯迅速将Meta的…

什么是数据挖掘?为什么要进行数据挖掘?

数据挖掘可以表达为“从数据中挖掘知识”,或者“知识提取”,亦或是“数据/模式分析”等。 也有一些人把之称为“数据中的知识发现(KDD)”。 我们写论文时很常用的一句开头语就时“随着信息时代的发展”,其实&#xff…

Milvus 向量数据库进阶系列丨部署形态选型

本系列文章介绍 在和社区小伙伴们交流的过程中,我们发现大家最关心的问题从来不是某个具体的功能如何使用,而是面对一个具体的实战场景时,如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

Java实现打印功能

JPG图片文件格式打印实现 打印JPG图片格式的文件,本次采用的Java原生的打印方式。 public static void main(String[] argv) throws Exception {File file new File("E:\\a.jpg");String printerName "HP MFP M436 PCL6";//打印机名包含字串…

kafka 首选读副本

一、kafka 首选读副本是哪个版本开始加入的?作用是什么 Kafka的首选读副本(Preferred Read Replica)功能是在2.4版本中引入的。这个功能的主要作用是允许客户端从指定的副本而不是分区的领导者(Leader)读取数据&#…

vite+vue3项目,开发时候正常,打包后router-view不渲染

这是个很奇怪的问题,但是基本上命名或者引入文件的方式导致的。要么文件名与系统的某些标签名一样,要么就是routes写成了routers。还有一种就是导入方式错误的 错误截图: 正确引入截图:

Flink大状态作业调优——DataStream篇

一、Flink 状态(State)简介 在流式计算中有些操作一次处理一个独立的事件(比如解析一个事件), 有些操作却需要记住多个事件的信息(比如窗口操作)。那些需要记住多个事件信息的操作就是有状态的。流式计算分为无状态计算和有状态计算两种情况。状态可以理…

Word题库转Excel关键字快速查询题库

一、前言 内部培训会有Word版本题库,考核时如果使用Word、Excel、PDF等文档进行关键字查询题目体验不佳。so,撸个软件吧!   20240728更新:支持更多题库类型。 二、Word题库转Excel 1、Word题库格式要求 内容格式要求事例题目…

在 Postman 中设置全局 token

目录 问题描述解决方案 问题描述 在使用 Postman 进行接口测试时,经常会遇到在 Header 中添加 token 的情况。当接口数量较多时,需要为每个接口进行设置,而且当 token 失效时需要重新获取并设置,这样一来效率较低。 解决方案 下…

【开发学习笔记】什么是Springboot?

Spring Boot是由Pivotal团队提供的基于Spring的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。Spring Boot通过特定的配置方式,减少了开发人员需要定义的样板化配置,从而提高了开发效率。以下是对Spring Boot的详细解释…

wpf中开发独立模块功能和左侧1个菜单的框架演示

此篇文章适用于有一定经验的wpf开发者,并且是团队协作开发模式,并且业务与此比较相近的话,用起来非常的方便。 我们在开发wpf程序的时候,比如1,2个人,那肯定随便怎么开发,都没事,代码…