Linux 内核块设备

news2024/12/28 5:30:45

磁盘(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/1969691.html

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

相关文章

能交易场外个股期权标的有哪些?

目前国内的期权市场能交易场外个股期权标的有除去ST类股票外&#xff0c;一般包括沪深3000多只个股以及股票指数&#xff0c;在交易日内且个股开盘的情况下可以报价购买。不过&#xff0c;由于场外个股期权是非标准化合约&#xff0c;具体的可交易股票名单可能会根据需求有所不…

请转告HPC计算AI计算单位,选对存储事半功倍

U.2 NVMe全闪混合统一存储GS 5000U是Infortrend产品中一款高性能机型。得益于搭载强劲的第五代IntelXeon处理器&#xff0c;以及支持PCIe 5.0、NVMe-oF、100GbE等多种特点&#xff0c;GS 5000U单台块级性能可达50 GB/s的读、20 GB/s的写&#xff0c;以及1300K的IOPS&#xff1b…

数据透视表(四)

文章目录 可视化数据条与切片器串联所有的数据透视表插入数据透视图创建组合图数据的结构化展示如何设置标签 可视化数据条与切片器 插入切片器-在切片器中点击不同的筛选项让透视表与之联动 如果某一栏没有数据显示&#xff0c;点击透视表切片器工具下选项中的切片器设置&…

Java家政自营单商户系统小程序源码

​&#x1f3e0;家政新风尚&#xff1a;揭秘自营单商户系统的魅力与便捷&#xff01; &#x1f3e1;开篇&#xff1a;家政服务的新篇章 在快节奏的现代生活中&#xff0c;家政服务成为了许多家庭的必需品。而“家政自营单商户系统”的兴起&#xff0c;更是为这个行业带来了前…

C ——— 指针笔试题(最终篇)

指针加减整数和解引用的笔试题 boss题&#xff1a; char* c[] { "ENTER","NEW","POINT","FIRST" }; char** cp[] { c 3,c 2,c 1,c }; char*** cpp cp;printf("%s\n", **cpp); printf("%s\n", *-- * cpp …

Vue项目如何打包失败(图解)

目录 案例分析 打包失败 package.json 修正文件 打包测试 打包成功 案例分析 打包失败 package.json {"name": "diaryui","version": "0.0.0","private": true,"type": "module","scripts&…

树组件 el-tree 数据回显

树组件 el-tree 数据回显 树型结构的数据回显问题&#xff1a; 这里我只放了核心代码&#xff0c;主要是如何获取选中的树节点的id集合和如何根据树节点的id集合回显数据 大家根据需要自行更改&#xff01; <el-tree ref"authorityRef" node-key"id" …

springboot“智慧识堂”微信小程序-计算机毕业设计源码26647

摘 要 基于微信的“智慧识堂”是利用微信中的小程序功能来实现&#xff0c;自2011年微信诞生以来&#xff0c;微信的使用越来越普遍&#xff0c;尤其最近几年微信旗下的微信小程序因其不占内存&#xff0c;用完即走的特点吸引越来越多用户&#xff0c;使用微信小程序设计的系统…

5分钟完成视频会议私有化部署

在当今快速发展的商业环境中&#xff0c;企业迫切需要一种既高效又安全的视频会议系统以提升工作效率并确保敏感信息的安全。私有化部署会议服务器作为一种高效的数据交换与协作解决方案&#xff0c;正逐渐成为众多企业的首选。然而&#xff0c;对于那些对数据安全性和隐私保护…

基于python的百度迁徙迁入、迁出数据分析(五)

终于在第五篇文章我们进入了这个系列的正题&#xff1a;数据分析 这里我选择上海2024年5月1日——5月5日的迁入、迁出数据作为分析的基础&#xff0c;首先选择节假日的数据作为分析的原因呢&#xff0c;主要是节假日人们出行目的比较单一&#xff08;出游、探亲&#xff09;&a…

RepoAgent:基于大型语言模型的开源框架,主动生成、维护和更新代码文档

人工智能咨询培训老师叶梓 转载标明出处 开发者通常花费约58%的时间在程序理解上&#xff0c;高质量的代码文档在减少这一时间上扮演着重要角色。然而&#xff0c;维护代码文档同样消耗大量的时间、金钱和人力。为了减轻维护代码文档的负担&#xff0c;早期尝试自动文档生成的方…

【学术会议征稿】2024年环境保护与污染控制国际学术会议 (EPPC 2024)

2024年环境保护与污染控制国际学术会议 &#xff08;EPPC 2024&#xff09; 2024 International Conference on Environmental Protection and Pollution Control (EPPC 2024) 2024年环境保护与污染控制国际学术会议将于2024年11月22-24日于中国西安举行。随着全球环境问题日…

【C语言】C语言期末突击/考研--数据的输入输出

目录 一、printf()输出函数介绍 二、scanf读取标准输入 &#xff08;一&#xff09;scanf函数的原理 &#xff08;二&#xff09;多种数据类型混合输入 三、练习题 今天我们学习printf和scanf读取标准输入。下面我们开始正式的学习吧。 C语言中有很多内置函数&#xff0c;今…

【项目管理进阶】如何制定进度计划

前言 项目管理进阶系列又又又又更新了… 作为Team leader或者Project Manager&#xff0c;你们最怕什么&#xff1f;&#xff08;文末有投票&#xff0c;踊跃参加O&#xff09;~ 甲说&#xff0c;我具备多年的项目管理经验&#xff0c;秉持“兵来将挡&#xff0c;水来土掩”的…

开机WiFi没了只能宽带,连声音都有问题,服务里系统还原等一堆错误无法调试!——DHCP服务器常见的故障影响这么大?

错误呈现&#xff1a; 因为问题解决了所以就剩最开始开机直观看到的问题截图&#xff1a; 最崩溃的网络出现问题&#xff1a; 针对网络问题解决结果失败&#xff1a; 问题描述 1&#xff0c;刚开始声音有问题自以为是驱动连接或者声卡硬件有错。 2&#xff0c;后面发现输入…

DB-GPT_0.5.10安装__部署Qwen2-72b模型(Ubuntu)——报错记录

官网地址在这里——源码部署 (yuque.com)&#xff0c;英文地址——Source Code Deployment | DB-GPT (dbgpt.site) 官网给了三种部署方式&#xff1a;源码部署、Docker部署、Docker-Compose部署&#xff0c;这里我选择的部署方式是源码部署&#xff0c;Docker部署的教程我感觉…

18. Lammps命令学习-4之units

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;Lammps命令学习-4之units units style 使用read data或create box命令定义模拟框之前设置用于模拟的单位类型   https://docs.lammps.org/units.html Syntax units styleDescription **设置用于模拟的单位类型&am…

MySQL数据库入门基础知识 【1】推荐

数据库就是储存和管理数据的仓库&#xff0c;对数据进行增删改查操作&#xff0c;其本质是一个软件。 首先数据有两种&#xff0c;一种是关系型数据库&#xff0c;另一种是非关系型数据库。 关系型数据库是以表的形式来存储数据&#xff0c;表和表之间可以有很多复杂的关系&a…

flink 1.17 测试

1、配置 2、测试&#xff1a; ./bin/flink run-application -t yarn-application -Dyarn.application.namewordcount -c org.apache.flink.streaming.examples.wordcount.WordCount ./examples/streaming/WordCount.jar --input hdfs://jy/tmp/input --output hdfs://jy/tmp/o…

linux安装人大金仓数据库

下载人大金仓数据库 人大金仓-成为世界卓越的数据库产品与服务提供商 (kingbase.com.cn) 下载授权文件 1创建用户 创建用户并设置密码为kingbase useradd kingbasepasswd kingbase 创建目录 sudo mkdir -p /opt/Kingbase/ES/V9 # 设置操作权限 sudo chmod orwx /opt/Kingba…