趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

35 | 块设备(下):如何建立代理商销售模式?

blk_init_request_from_bio
blk_try_merge
add_acct_request
get_request
elv_merge
scsi_dispatch_cmd
__blk_run_queue
blk_queue_bio
scsi_request_fn
generic_make_request
blk_init_request_from_bio
blk_try_merge
submit_bio
add_acct_request
get_request
elv_merge
dio_bio_submit
scsi_dispatch_cmd
__blk_run_queue
blk_queue_bio
submit_page_section
scsi_request_fn
generic_make_request
do_direct_IO
blk_init_request_from_bio
blk_try_merge
submit_bio
do_blockdev_direct_IO
scsi_dispatch_cmd
add_acct_request
get_request
elv_merge
ext4_io_submit
__blockdev_direct_IO
scsi_dispatch_cmd
scsi_request_fn
__blk_run_queue
blk_queue_bio
mpage_prepare_extent_to_map
ext4_direct_IO_write
修改I/O队列的长度
修改磁盘调度算法
查看磁盘调度算法
操作系统是一个复杂的体系,需要分层次层层展开来学习
涉及系统调用、内存管理、文件系统和输入输出
scsi_request_fn
generic_make_request
ext4_writepages
ext4_direct_IO
课堂练习
总结时刻
请求的处理
如何向块设备层提交请求?
缓存I/O如何访问块设备?
直接I/O如何访问块设备?
如何将块设备I/O请求送达到外部设备

该思维导图由 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
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • geraltlaush
    文件系统中的page_cache对应逻辑上的块的概念,将page_cache打包成bio递交给通用块设备层,通用块设备层将多个bio打包成一个请求request, 尽量把bio对应的sector临近的数据合并,提交给块设备调度层,块设备调度层就是把各个request当成段提交给设备驱动程序,因为设备驱动程序只识别段,也就是说通用块设备层捣腾的其实就是把bio对应的页框和在磁盘中对应的sector进行合并的过程,调度层只负责把合并的request放进队列,用调度算法下发给驱动程序处理,其实所有复杂的合并操作以及内存和磁盘扇区的对应关系都是通过块设备层做了,老师,可以这么理解吧

    作者回复: 是的

    2019-06-22
    22
  • djfhchdh
    /sys/block/xvda/queue/scheduler 磁盘的调度算法,临时修改:echo noop > /sys/block/xvda/queue/scheduler,永久修改就需要修改内核参数,然后重启。 iostat -d -x 中的avgqu-sz是平均I/O队列长度。

    作者回复: 赞

    2019-06-24
    6
  • geraltlaush
    那个队列,队头和队尾的合并都是为了所谓的顺序写,减少机械硬盘寻址消耗吧,能赶上就上同一辆车,赶不上自己叫一辆车等满了再走,但是也是有超时等待时间的,可以这么理解吧

    作者回复: 是的

    2019-06-17
    6
  • 眭东亮
    查看磁盘调度算法 cat /sys/block/sda/queue/scheduler

    作者回复: 赞

    2019-07-10
    2
  • 安排
    往设备里面写的时候调用的是request_fn,这个函数是谁来调用的呢?触发这个调用的时机是什么呢?还是说请求一旦进入队列就会立即写入?

    作者回复: 会调用__blk_run_queue,里面调用request_fn

    2019-06-17
    2
  • 蚂蚁内推+v
    会不会断电丢失数据呢?

    作者回复: 会呀,flush就不会

    2019-06-19
    1
  • 安排
    直接读写裸设备不会走文件系统,那还会走通用块层吗?

    作者回复: 不会的

    2019-06-18
    1
  • 游弋云端
    老师,是否可以认为直接 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
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部