当前位置: 首页 > news >正文

Linux BIO如何下发到HDD?

在Linux操作系统中,当创建一个Block I/O请求(BIO)时,它会被封装成适合硬件交互的数据结构,并通过内核存储子系统传递到对应的硬件控制器上,如SAS(Serial Attached SCSI)HBA(Host Bus Adapter)卡。以下是该过程的详细分析和解读:

BIO创建

在用户空间或内核空间的应用程序发起读写磁盘操作时,会调用相应的系统调用(例如read()write()或者直接使用io_uring等异步I/O接口),这些调用最终转化为对块设备的I/O请求。

这些请求被包装为内核中的struct bio数据结构,即BIO,它包含了诸如起始扇区地址、要传输的数据长度以及指向实际数据缓冲区的指针等信息。

调度与合并

Linux内核的块层(block layer)会对BIO进行调度和可能的合并操作,以优化I/O性能。例如,如果连续的多个小I/O可以合并为一个大的I/O,那么内核就会这样做,减少硬件操作次数。

通过I/O调度器

调度后的BIO经过I/O调度器(如CFQ, Deadline, Noop等),按照特定策略将I/O请求排序并决定何时将其发送给下一层驱动。

到达SCSI中间层

对于SAS硬盘,BIO接着会传递到SCSI子系统,进一步转换为SCSI命令描述符块(CDBs)。这一过程中,Linux的scsi_midlayer组件负责处理从块设备抽象到具体SCSI协议之间的转换。

SAS HBA驱动介入

当请求到达SAS HBA驱动层时,驱动程序将CDB及相关的BIO信息映射到适配器的命令队列中。SAS HBA驱动主要负责与硬件通信,包括控制寄存器的操作、DMA数据传输管理以及处理中断等。

硬件执行

驱动程序将准备好的SCSI命令发送至SAS HBA卡。HBA卡收到命令后,通过其内部逻辑处理,并通过SAS总线将命令传输到目标SAS硬盘。

SAS硬盘响应

SAS硬盘接收到命令后,根据指令完成相应操作,可能是读取数据或写入数据。完成后,硬盘通过SAS链路返回状态信息和(如有必要)数据。

数据传输与确认

HBA卡接收到来自硬盘的响应后,驱动程序开始处理回传的数据,如果是读操作,则将硬盘返回的数据复制到原始BIO所关联的内存区域;如果是写操作,则确认数据已经正确写入硬盘。

完成通知

当所有数据传输完毕并且相关事务处理结束时,HBA驱动向内核块层发出I/O完成通知,从而释放相关的资源,并允许等待的进程继续执行。

在Linux系统中,一个创建的BIO经历了层层转化与调度,最终通过SAS HBA驱动成功地与底层的SAS HDD交互,实现了数据的读写操作。

http://www.lryc.cn/news/289103.html

相关文章:

  • 《动手学深度学习(PyTorch版)》笔记4.6
  • Hadoop-MapReduce-源码跟读-客户端篇
  • 《游戏-03_3D-开发》之—新输入系统人物移动攻击连击
  • 滴水逆向三期笔记与作业——02C语言——10 Switch语句反汇编
  • 燃烧的指针(三)
  • 微服务架构实施攻略:如何选择合适的微服务通信机制?
  • 【jetson笔记】解决vscode远程调试qt.qpa.xcb: could not connect to display报错
  • 网络安全产品之认识安全隔离网闸
  • Java通过模板替换实现excel的传参填写
  • 眼底增强型疾病感知蒸馏模型 FDDM:无需配对,fundus 指导 OCT 分类
  • 代码随想录算法刷题训练营day17
  • Java集合如何选择
  • 简单介绍----微服务和Spring Cloud
  • Jenkins邮件推送配置
  • 硬件知识(1) 手机的长焦镜头
  • 华为机考入门python3--(3)牛客3-明明的随机数
  • vue父子组件传值问题
  • Rider 打开Unity项目 Project 全部显示 load failed
  • Maven(下):依赖管理、依赖传递、依赖冲突、工程继承及工程聚合
  • 网络基础---初识网络
  • 【Java】Java类动态替换Class
  • 【驱动系列】C#获取电脑硬件显卡核心代号信息
  • AutoGen实战应用(二):多代理协作(Multi-Agent Collaboration)
  • c++文件操作 (1) -- 读写文件
  • PHP操作Mysql记录数多引发的空白错误
  • transformer和vit学习笔记
  • 人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)
  • Python tkinter (6) Listbox
  • 优雅的python(二)
  • Git安装详细步骤