在此给出一个scsi设备的读写数据流程,通过这个例子,再结合linux源代码,方便理清这部分代码。

请求处理前半部

请求提交流程

假设读写的scsi设备为scsi disk设备,数据处理过程为:

1. 数据先通过文件系统,进入到文件系统的Cache;

2. 文件系统的pdflush daemon会将Cache住的数据刷新到磁盘,其根据buffer head的内容构造bio,然后调用块设备接口(submit_bio)将请求发送给块设备层。

3. bio在块设备层多次转发,最后被merge到块设备的请求队列中。

4. 请求可能会在请求队列滞留一段时间,然后在软中断或者用户上下文中调用request_fn去处理请求队列。

5. 在scsi middle level驱动层,块设备的请求被转换成scsi command,然后通过queuecommand函数接口将scsi command提交给scsi host,通常scsi host会发起DMA操作将数据传输给具体的设备。

至此,数据从应用程序转移到了scsi设备,当然上述过程还没有涉及到回调过程,实际的回调会在中断上下文、软中断上下文中完成,在请求发送的每一层都保存了相应的回调上下文。

函数调用关系

整个数据流的过程中,涉及到的函数如下:

说明:图中MD虚拟机层为linux kernel中Block层的Raid部分,图中以此举例说明请求到block层的转发方式;后续会专门讲解Block层的Raid实现。

IO请求的提交可以理解为整个IO过程的前半部,那么后半部就是IO完成的回调过程,下文分析Linux中IO回调路径的具体实现。

IO请求后半部

中断上半部

当一个IO事件完成之后,scsi disk会采用中断的方式通知scsihost驱动。

当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确定完成请求之后,会调用scsimiddle 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软中断下半部事件处理。

在该函数中会进行一些scsicommand执行的正确性判断:

1. 如果命令执行错误,那么可以采用重试的方法进行命令的requeue处理,当重试到一定程度之后会将执行错误的scsi命令交给scsi错误处理内核守护进程,进行最后的判决;

2. 如果执行成功,那么调用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回调路径涉及的函数描述如下图:

说明:

1. blk_end_io在kernel-2.6.32源码中具体的函数名为blk_update_request,此函数处理一个IO request。具体实现方式为遍历整个request中的bio,分别调用req_bio_endio函数返回每一个bio;

2. bio_endio在源码中为块设备自己注册的IO回调函数。

linux scsi程序,Linux scsi设备读写流程相关推荐

  1. Linux驱动——mmc sd card 块设备读写流程(十三)

    Linux驱动--mmc sd card 块设备读写流程(十三) 备注:   1. Kernel版本:5.4   2. 使用工具:Source Insight 4.0   3. 参考博客:   (1) ...

  2. Linux 块设备 读写,块设备读写流程

    块设备与字符设备的区别 1.  从字面上理解,块设备和字符设备最大的区别在于读写数据的基本单元不同.块设备读写数据的基本单元为块,例如磁盘通常为一个sector,而字符设备的基本单元为字节.所以Lin ...

  3. Linux USB HUB识别usb设备调用流程

    插入usb设备通过dmesg查看内核打印信息 查看内核源码的调用流程

  4. linux烟雾传感器程序,Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动...

    #include #include#include#include#include#include#include#include#include#include#include#include #d ...

  5. linux 扫描仪 程序,Linux桌面的4种扫描工具

    当无纸化的世界还没有出现的时候,越来越多的人通过扫描文件和照片来摆脱纸张.不过,光有扫描仪是不够的.你需要软件来驱动扫描仪. 但问题是,许多扫描仪制造商没有Linux版本的软件,他们捆绑在他们的设备. ...

  6. linux新手程序,linux新手需要掌握的入门级命令

    1. Man 我从"man"命令开始是因为从很多方面来看,它都是最基本的一个命令.这个命令是你在需要了解其他命令时需要使用的命令. 从本质上来讲,"man"命令 ...

  7. linux可疑程序,linux可疑程序追踪

    今天的主角是旁边的服务器,学姐的Fedora.发生的情况和我的那台ubuntu类似.(看来是一起被黑了) 连接虽挡,进程犹在 其实昨天已经发现学姐的系统出问题了,采取的措施和我那台一样,iptable ...

  8. php写linux应用程序,Linux应用程序使用写文件调试程序的方法

    Linux,一切皆文件,那么在Android系统本身,也是Linux+java罢了,也是在Linux的运行环境下. 通常,我们在调试程序的都会使用printf. 在Android中,我们会去使用log ...

  9. linux 部署 程序,Linux 部署配置WEB APP

    陈科肇 =========== 目录 1 准备工作 2 导入应用程序数据 3 部署 3.1方案一 3.2方案二 ============================================ ...

  10. linux 游戏程序,LINUX下的各种游戏

    本文主要介绍LINUX下的各种游戏,其中包括LINUX自带的小游戏,经典的模拟器游戏,支持LINUX的大型游戏如DOOM3等,还有运行WINDOWS热门游戏的方法介绍.游戏迷们跟我来吧!本文以REDH ...

最新文章

  1. sqlserver的事务回滚和设置事务保存点操作
  2. module 'scipy.misc' has no attribute 'imresize'
  3. 开课吧python视频百度云-廖雪峰老师官方人工智能教程,13个案例带你全面入门!...
  4. 音视频技术开发周刊 | 213
  5. iOS 字典与字符串之间的互转
  6. java_advanced_review(3)补充:利用网络套接字实现类似qq 的控制台通讯
  7. Objective-C学习笔记-使用NSString与NSData读写文件
  8. 第2篇:Flowable快速工作流脚手架Jsite_配置项目
  9. AUTOCAD建模足球实体
  10. 2020-2-6 蓝桥杯阶段模拟总结
  11. Java编译出现不可映射字符
  12. 卸载adobe系列产品工具
  13. c语言bbs论坛管理系统,C语言编程论坛的设计与开发---论文.doc
  14. 链游:不要只争朝夕,要寄望百年
  15. 关于O、Θ、Ω、o、ω等数学符号
  16. Summation Prove (Intro. to Algo. Open Course Episode 5) in Quick Sort
  17. OLED QLED LED等发光器件, IVL测试软件
  18. 大数据_01【介绍】
  19. 计算机专业國際排名,美国普林斯顿大学计算机专业排名
  20. 学院后勤保修系统php源码,适用于学校后勤报修的微信报修系统

热门文章

  1. TASKCTL调度服务平台节点管理
  2. 好用的多桌面间共享鼠标键盘的软件
  3. 银行开发专业术语解释和银行系统开发架构的设计思想
  4. 0x80070079信号灯超时_windows server 2012 连接共享报0x80070079 信号灯超时时间已到
  5. EFCore 调试远程SqlServer数据库提示信号灯超时时间已到
  6. OPPO Reno6 6Pro刷root强解BL锁 oppo reno6 Root教程
  7. MyBatis 拦截器执行顺序
  8. [深大深鸿会]利用DevEco Studio从零开发OpenHarmony小游戏——2048(下)
  9. 使用Motrix快速下载百度网盘文件
  10. Linux命令行大全