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

news2024/9/20 18:48:22

文件系统关联

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

inode 中设备文件的成员数据

虚拟文件系统每个文件都关联到一个 inode,用于管理文件的属性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

唯一地标识与一个设备文件关联的设备,内核在 i_mode 中存储文件类型(面向块,面向字符)而且在 i_rdev 中存储主从设备号。主从设备号在内核中合并为一种变量类型为 dev_t

在内核开发当中认为必要的时候会进行修改,只应该使用两个函数imajoriminor来从i_rdev提取主设备早和从设备号,这两个函数都只需要一个指向inode实例的指针作为参数。

const struct file_operations *i_fop;是一组函数指针的集合,包括许多文件操作(打开、读取、写入等等),这些由虚拟文件系统使用来处理块设备。内核会根据inode表示块设备还是字符设备,使用i_bdevi_cdev指向更具体的信息。

实际上,inode是VFS使用的一个对象,用于存放内核在操作文件或目录时所需要的全部信息。索引节点有两种:一种是 VFS 索引节点,存在内存中;另一种具体文件系统的索引节点,存在磁盘当中,使用时将其读入内存填充VFS的索引节点,之后对 VFS 索引节点的任何修改都将写回磁盘更磁盘的索引节点。

标准文件操作

在打开一个设备文件时,各种文件系统的实现基本都会调用init_special_inode函数,为块设备或字符设备创建一个 inode
通过mode参数传递进来的设备类型之外,底层文件系统还必须返回主从设备号。代码中会根据设备类型,向 inode 提供不同的文件操作。
在这里插入图片描述

块设备标准操作

与字符设备相比,块设备操作的指针会集中到一个叫作blk_fops通用的结构体。
在这里插入图片描述
读写操作由通用的内核例程进行完成,内核中缓存自动用于块设备。
file_operationsblock_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字符设备驱动

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

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

相关文章

RIP、OSPF 协议详解 / Stub/Totally Stub/NSSA/Totally NSSA 区域测试

注:原出处 https://javaforall.cn/204275.html 图片已挂。下文来自 腾讯云 全栈君 RIP、OSPF 协议详解 1、路由协议简介 在互联网中,一个自治系统 (AS) 是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。这个网络单位可以是一个简单的网络…

我们如何提高 Baklib 的 SEO 性能

搜索引擎已经成为我们日常生活中不可或缺的一部分;谷歌甚至成为英语中的动词。因此,每个企业都需要关注其搜索引擎排名。在 Baklib,我们最近遇到了 SEO 排名的挑战。因此,在我们讨论这个问题之前,让我们先了解一下爬行…

宠物空气净化器可以除毛吗?室内浮毛空气净化器推荐

家里养了5只猫,满天飞的猫毛发,随风飘到各个角落,可以说苦不堪言。真的不建议养猫,除非你能接受空气中飞舞着浮毛,衣服、床、筷子、鼻子里全都是猫毛,拉臭臭有异味等等。感觉到处都被猫毛覆盖了&#xff0c…

【多线程】线程状态与并发三大特性的细节剖析

这篇文章主要用于对于多线程的一些查缺补漏。 一、 线程的状态 1,操作系统层面,线程的5种状态 关于线程有几种状态,有多种说法,5、6、7都有。 首先对于操作系统来说,只有5种状态,状态如下新建&#xff…

mac|安装hashcat(压缩包密码p解)

一、安装Macports(如果有brew就不用这一步) 根据官网文档:The MacPorts Project -- Download & Installation,安装步骤如下 1、下载MacPorts,这里我用的是tar.gz ,可以通过keka(keka安装在…

《pygame游戏开发实战指南》第三节 理解pygame中的坐标体系

pygame中的坐标体系非常的简单,其实就是一句话:任何对象的左上角都为坐标原点(0, 0),向右为X轴正方向,向下为Y轴正方向。如下图所示。本节主要通过一些示例来带大家理解这一句话。如果读者已经理解的话,可以直接跳过这…

iPhone不下载APP直接投屏到电脑,这些投影设置你会用吗【电脑投影设置需添加】

最近小编一直在追唐朝诡事录之西行,太好看了,就是手机屏幕有点小,虽然也可以在电脑上看,但是小编心血来潮想投屏到此电脑看看,因此就写了这篇文章。 ①首先打开电脑的设置,打开系统 ②左侧栏中找到投影到此…

学习Java的日子 Day63 文件上传,文件下载,上传头像案例

文件上传下载 1.文件上传 文件上传的应用 比如个人信息的管理,上传头像 比如商品信息的管理,上传商品的图片 这些都需要通过浏览器客户端将图片上传到服务器的磁盘上 2.文件上传原理 所谓的文件上传就是服务器端通过request对象获取输入流,将…

VMware安装Centos虚拟机使用NAT模式无法上网问题处理

NAT模式无法上网问题处理 Centos7与Ubuntu使用同一个NAT网络,Ubuntu正常访问互联网,Centos无法正常访问。 处理方案: cd /etc/sysconfig/network-scripts vi ifcfg-ens33 修改配置项: 重启网络: service network resta…

vue的nextTick是下一次事件循环吗

如题,nextTick的回调是在下一次事件循环被执行的吗? 是不是下一次事件循环取决于nextTick的实现,如果是用的微任务,那么就是本次事件循环;否则如果用的是宏任务,那么就是下一次事件循环。 我们看下Vue3中…

STM32L051K8U6-开发资料

STM32L051测试 (四、Flash和EEPROM的读写)-云社区-华为云 (huaweicloud.com) STM32L051测试 (四、Flash和EEPROM的读写) - 掘金 (juejin.cn) STM32L0 系列 EEPROM 读写,程序卡死?_stm32l0片内eeprom_stm3…

Android studio配置代码模版

一、背景: 在工作中,总是要写一些重复的代码,特别是项目有相关规范时,就会产生很多模版代码,每次要么复制一份,要么重新写一份新的,很麻烦,于是我就在想,能不能像创建一…

tomato靶场

扫描网址端口 访问一下8888 我们用kali扫描一下目录 访问这个目录 产看iofo.php源码,发现里面有文件包含漏洞 访问/etc/passwd/发现确实有文件包含漏洞 远程连接2211端口 利用报错,向日志文件注入木马,利用文件包含漏洞访问日志文件 http:/…

现代前端架构介绍(第二部分):如何将功能架构分为三层

远离JavaScript疲劳和框架大战,了解真正重要的东西 在这个系列的前一部分 《App是如何由不同的构建块构成的》中,我们揭示了现代Web应用是由不同的构建块组成的,每个构建块都承担着特定的角色,如核心、功能等。在这篇文章中&#…

手机市场回暖,为何OPPO却“遇冷”?

在智能手机这片红海中,OPPO曾以其独特的营销策略和创新的产品设计,一度占据国内市场的领先地位。然而,近期的数据却揭示了OPPO正面临前所未有的挑战,销量下滑、库存高企,昔日的辉煌似乎已成过眼云烟。 当整个手机市场逐…

单个或两个及以上java安装与环境变量配置

目录 java下载地址: 1.安装java 1.1 安装程序 1.2选择安装路径 1.3等待安装 2.首先,进入环境变量 2.1 找到设置(第一个win11,第二个win10) 2.2 进入到系统高级系统设置(第一个win11,第二…

快捷生成vue模板插件

Vetur < 就可以选择快捷键

Java多线程实现的两种方式

Java多线程实现的两种方式 1. 继承Thread类2. 实现Runnable接口3.总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1. 继承Thread类 直接继承java.lang.Thread类&#xff0c;并重写其run方法。这种方式简单直接&#xff0c;但限制了类…

Python3接口测试框架的整体布局与设计

实战项目整体布局概览 本实战项目基本的层级结构如下&#xff1a; 习惯性的命名规则&#xff0c;把所有的辅助类py文件放在commonsrc这个包里面&#xff0c;如数据库配置封装文件、接口配置封装文件等&#xff1b;辅助类py文件在整个项目中初期代码写好后一般是不会去大范围修…

Character.AI的联合创始人Noam Shazeer将加入谷歌;又一个开源平替llamacoder;和mem0一样的动态记忆框架

✨ 1: Character.AI 创始人回归google Character.AI的联合创始人Noam Shazeer将加入谷歌 Character.AI的联合创始人Noam Shazeer和Daniel De Freitas离开公司&#xff0c;重新加入Google旗下的DeepMind研究团队。Google签署了一项非独占性协议&#xff0c;使用Character.AI的…