ata驱动框架

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
这里所说的 ATA Disk 包含两大类:一类是传统的并行 ATA PATA ),即 IDE 接口;另一类是目前流行的串行 ATA SATA )。对于 IDE 的驱动, Linux-2.6.28 还进行了保留,其可以驱成传统的 HD 设备,也可以驱成流行的 SD 设备。对于 SATA 设备, Linux 的标准做法是驱成 SD 设备,下面对传统 ATA 的驱动架构和目前流行 ATA 的驱动架构进行对比分析说明。

点击看大图


       传统ATA的驱动框架如上图所示,传统的ATA Host架构在PCI总线之上,在PCI总线扫描过程中枚举得到。PCI扫描程序Scan到ATA Host之后会加载该设备的驱动程序,即ATA Host Driver,该Driver亦是一个PCI Device的驱动。ATA Host会被注册到IDE Core Level驱动层,从而生成一条IDE的总线,IDE核心层在对ATA Host初始化完毕之后会扫描该Host,并且加载适合设备的IDE Device Driver。如果Ide Device Driver是一个Ide Disk的驱动,那么ATA磁盘将会被驱成HD设备;如果驱动是Ide-Scsi,那么ATA Device将会被虚拟成一个SCSI Host,并且将该Host加入到Scsi Middle Leve驱动层,同样的原理,Scsi Middle Level驱动层会扫描这个虚拟的Scsi host,然后加载扫描得到设备的驱动,这个驱动通常为scsi disk driver,此时,一个传统IDE设备被驱成了一个SCSI设备。从上述的驱动栈我们可以看出,IDE设备被虚拟成SCSI设备的关键在于IDE Device Driver,在该层对设备进行了虚拟化处理,形成了一条虚拟的SCSI总线,然后再将设备虚拟成了SCSI Device,按照这种思路,我们可以不断的进行设备虚拟和总线层叠扩展。


       从上述驱动框架来看,IDE总线层作用并不是很大,因此,完全可以将IDE总线层抛弃,直接采用如下图所示的驱动框架,这也是目前SATA等驱动常用的驱动模型。


点击看大图


       在上述驱动模型中,ATA Host的枚举过程与第一个模型保持一致,但是ATA Host Driver会直接将ATA Host注册到SCSI Middle Level层,考虑到ATA协议层与SCSI协议层存在差异,因此,通过LibATA驱动作为SCSI Middle Level与ATA Host之间的转换层,从而可以很好的将ATA Host直接融入到SCSI的驱动体系中来,可以直接将ATA设备驱成SCSI Device。与第一个模型相比,这个模型的驱动栈变浅了,驱动效率提高了,而且可以无缝的将ATA驱动融入到SCSI驱动体系中。在这个驱动模型中,LibATA驱动无疑是最大的功臣。目前,很多SATA Host驱动以及PATA Host的驱动都采用这种模型。

 

  Scsi Disk设备驱动通过Scsi middle level层向scsi host提交请求,scsi disk driver是一个块设备驱动,其调用块设备层的unplug_fn函数处理scsi disk的请求队列。在处理scsi disk请求队列过程中会调用scsi middle level层注册的scsi_request_fn函数实现具体的操作。Scsi_request_fn函数会从io调度队列中获取一个请求,然后将该请求转换成scsi command,最后直接调用scsi_dispatch_cmd函数将scsi命令提交给scsi host。Scsi host与scsi middle level层的接口是queue_command函数,每个scsi host驱动都会向scsi middle level层注册具体的queue_command方法。由于Queue_command函数在不可睡眠的上下文中执行,所以其不能处理复杂的操作,通常的操作是将接收到的scsi命令放置到scsi host维护的处理队列中。如果一个真是的scsi host,而不是一个虚拟的host时,那么在scsi host层可以将scsi command通过DMA的方式传输到scsi disk。上述过程完成了一个io请求的提交过程,对于诸如磁盘这样的设备,在这一过程中需要考虑到存储介质的特性以及应用访问模式的特性,所以需要做一些IO调度的策略,使得scsi磁盘的读写更加满足存储介质的特性。当然也可以在scsi disk的上层实现更加高级的IO管理策略。IO请求的提交可以理解为整个IO过程的前半部,那么后半部就是IO完成的回调过程,下文分析Linux中IO回调路径的具体实现。

 


 

       当一个IO事件完成之后,scsi disk会采用中断的方式通知scsi host驱动。当scsi host的中断事件发生之后,CPU会执行host的中断服务程序,通常实际的scsi host都会以PCI设备的形式存在,考虑到中断共享问题,在中断服务程序中首先需要进行中断事件的判断,然后根据scsi host的状态寄存器进行具体中断任务的处理。对于读写IO请求,当数据DMA到scsi disk之后会产生DMA结束中断信号,在DMA过程中可以采用聚散DMA(scatter-gather DMA)的技术,因此这一过程不会涉及到数据的内存拷贝,也就是说在读写IO过程中,数据一直处于bio的Page页中(写数据过程中会直接将Page页中的数据DMA到磁盘,读数据过程中直接将磁盘中的数据DMA到bio的Page中,这样的处理机制效率较高)。当host确定完成请求之后,会调用scsi middle level的回调函数,该回调函数就是著名的scsi_done。Scsi_done在queue_command的过程中被提交到scsi host层。在scsi_done函数中直接调用了blk_complete_request函数,该函数通过raise_softirq_irqoff(BLOCK_SOFTIRQ)触发了scsi的软中断。到目前为止,上述过程都在scsi host的中断上半部中执行。中断上半部运行时间不能过长,否则会导致中断事件的丢失。触发软中断之后,中断上半部就可以退出了。在退出上半部之后,CPU将会交给已经触发的scsi软中断服务程序,此时可以看到软中断的服务程序仍然运行在中断上下文,并不是一个可以调度的context。


 

 


 

       软中断的执行函数是blk_done_softirq,由于是scsi command引发的中断事件,因此会调用事先注册到请求队列上的scsi_softirq_done函数,完成具体的scsi软中断下半部事件处理。在该函数中会进行一些scsi command执行的正确性判断,如果命令执行错误,那么可以采用重试的方法进行命令的requeue处理,当重试到一定程度之后会将执行错误的scsi命令交给scsi错误处理内核守护进程,进行最后的判决;如果执行成功,那么调用scsi_finish_command函数结束掉scsi命令。在scsi_finish_command函数中调用scsi_io_completion函数结束块级的io request,具体会调用scsi_end_request函数,然后调用blk_end_request函数,最后调到blk_end_io函数。在blk_end_io函数中会结束掉request上的所有bio,结束bio的过程可以调用bio_endio函数。Request中的所有bio都结束之后释放request资源。至此,一个bio所在的request被scsi disk处理完毕之后,通过中断上半部和下半部已经全部处理完毕。这里需要注意的是,IO的所有回调过程都是在中断上下文中处理的,所以在编写IO的回调函数时需要注意睡眠问题,需要考虑内存分配可能带来的睡眠,信号量的使用会导致睡眠,从而使系统崩溃。


 

 


 

       通过上述分析,scsi disk的正常IO回调路径涉及的函数描述如下:scsi_doneàblk_done_softirqàscsi_softirq_doneàscsi_finish_commandàscsi_io_completionàscsi_end_requestàblk_end_ioàbio_endio。


 

 


 

       最近Linux在Scsi middle level方面变化比较大,上述的分析基于较新的Linux-2.6.28版本,和前面的2.6.18版本相比IO回调流程也发生了一定变化。

Serial ATA(SATA)驱动 Serial ATA(SATA)驱动,用于IBM笔记本。 立即下载

相关推荐

《精通Linux设备驱动程序开发》——块设备驱动程序

块设备驱动程序

一世豁然的专栏 2244

Linux AHCI驱动

一个AHCI HBA可支持最多32个sata port。

chen_xing_hai的博客 4094

Linux SATA驱动

SATA规范只规定了FIS结构、Shadow Regs(Command/Control)、SATA Regs(SCR0~15)、命令流程,并未规定SATA控制器如何给软件提供寄存器接口,如软件如何组装FIS、在哪个地址读取SCR0~4。导致不同芯片的sata驱动都不同,所以后面interl出了一个ahci规范,用于规范SATA对上层应用的接口。SATA使用FPDMA(First-party DMA)引擎来允许设备知道从哪里获取正确的DMA数据。

chen_xing_hai的博客 2963

手机ATA测试

ATA工具使用方法。

Andy的博客 9009

ata驱动框架及scsi请求处理流程

传统IDE-SCSI框架 这里所说的ATA Disk包含两大类:一类是传统的并行ATA(PATA),即IDE接口;另一类是目前流行的串行ATA(SATA)。对于IDE驱动,Linux-2.6.28还进行了保留,其可以驱成传统的HD设备,也可以驱成流行的SD设备。对于SATA设备,Linux的标准做法是驱成SD设备,下面对传统ATA驱动架构和目前流行ATA驱动架构进行对比分析说明。 传统A...

神恰以泽_CSDN 2870

linux设备驱动开发详解_Linux设备驱动框架设计

引子Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码。能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Linux内核提供了一套易于扩展和维护的设备驱动框架。Linux内核本身提供一套设备驱动模型,此模型提供了Linux内核对设备的一般性抽象描述,包括设备的电源管理、对象生命周期管理、用户空间呈现等等。在设备...

weixin_39946767的博客 540

linux pcie驱动框架_Linux设备驱动框架设计

引子Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码。能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Linux内核提供了一套易于扩展和维护的设备驱动框架。Linux内核本身提供一套设备驱动模型,此模型提供了Linux内核对设备的一般性抽象描述,包括设备的电源管理、对象生命周期管理、用户空间呈现等等。在设备...

weixin_35998457的博客 617

Linux设备驱动框架设计

引子 Linux操作系统的一大优势就是支持数以万计的芯片设备,大大小小的芯片厂商工程师都在积极地向Linux kernel提交设备驱动代码。能让这个目标得以实现,这背后隐藏着一个看不见的技术优势:Linux内核提供了一套易于扩展和维护的设备驱动框架。Linux内核本身提供一套设备驱动模型,此模型提供了Linux内核对设备的一般性抽象描述,包括设备的电源管理、对象生命周期管理、用户空间呈现等等。在...

weixin_30474613的博客 520

硬盘识别 Libata分析 SCSI系统

硬盘识别 Libata分析 SCSI系统

qq_41882586的博客 982

android驱动开发工程师,android驱动开发工程师

android驱动开发工程师任职资格:1、精通android基础知识,熟悉android底层,了解frameworks层;2、熟悉MTK、高通等手机或平板电脑平台,有调试MTK6735、MTK6737、MTK6739平台驱动经验者优先;3、熟练使用linux常用命令、代码管理工具(git/repo)和shell脚本编写;4、熟悉android驱动调试流程;系统性问题分析处理有3年以上调试经验;5、...

weixin_35564059的博客 975

MTK ATA测试中Camera常见问题排查指南

本文为MTK平台Camera开发与测试人员提供了ATA测试中常见问题的系统性排查指南。针对“黑屏”不出图、电脑端报错等典型问题,详细阐述了从日志分析(如搜索sensor power、CRC_accum)、驱动代码校验(checksum_value)、到硬件测量(时钟、电源、MIPI信号)的完整定位流程,帮助工程师高效解决Camera认证难题。

tequila的博客 926

面向物联网系统的数据驱动安全量化框架

本文提出了一种集成MBSE、攻击树分析和经验漏洞数据的物联网系统定量安全评估框架。该框架利用SysML模型描述系统架构,从中导出攻击树结构,并基于EPSS漏洞利用概率为基本攻击步骤分配客观概率值。攻击树随后转换为贝叶斯网络,支持概率推理和关键漏洞识别。通过智慧农业案例研究验证,该方法实现了系统级失陷概率的量化估算(4.00×10^-2),并通过伯恩鲍姆重要性分析识别出最具影响力的漏洞。相较于依赖主观评估的传统方法,该数据驱动框架提供了更严谨、可复现的网络安全风险评估,支持缓解措施的优先级排序。未来工作将探索

hao_wujing的专栏 298

Reactos 第 9 章 设备驱动 — 9.9.1 类驱动disk.sys

本文深入解析了 ReactOS 中磁盘驱动 disk.sys 的核心机制。disk.sys 作为存储栈的关键中间层,实现了 IRP 到 SRB 的转换,向上提供统一的块设备接口,向下兼容多种存储协议(SCSI/ATA/NVMe)。文章详细剖析了其四层驱动架构、设备扩展结构、PnP 处理流程以及几何信息查询等核心功能,并提供了相关源码位置索引。通过理解 disk.sys 的工作原理,可以掌握存储设备驱动在操作系统中的关键作用与实现方法。

大坡3D软件开发 430

10个PureDarwin核心组件详解:驱动程序和系统库完全指南

PureDarwin作为macOS开源核心Darwin的社区扩展项目,致力于构建一个完整可用的操作系统。本文将深入解析其10个核心组件,帮助新手用户理解系统架构与功能实现。 ## 1. IOStorageFamily:存储设备管理核心 IOStorageFamily是PureDarwin处理存储设备的基础框架,负责磁盘、U盘等存储介质的识别与管理。该组件位于`src/Kernel/Extens

gitblog_00047的博客 507

从零构建X86操作系统:引导程序与内核开发实战

操作系统作为计算机系统的核心组件,负责管理硬件资源和提供基础服务。X86架构因其广泛兼容性成为学习操作系统开发的理想平台,通过从零开始构建可深入理解计算机启动流程(BIOS→MBR→内核加载)和硬件交互原理。开发过程中需掌握汇编语言、内存管理(分页/分段)、中断处理等底层技术,配合QEMU模拟器和GDB调试工具可高效验证引导程序与内核功能。这种实践不仅适用于教学演示,更能为嵌入式系统开发、虚拟化技术等领域打下坚实基础,文中展示的U盘启动方案和Ventoy多系统配置尤其适合需要频繁测试的场景。

weixin_30699955的博客 376

Libata资料链接

ATA Disk在Linux中的驱动架构对比分析: http://blog.csdn.net/dianhuiren/article/details/7162034 ATA设备的初始化: http://blog.csdn.net/dianhuiren/article/details/7162063 Scsi命令队列转换为ata命令过程: http://blog.csdn.net/dianh

842

SylixOS中AHCI驱动框架分析

1、概述 本文档介绍SATA和AHCI相关协议,以IMX6Q实验平台为基础,分析SylixOS中AHCI驱动框架的具体实现。 2、SATA简介 2.1 SATA硬盘 串口硬盘SATA(Serial ATA)与以往的并口硬盘PATA(Parallel ATA)相比,数据传输速度更加快捷,...

chufeila6341的博客 458

ATA协议

ATA协议 1、什么是ATA协议? ATA协议定义了ATA主机控制器与ATA存储设备之间的接口标准,它包括一下几个方面的内容: (1)接口的物理电气特性 (2)接口信号定义 (3)接口寄存器定义 (4)数据传输中使用的命令...

1910
上一篇: 读懂 diff 命令
下一篇: ARM的CF卡驱动分析
evenness
博客等级 码龄15年 98粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值