Linux 内核源码分析---块设备

news2024/9/28 1:50:20

磁盘(disk)是指利用磁记录技术存储数据的存储器。
磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。

块设备(block device)
是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,它使用缓冲区来存放暂时的数据,满足条件,从缓存一次性写入设备或者从设备一次性读到缓冲区。如磁盘、SD卡都是常见的块设备。

a、扇区:硬盘的基本访问单位,扇区的大小一般是 512B
b、:由Linux制定对内核或文件系统等数据处理的基本单位。通常,1个块由1个或多个扇区组成
c、:主要为了做 scatter/gather DMA 操作使用,同一个物理页面中的在硬盘存储介质上连续的多个块组成一个段;
d、文件块:大小定义和文件系统块一样;只是相对于文件的一个偏移逻辑块,需要通过具体文件系统中的此文件对应的 inode 所记录的间接块信息,换算成对应的文件系统块;此做法是为了将一个文件的内容存于硬盘的不同位置,以提高访问速度;即一个文件的内容在硬盘是一般是不连续的;EXT2中,ext2_get_block() 完成文件块到文件系统块的映射。

块设备驱动是基于扇区(sector)来访问底层物理磁盘,基于块(block)来访问上层文件系统。

在这里插入图片描述
在这里插入图片描述

块设备驱动是以何种方式对块设备进行访问的?
在Linux中,驱动对块设备的输入或输出( I/O )操作,都会向块设备发出一个请求,在驱动中用 request 结构体描述。但对于一些磁盘设备而言请求的速度很慢,这时候内核就提供一种队列的机制把这些 I/O 请求添加到队列中(即:请求队列),在驱动中用 request_queue 结构体描述。
在向块设备提交这些请求前内核会先执行请求的合并和排序预操作,以提高访问的效率,然后再由内核中的 I/O 调度程序子系统来负责提交 I/O 请求,I/O 调度程序将磁盘资源分配给系统中所有挂起的块 I/O 请求,其工作是管理块设备的请求队列,决定队列中的请求的排列顺序以及什么时候派发请求。

由通用块层(Generic Block Layer)负责维持一个I/O请求在上层文件系统与底层物理磁盘之间的关系。在通用块层中,通常用一个 bio 结构体来对应一个I/O请求。

Linux 提供了一个 gendisk 数据结构体,用来表示一个独立的磁盘设备或分区,用于对底层物理磁盘进行访问。在gendisk中有一个类似字符设备中file_operations的硬件操作结构指针,是block_device_operations结构体。

当多个请求提交给块设备时,执行效率依赖于请求的顺序。如果所有的请求是同一个方向(如:写数据),执行效率是最大的

内核在调用块设备驱动程序例程处理请求之前,先收集I/O请求并将请求排序,然后,将连续扇区操作的多个请求进行合并以提高执行效率(内核算法会自己做,不用你管),对I/O请求排序的算法称为电梯算法(elevator algorithm)。电梯算法在I/O调度层完成。内核提供了不同类型的电梯算法,电梯算法有
(1)noop(实现简单的FIFO,基本的直接合并与排序),
(2)anticipatory(延迟I/O请求,进行临界区的优化排序),
(3)Deadline(针对anticipatory缺点进行改善,降低延迟时间),
(4)Cfq(均匀分配I/O带宽,公平机制)
其实IO调度层(包括请求合并排序算法)是不需要用户管的,内核已经做好。

块设备I/O操作

  • 块设备只能以为单位接收输入和返回输出,而字符设备则以字节为单位
  • 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设备无需缓冲且被直接读写。对于存储设备而言,调整读写的顺序作用巨大,因为在读写连续的扇区的存储速度比分离的扇区更快。
  • 字符设备只能被顺序读写,而块设备可以随机访问

块设备

block_device 是伪文件系统 bdevfs 中对块设备或设备分区抽象,它唯一对应于一个设备号(对分区来讲、主设备号相同,次设备号不同)

如果该结构代表一个分区,则其成员 bd_part 指向设备的分区结构。如果该结构代表设备,则其成员bd_disk 指向设备的通用硬盘结构 gendisk。

当用户打开块设备文件时,内核创建结构 block_device 实例,设备驱动程序还将创建结构gendisk 实例,分配请求队列并注册结构 block_device 实例。
在这里插入图片描述

通用磁盘

gendisk,对通用磁盘的描述,与真正的底层物理设备相关联。
结构体 gendisk 代表了一个通用硬盘(generic hard disk)对象,它存储了一个硬盘的信息,包括请求队列、分区链表和块设备操作函数集等。块设备驱动程序分配结构 gendisk 实例,装载分区表,分配请求队列并填充结构的其他域。

支持分区的块驱动程序必须包含 <linux/genhd.h> 头文件,并声明一个结构 gendisk,内核还维护该结构实例的一个全局链表 gendisk_head,通过函数a dd_gendisk、del_gendisk 和get_gendisk 维护该链表。

在这里插入图片描述

磁盘分区

如果将一个磁盘分成了几个分区,那么其分区表保存在hd_struct结构的数组中,该数组的地址存放在 gendisk 对象的 part 字段中。通过磁盘内分区的相对索引对该数组进行索引。
在这里插入图片描述

块设备操作集合

block_device_operations 中没有实际读或写数据的函数。在块 I/O 子系统,这些操作由请求函数处理。
在这里插入图片描述

Linux内核之块设备驱动(超级详细~)
【驱动】块设备驱动(二)-通用块层

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

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

相关文章

LeetCode Hot100实战之双指针

公众号&#xff1a;自学编程村&#xff0c;回复“书籍”&#xff0c;领取1000多本计算机书籍。涵盖语言语法、数据结构算法、AI相关书籍、开发相关等等各种书籍&#xff0c;应有尽有&#xff0c;你总会用到。 回复“C语言”&#xff0c;领取原创C语言九讲PDF教程&#xff08;数…

功能实现——通过阿里云 OSS 实现文件管理

目录 1.需求分析2.阿里云 OSS 开通与配置2.1.登录阿里云官网2.2.搜索 OSS 服务并开通2.3.OSS 配置 3.在项目使用阿里云 OSS3.1.项目环境搭建3.2.代码实现3.2.1.将本地文件上传到阿里云 OSS3.2.2.将前端传入的文件上传到阿里云 OSS3.2.3.下载文件到本地2.3.4.流式下载3.2.4.OSSC…

携程酒店、景点、评论数据采集,testab动态js加密参数处理不补js环境不纯算

携程平台的酒店、景点、评价数据还是比较有意义的&#xff0c;可用作数据分析研究&#xff0c;目前均可采集。酒店价格需要登录采集&#xff0c;其他店名、地址、经纬度、评分、评价数、特色标签等都可以直接采集。 携程酒店数据示例&#xff1a; 酒店id&#xff1a;536424 …

免费【2024】springboot 大学生在线论坛系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

常用配置文件 .ini、.config、 json、xml

ini Initialization INI文件格式是某些平台或软件上的配置文件的非正式标准&#xff0c;以节(section)和键值对(key-val)构成&#xff0c;常用于微软Windows操作系统中。 这种配置文件的文件扩展名多为INI 》》INI文件不支持数据类型&#xff0c;所有的键值对都是字符串类型…

[SQLSERVER][SQL]数据库备份任务异常

SQL备份异常出现如下错误&#xff1a; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 执行查询“BACKUP DATABASE [ReportServerTempDB] TO DISK N...”失败&#xff0c; 错误如下:“无法打开备份设备 E:\\sqldatabackup19\\Report_ba…

nose2,一个无敌的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个无敌的 Python 库 - nose2。 Github地址&#xff1a;https://github.com/nose-devs/nose2 在软件开发过程中&#xff0c;自动化测试是保证代码质量的重要环节。Python 提供…

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…

非线性磁链观测器

前面已经介绍了龙伯格观测器、滑膜观测器&#xff1a;龙伯格观测器&#xff08;又称状态观测器&#xff09;、滑膜观测器-CSDN博客 滑膜观测器和龙伯格观测器都是没法实现电机的超低速运转、0速启动、超高速的正反方向的运行。龙伯格观测器是可以实现这些功能&#xff0c;但是…

Resolving Maven dependencies

Maven是一种项目管理和构建工具&#xff0c;通常用于Java项目。这个过程包括下载项目所需的所有外部库和插件&#xff0c;并将它们添加到项目的构建路径中。具体来说&#xff0c;它正在处理名为“AAS_byBasyx”的项目或模块的依赖项。这种任务通常在你打开一个新的Maven项目或更…

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录&#xff1a; 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…

​JavaWeb入门——Servlet(二)

目录 HttpServletRequest 简介 常见API HttpServletResponse 简介 常见API 请求转发和响应重定向 概述 请求转发 响应重定向 cookie&session 会话 会话跟踪方案&#xff1a; 会话跟踪方案对比&#xff1a; 1、Cookie 2、Session&#xff08;底层基于Cookie…

RocketMQ5.0消费者

RocketMQ 5.0 提供了三种主要的消费者类型&#xff1a;PushConsumer、SimpleConsumer 和 PullConsumer。每种类型的消费者都有其特定的使用场景和特点。以下是对这三种消费者的概念及其区别的详细阐述&#xff1a; PushConsumer 概念&#xff1a; PushConsumer 是一种主动推送…

Python time模块5大隐藏特性

特性一&#xff1a;结构化时间——struct_time 简介&#xff1a; struct_time是time模块中的一个数据类型&#xff0c;用于存储一个时间的各个组成部分&#xff08;年、月、日、时、分、秒等&#xff09;。它常用于解析和格式化时间。 代码示例&#xff1a; import time # …

GA4(Google Analytics 4 )升级指南丨出海笔记

Google Analytics 4 是与之前的Universal Analytics/GA3完全不同的全新版本&#xff0c;2023下半年(7月后)会全面替换UA。 本篇指南将会展示如何安装和使用 Google Analytics 4 (GA4), 以便大家更好的迁移并使用新平台。相比GA3, GA4绝对是好东西&#xff0c;这次的内容比较硬核…

Linux基于centOS7【内存与OS的随谈】,进程初学【PCB】【fork】【进程排队】

冯诺依曼体系结构——存储器 存储器主要指的是内存&#xff0c;它有个特点就是掉电易失 磁盘等其它输入和输出设备 为什么要在计算机体系结构中要存在内存 我们知道&#xff0c;CPU的处理速度很快很快&#xff0c;但输入设备&#xff0c;以及输出设备&#xff0c;是相对很慢的…

C#对Sqllite操作

前言 数据库的操作也是程序设计中的家常便饭了&#xff0c;关系型数据库中Sqlite3是非常轻量级别的&#xff0c;所以这个数据在小型应用程序的设计中占用很高的比重。当然我这里描述的是1.0版本&#xff0c;也是最原始的方案&#xff0c;大型应用开发中一般选择EF进行桥接&…

信息学奥赛初赛天天练-54-CSP-J2019阅读程序3-二叉树、满二叉树、单侧二叉树、二分查找、递归、等差数列求和

PDF文档公众号回复关键字:20240803 2019 CSP-J 阅读程序3 1阅读程序(程序输入不超过数组或字符串定义的范围&#xff1b;判断题正确填 √&#xff0c;错误填 。除特殊说明外&#xff0c;判断题 1.5 分&#xff0c;选择题 3 分&#xff0c;共计 40 分) 01 #include <iostre…

idea项目创建提交到gitee gitee创建仓库 gitee删除仓库(全网最新最详细)

一、gitee创建仓库 1.如下图 2.创建好后如下图 3.打开idea创建好项目 3.1点击终端 3.2 从gitee页面复制命令进行运行 具体步骤如下图&#xff1a; 在步骤5时可能会提醒你远程仓库没有main分支&#xff0c;这个时候需要执行下图中的命令4创建一个远程main分支 结果运行如下图…

GATK ReferenceDataSource接口介绍

在 GATK(Genome Analysis Toolkit)库中,ReferenceDataSource 接口是一个重要的接口,用于表示与参考基因组相关的数据源。它提供了一种标准化的方式来访问和操作参考基因组的不同来源的数据。ReferenceMemorySource 类和ReferenceFileSource 类是ReferenceDataSource接口的实…