ata驱动框架

Ubuntu 22.04源码编译安装ROS Noetic 阅读详情
这里所说的 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回调流程也发生了一定变化。

IEEE Access投稿全流程解析:从初次提交到最终接收的完整指南 本文详细解析了IEEE Access期刊从初次投稿到最终接收的全流程,包括ORCID注册、论文投稿七步法、回稿再投流程及最终版提交等关键步骤。特别强调了4-6周快速同行评审的特点,为研究者提供了一份实用的投稿指南,帮助高效完成IEEE Access期刊投稿。 阅读详情

相关推荐

linux硬件基础知识】SATA vs ATA

ATA,也称为 IDE(集成驱动电子设备)或 PATA(并行 ATA),是早期用于将存储设备连接到计算机的标准。热插拔:SATA 支持热插拔,这意味着您可以在计算机开机时连接或断开 SATA 设备,而无需重新启动系统。设备限制:由于信号衰减,ATA 的最大电缆长度限制为 18 英寸(46 厘米)左右,而 SATA 电缆最长可达 1 米(3.3 英尺)而不丢失信号。总之,SATA 是用于连接存储设备的更现代、更广泛使用的接口,与 ATA 相比,它提供更快的速度、更小的电缆、热插拔支持以及更高的整体性能。

1363

Serial ATA(SATA)驱动

Serial ATA(SATA)驱动,用于IBM笔记本。

深入探索硬盘接口标准与配置指南

本文深入探讨了硬盘接口标准,包括并行ATA(PATA)和串行ATA(SATA)的兼容性、配置方法以及SCSI技术。详细介绍了不同接口的传输模式、设备连接方式和如何突破传统硬盘容量限制。对于准备升级或构建新系统的用户,提供了实用的配置建议和故障排除方法。

weixin_28793831的博客 389

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

块设备驱动程序

一世豁然的专栏 2242

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

Linux AHCI驱动

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

chen_xing_hai的博客 4089

手机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的博客 615

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的专栏 296

SATA协议简介

1、概述 本文档主要介绍SATA的发展历程以及SATA相关协议,为后续SATA驱动框架分析做基础知识准备。 2、SATA简介 2.1 SATA发展历程 2.1.1 PATA硬盘 PATA硬盘叫做并行ATA硬盘(Parellel ATA)。为了限制其信号放大系统产生的高噪声,常采用高达5V的电压来传输正常信号,但是采用大电压导致生产成本上升,同时也不利于高速传输系统的设计和制造。由于数据是并列传输所...

yinfuyou的博客 2万+

linux驱动子系统--ATA存储

待定

u011955950的专栏 1743

Libata资料链接

ATA DiskLinux中的驱动架构对比分析: 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

IDE技术

9.1 IDE概述   IDE/ATA定义   IDE(Integrated Drive Electronic),集成驱动器电路,是指把控制器与设备集成在一起的驱动器电路。我们常说的IDE接口,也叫ATA(Advanced Technology Attachment,AT嵌入式)接口。IDE接口最初是专为硬盘而设计的,现在PC机使用的硬盘大多数都是IDE兼容的,只需用一根电缆将它们与主板或

evenness的专栏 4836

yolov12暗光环境车辆检测-夜间交通监控和安防监控+数据集+训练好的模型.zip

yolov12暗光环境车辆检测-夜间交通监控和安防监控+数据集+训练好的模型,包含有使用教程和模型评价指标曲线图;1. 内部包含标注好的目标检测数据集,分别有yolo格式(txt文件)和voc格式标签(xml文件), 共6394张图像, 已划分好数据集train,val, test,并附有data.yaml文件可直接用于yolov5,v8,v9,v10,v11,v12等算法的训练;2. yolo目标检测数据集类别名:暗光环境车辆检测,包括 car(车辆)3. yolo项目用途:暗光环境车辆检测,夜间交通监控和安防监控4. 可视化参考链接:https://blog.csdn.net/weixin_51154380/article/details/126395695?spm=1001.2014.3001.55025. 下拉页面至“资源详情处”查看具体具体内容;

上一篇: 读懂 diff 命令
下一篇: ARM的CF卡驱动分析
evenness
博客等级 码龄15年 98粉丝 8原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值