深入理解linux内核--块设备驱动程序

news2024/12/23 3:17:02

块设备的处理

块设备驱动程序上的每个操作都涉及很多内核组件;其中最重要的一些如图14-1所示。
例如,我们假设一个进程在某个磁盘文件上发出一个read()系统调用
——我们将会看到处理write请求本质上采用同样的方式。
下面是内核对进程请求给予回应的一般步骤:

在这里插入图片描述

1.  read()系统调用的服务例程调用一个适当的VFS函数,将文件描述符和文件内的偏移量传递给它。
虚拟文件系统位于块设备处理体系结构的上层,它提供一个通用的文件模型,Linux支持的所有文件系统均采用该模型。
我们在第十二章已经详细介绍了VFS层。
2.  VFS函数确定所请求的数据是否已经存在,如果有必要的话,它决定如何执行read操作。
有时候没有必要访问磁盘上的数据,因为内核将大多数最近从块设备读出或写入其中的数据保存在RAM中。第十五章介绍了磁盘高速缓存机制,
而第十六章详细说明了VFS如何处理磁盘操作以及如何与磁盘高速缓存和文件系统交互。
3.  我们假设内核从块设备读数据,那么它就必须确定数据的物理位置。为了做到这点,内核依赖映射层(mapping layer),主要执行下面两步:
a.内核确定该文件所在文件系统的块大小,并根据文件块的大小计算所请求数据的长度。
本质上,文件被看作拆分成许多块,因此内核确定请求数据所在的块号(文件开始位置的相对索引)。
b.接下来,映射层调用一个具体文件系统的函数,它访问文件的磁盘节点,然后根据逻辑块号确定所请求数据在磁盘上的位置。
事实上,磁盘也被看作拆分成许多块,因此内核必须确定存放所请求数据的块对应的号(磁盘或分区开始位置的相对索引)。
由于一个文件可能存储在磁盘上的不连续块中,因此存放在磁盘索引节点中的数据结构将每个文件块号映射为一个逻辑块号(注1)。
我们将在第十六章中说明映射层的功能,在第十八章中将介绍一些典型的磁盘文件系统。
4.  现在内核可以对块设备发出读请求。内核利用通用块层(generic block Inyer)启动I/O操作来传送所请求的数据。
一般而言,每个I/O操作只针对磁盘上一组连续的块。
由于请求的数据不必位于相邻的块中,所以通用块层可能启动几次I/O操作。
每次I/O操作是由一个“块I/O”(简称“bio”)结构描述,它收集底层组件需要的所有信息以满足所发出的请求。
通用块层为所有的块设备提供了一个抽象视图,因而隐藏了硬件块设备间的差异性。
几乎所有的块设备都是磁盘,所以通用块层也提供了一些通用数据结构来描述“磁盘”或“磁盘分区”。
我们将在本章的“通用块层”一节中讨论通用块层和bio数据结构。
5.  通用块层下面的“I/O调度程序”根据预先定义的内核策略将待处理的I/O数据传送请求进行归类。
调度程序的作用是把物理介质上相邻的数据请求聚集在一起。我们将在本章后面的“I/O调度程序”一节中介绍调度程序。
6.  最后,块设备驱动程序向磁盘控制器的硬件接口发送适当的命令,从而进行实际的数据传送。
我们将在后面的“块设备驱动程序”一节介绍通用块设备驱动程序的总体组织结构。
如你所见,块设备中的数据存储涉及了许多内核组件;每个组件采用不同长度的块来管理磁盘数据:
6.1.硬件块设备控制器采用称为“扇区”的固定长度的块来传送数据。因此,I/O调度程序和块设备驱动程序必须管理数据扇区。
6.2.虚拟文件系统、映射层和文件系统将磁盘数据存放在称为“块”的逻辑单元中。
6.3.一个块对应文件系统中一个最小的磁盘存储单元。
我们很快会看到,块设备驱动程序应该能够处理数据的“段”:
一个段就是一个内存页或内存页的一部分,它们包含磁盘上物理相邻的数据块。
5.4.磁盘高速缓存作用于磁盘数据的“页”上,每页正好装在一个页框中。
通用块层将所有的上层和下层的组件组合在一起,因此它了解数据的扇区、块、段以及页。
即使有许多不同的数据块,它们通常也是共享相同的物理RAM单元。
例如,图14-2显示了一个具有4096字节的页的构造。
上层内核组件将页看成是由4个1024字节组成的块缓冲区。
块设备驱动程序正在传送页中的后3个块,因此这3块被插入到涵盖了后3072 字节的段中。
硬盘控制器将该段看成是由6个512字节的扇区组成。

在这里插入图片描述

本章我们介绍处理块设备的下层内核组件:通用块层、I/O调度程序以及块设备驱动程序,因此我们将注意力集中在扇区、块和段上。

扇区

为了达到可接受的性能,硬盘和类似的设备快速传送几个相邻字节的数据。
块设备的每次数据传送操作都作用于一组称为扇区的相邻字节。
在下面的讨论中,我们假定字节按相邻的方式记录在磁盘表面,这样一次搜索操作就可以访问到它们。
尽管磁盘的物理构造很复杂,但是硬盘控制器接收到的命令将磁盘看成一大组扇区。
在大部分磁盘设备中,扇区的大小是512字节,但是一些设备使用更大的扇区(1024和2048字节)。
注意,应该把扇区作为数据传送的基本单元;不允许传送少于一个扇区的数据,尽管大部分磁盘设备都可以同时传送几个相邻的扇区。
在Linux中,扇区大小按惯例都设为512字节;
如果一个块设备使用更大的扇区,那么相应的底层块设备驱动程序将做些必要的变换。
因此,对存放在块设备中的一组数据是通过它们在磁盘上的位置来标识,
即其首个512字节扇区的下标以及扇区的数目。
扇区的下标存放在类型为sector_c的32位或64位的变量中。

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

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

相关文章

FPGA芯片IO口上下拉电阻的使用

FPGA芯片IO口上下拉电阻的使用 为什么要设置上下拉电阻一、如何设置下拉电阻二、如何设置上拉电阻为什么要设置上下拉电阻 这里以高云FPGA的GW1N-UV2QN48C6/I5来举例,这个芯片的上电默认初始化阶段,引脚是弱上来模式,且模式固定不能通过软件的配置来改变。如下图所示: 上…

Openwrt指定延迟脚本

在某些情况下,我们需要对指定网络接口指定延迟,以达到我们想要实验的效果延迟。 脚本如下: #!/bin/bash # #初始化 tc qdisc del dev br-lan root echo "1. 添加延迟规则 2. 删除延迟规则" read -p "请选择操作:&q…

素数线性筛法 → 欧拉筛

【题目来源】https://www.acwing.com/problem/content/870/【题目描述】 给定一个正整数 n,请你求出 1∼n 中质数的个数。【输入格式】 共一行,包含整数 n。【输出格式】 共一行,包含一个整数,表示 1∼n 中质数的个数。【数据范围…

【数字实验室】时钟切换

大部分开发者使用 BUFGCTRL 或 BUFGMUX进行时钟切换,它们在时钟切换上可以提供无毛刺输出。然而,了解所涉及的原理是有好处的。 当然,无论我们在同步逻辑中使用哪种技术,重要的是要确保在进行时钟切换时输出上没有毛刺。任何故障都…

无涯教程-Perl - times函数

描述 此函数返回一个四元素列表,为当前进程及其子进程提供用户,系统,子进程和子系统时间。 语法 以下是此函数的简单语法- times返回值 此函数返回ARRAY,($usertime,$systemtime,$childsystem,$childuser) 例 以下是显示其基本用法的示例代码- #!/usr/bin/perl -w($use…

一、ls 标准输出时出现乱码符号及解决办法

问题描述:采用 QSSh 登录远程主机时,执行 ls 指令,标准输出中出现乱码符号 如下,在成功 SSH 到远程主机后,执行 ls 指令,标准输出中出现一堆不认识的符号。 从标准输出来看,英文和中文并没有乱…

安科瑞无线测温产品在浙江某半导体项目的应用-安科瑞黄安南

摘 要:半导体被誉为“制造业的大脑”,在关系国家安全和国民经济命脉的主要行业和关键领域占据支配地位,是国民经济的重要支柱。随着数字技术的发展和数字经济在国民经济中所占比重越来越高,半导体产业的重要性还会进一步提升。安全…

文心一言 VS 讯飞星火 VS chatgpt (77)-- 算法导论7.3 2题

二、如果用go语言,在 RANDOMIZED-QUICKSORT 的运行过程中,在最坏情况下,随机数生成器 RANDOM 被调用了多少次?在最好情况下呢?以θ符号的形式给出你的答案? 文心一言: 在 RANDOMIZED-QUICKSORT 的运行过程中,最坏…

使用贝塞尔曲线算法制作曲线

一阶贝塞尔曲线 使用两个点绘制线段 p3p1(p2-p1)*t p1:起点;p2:终点;t:0-1;p3:线段L12上的点 两个点和t的变化(0-1)可得到一条线段 二阶贝塞尔曲线 使用三个点绘制曲线 p12p1(p2-p1)*t p23p2(p3-p2)*t p123p12(p23-p12)*t p12是线段L12上的点, p23是线段L23上的…

android:绘图 (android.graphics包)

android:绘图 View:组件,理解为画布 Drawable:所有可见对象的描述,理解为:素材类 Bitmap:图片类 Canvas:画笔 Paint:画笔样式与颜色、特效的集合 近期很多网友对Android用户界面的设计表示很感…

Lnton羚通关于如何解决nanoPC-T4 upgrade报错问题?

nanoPC-T4 在 ​​# sudo apt update 和 sudo apt upgrade​​升级或安装软件 ​​sudo apt install xxx​​时遇到以下问题:​​Failed to set up interface with /etc/hostapd/​ Setting up hostapd (2:2.6-15ubuntu2.8) ... Job for hostapd.service failed be…

学习 Linux 系统路线图

在计算机科学领域,Linux 操作系统以其稳定性、灵活性和卓越性能而受到广泛欢迎。要真正掌握 Linux 系统,我们需要深入了解其关键组成部分,包括系统、内存、进程、网络和存储等模块。让我们深入探索这些模块,以建立起对 Linux 系统…

【轻量级神经网络】ShuffleNetv1-2详解

文章目录 1、ShuffleNetV11.1、分组卷积1.2、channel shuffle1.3、ShuffleNet基本单元1.4、整体结构 2、ShuffleNetV22.1、基本单元2.2、整体结构 1、ShuffleNetV1 1.1、分组卷积 Group convolution是将输入层的不同特征图进行分组,然后采用不同的卷积核再对各个组…

KVM配置使用ovs网桥

KVM配置使用ovs网桥 1、安装openvswitch 2、启动服务 3、配置ovs 重启网络服务 systemctl restart network 4、 KVM配置使用ovs网桥 配置生效:virsh net-define br0.xml virsh net-start bro virsh net-autostart br0 5、虚…

怎么实现技术评卷时间0投入的?(上)

01 痛苦的技术问答题评审 指针走到了九点,凝视着时钟的技术招聘官Jasmine从昏沉中回到现实,她将咖啡连同叹息一口抿了下去,并端正坐在电脑前。又是一天的评卷日…… 技术招聘已持续数周,公司筛选出了100位嵌入式工程师候选人的技…

ATA-2000系列高压放大器——应用场景介绍

ATA-2000系列高压放大器——应用场景介绍 ATA-2000系列是一款理想的可放大交、直流信号的高压放大器。最大差分输出1600Vp-p (800Vp)高压,可以驱动高压型负载。电压增益数控可调,一键保存常用设置,为您提供了方便简洁的操作选择,同…

【03 英语语法:从句(名词从句、定语从句/形容词从句、状语从句/副词从句)】

从句 从句:名词从句、定语从句、状语从句(名定状名形副)1. 名词从句(名词):主语、宾语、表语、同位语、宾补▲名词从句的种类(按引导词): that、whether、疑问词 句子⑴…

pycharm配置anaconda环境

前提: 使用anaconda已经创建了一个环境名为test,现在要将test环境中的python解释器作为pycharm中工程的解释器。 如何添加解释器 点击:File->Project->Python Interpreter->右上角Add Interpreter->Add Local Interpreter. 选…

blender 发射体粒子

发射体粒子的基础设置 选择需要添加粒子的物体,点击右侧粒子属性,在属性面板中,点击加号,物体表面会出现很多小点点,点击空格键,粒子会自动运动,像下雨一样; bender 粒子系统分为两…

UE4/UE5 “无法双击打开.uproject 点击无反应“解决

一、方法一:运行UnrealVersionSelector.exe 1.找到Epic Game Lancher的安装目录, 在lancher->Engine->Binaries->Win64->UnrealVersionSelector.exe 2.把UnrealVersionSelector.exe 分别拷贝到UE4 不同版本引擎的 Engine->Binaries->…