之前对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