linux mmap写硬盘,linux 文件写入流程(从vfs层, 通用block层到 scsi磁盘驱动

这篇博客深入探讨了Linux内核中从mmap写硬盘到文件系统、通用block层及SCSI磁盘驱动的过程。通过理解地址空间操作、page cache、请求队列和电梯算法等概念,揭示了数据如何从用户空间经过内核到硬件的路径。文章引用了经典书籍《Understanding the Linux Kernel》的相关章节,并提到了其他关键文档和论坛资源,为读者提供了详细的调用流程和关键数据结构。
摘要由CSDN通过智能技术生成

之前对scsi层和vfs层有点大概的了解。想学习一下通用block层的 page cache 和 那些电梯算法之类的。但还是没什么时间认真去看啊,那个东西也算比较复杂的。大概看下面这个书和简单浏览了一下源码。这书确实够经典啊,以前就全部大概翻了一下,但我读书一般也是很粗略的过一边,没什么印象。现在再去看,很多东西其实讲的还是很清楚的。后来在chinaunix论坛的 内核源码 模块也看网友发的帖子,也列了详细的文件读取和写入调用过程了。我还是自己参考找了一遍,关键是想了解不同的数据结构是怎么关联起来的。

读书笔记

这个书果然是经典啊,这几章内容都是相关的

Understanding the Linux Kernel, 3rd Edition

Chapter 14. Block Device Drivers

Chapter 15. The Page Cache

Chapter 16. Accessing Files

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=Documentation/block/biodoc.txt

https://www.kernel.org/doc/htmldocs/kernel-api/blkdev.html

后来在网上看到高手写的这两个帖子,源码调用列出来,比较详细啊,自己看代码时也参考了一下流程。

----------------------相关的数据街哦股---------------------------

file , inode                                // 有文件关联到  vfs层。 inode那里好像有个  block  device的 指针的。

block_device    vfs  operation     // 由磁盘驱动创建 ,

address_space       // 管理 page cache   的radix tree 查找,

->address_space_operations   //每个文件系统去定义

file  -> iovec->kiocb    // 把用户空闲的读写,描述为 offset 和  pos的 通用管理结构。

address_space_operations   // 文件系统注册的  真正的 读写page的操作,文件系统也使用 block层的很懂辅助函数来完成工作。

page , bufffer_head       //  表示 page cache 缓存在 每个page上面的 关系。  用于page cache层/

bio         // 由 buffer head 生成,可以多个合并在 一起成为 request,    page cache 层的 buffer head  和 磁盘request 之间的 转换结构吧。

gendisk       磁盘驱动发现 存储设备的时候创建这个对象,表示一个磁盘。 同时每个都有对应的request queue 。

request queue

request       //  通用的 block层 ,磁盘请求。  由 bio 生成,

scsi command            // scsi 层使用

--------------------------

vfs的 inode的初始化时,指定 address_space_operations

static const struct address_space_operations ext4_ordered_aops = {

.readpage               = ext4_readpage,

.readpages              = ext4_readpages,

.writepage              = ext4_writepage,      写脏页到磁盘

.write_begin            = ext4_write_begin,    ///generic_perform_write 调用到,准备好需要操作的 page cache对应的page

.write_end              = ext4_ordered_write_end,

.bmap                   = ext4_bmap,

.invalidatepage         = ext4_invalidatepage,

.releasepage            = ext4_releasepage,

.direct_IO              = ext4_direct_IO,

.migratepage            = buffer_migrate_page,

.is_partially_uptodate  = block_is_partially_uptodate,

.error_remove_page      = generic_error_remove_page,

};

----------------------------

block device  -> inode

-> struct  h

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值