35 | 块设备(下):如何建立代理商销售模式?
刘超
该思维导图由 AI 生成,仅供参考
在文件系统那一节,我们讲了文件的写入,到了设备驱动这一层,就没有再往下分析。上一节我们又讲了 mount 一个块设备,将 block_device 信息放到了 ext4 文件系统的 super_block 里面,有了这些基础,是时候把整个写入的故事串起来了。
还记得咱们在文件系统那一节分析写入流程的时候,对于 ext4 文件系统,最后调用的是 ext4_file_write_iter,它将 I/O 的调用分成两种情况:
第一是直接 I/O。最终我们调用的是 generic_file_direct_write,这里调用的是 mapping->a_ops->direct_IO,实际调用的是 ext4_direct_IO,往设备层写入数据。
第二种是缓存 I/O。最终我们会将数据从应用拷贝到内存缓存中,但是这个时候,并不执行真正的 I/O 操作。它们只将整个页或其中部分标记为脏。写操作由一个 timer 触发,那个时候,才调用 wb_workfn 往硬盘写入页面。
接下来的调用链为:wb_workfn->wb_do_writeback->wb_writeback->writeback_sb_inodes->__writeback_single_inode->do_writepages。在 do_writepages 中,我们要调用 mapping->a_ops->writepages,但实际调用的是 ext4_writepages,往设备层写入数据。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了块设备I/O请求送达外部设备的过程,包括直接I/O和缓存I/O两种情况下的数据写入流程。在直接I/O中,通过ext4_direct_IO_write调用__blockdev_direct_IO,准备好写入请求的结构体后,通过do_direct_IO循环处理每个要写入的块,并调用submit_page_section和submit_bio向块设备提交数据。而在缓存I/O中,通过ext4_writepages初始化结构体后,调用io_submit_init_bio初始化bio,再通过ext4_io_submit和submit_bio向块设备传输数据。文章还介绍了submit_bio调用generic_make_request的逻辑,以及块设备队列结构和块设备的初始化过程。读者通过本文可以深入了解块设备I/O请求的处理过程,对于理解系统底层的I/O操作有很大帮助。文章还介绍了请求提交与调度的过程,包括对请求的合并和调用底层设备驱动程序的处理。整体而言,本文对块设备I/O请求的处理流程进行了详尽的分析,适合对系统底层I/O操作感兴趣的读者深入学习参考。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》,新⼈⾸单¥68
《趣谈 Linux 操作系统》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(21)
- 最新
- 精选
- geraltlaush文件系统中的page_cache对应逻辑上的块的概念,将page_cache打包成bio递交给通用块设备层,通用块设备层将多个bio打包成一个请求request, 尽量把bio对应的sector临近的数据合并,提交给块设备调度层,块设备调度层就是把各个request当成段提交给设备驱动程序,因为设备驱动程序只识别段,也就是说通用块设备层捣腾的其实就是把bio对应的页框和在磁盘中对应的sector进行合并的过程,调度层只负责把合并的request放进队列,用调度算法下发给驱动程序处理,其实所有复杂的合并操作以及内存和磁盘扇区的对应关系都是通过块设备层做了,老师,可以这么理解吧
作者回复: 是的
2019-06-2222 - djfhchdh/sys/block/xvda/queue/scheduler 磁盘的调度算法,临时修改:echo noop > /sys/block/xvda/queue/scheduler,永久修改就需要修改内核参数,然后重启。 iostat -d -x 中的avgqu-sz是平均I/O队列长度。
作者回复: 赞
2019-06-246 - geraltlaush那个队列,队头和队尾的合并都是为了所谓的顺序写,减少机械硬盘寻址消耗吧,能赶上就上同一辆车,赶不上自己叫一辆车等满了再走,但是也是有超时等待时间的,可以这么理解吧
作者回复: 是的
2019-06-176 - 眭东亮查看磁盘调度算法 cat /sys/block/sda/queue/scheduler
作者回复: 赞
2019-07-102 - 安排往设备里面写的时候调用的是request_fn,这个函数是谁来调用的呢?触发这个调用的时机是什么呢?还是说请求一旦进入队列就会立即写入?
作者回复: 会调用__blk_run_queue,里面调用request_fn
2019-06-172 - 蚂蚁内推+v会不会断电丢失数据呢?
作者回复: 会呀,flush就不会
2019-06-191 - 安排直接读写裸设备不会走文件系统,那还会走通用块层吗?
作者回复: 不会的
2019-06-181 - 游弋云端老师,是否可以认为直接 IO执行完成后,数据就是下盘的,还是不一定,还有驱动层以及磁盘缓存等因素。
作者回复: 还是需要设备驱动层的
2019-09-01 - 安排老师,希望在答疑篇能讲一讲request_fn取出请求之后的具体执行过程,具体的执行是不是和block_device有关,磁盘的最底层的操作是不是都在block_device中?
作者回复: 取出来之后,基本就是面向设备的操作了。
2019-06-19 - 石维康bio_list_merge(&bio_list_on_stack[0], &lower); bio_list_merge(&bio_list_on_stack[0], &same); bio_list_merge(&bio_list_on_stack[0], &bio_list_on_stack[1]); 请问这些加到bio_list_on_stack[0]上的bio是在什么时候被处理的?
作者回复: 后面会加回去的
2019-06-17
收起评论