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交互,实现了数据的读写操作。
原文地址:https://blog.csdn.net/zhuzongpeng/article/details/135887837
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!