文件系统与块设备

来源:互联网 发布:java代码格式化工具 编辑:程序博客网 时间:2024/05/18 03:05

1.高速缓冲区位于VFS与具体文件系统之间。

2.磁盘中文件节点中含有strcut address_space字段,该结构与磁盘文件节点对应

3.一个struct address_space含有一个或多个缓存页,缓存页的组织方式是通过基树组织起来的便于搜索

4.每个缓存页中包含多个缓存块,缓存页的内容在磁盘上不一定连续,但缓冲块中的内容在磁盘上连续

5.每个缓冲块对应一个缓冲区首部的结构体,该结构体中主要包含了缓冲块内容对应磁盘的物理位置,缓冲区首部自形成链表

6.内核首先判断要读写的inode的磁盘块在不在该inode的缓存块中,如果在,直接对其读写,不在,创建新的缓存页和缓存块及缓冲区首部,把他们加入对应的address_space,

如果address_space不存在,为该节点创建address_space(具体怎么判断是否在缓存区需要进一步研究,查缓存区首部链表?)

7.同步刷新磁盘或pdflush周期调度将缓冲区的数据提交个磁盘,提交的手段是通过struct bio,调用submit_bio

8.bio分为两种,实时的和非实时的,实时的直接提交,大部分都是非实时的,要将bio插入到合适的request中,bio包含一个或多个缓存块中的数据,一个request包含一个或

多个bio,request中请求的数据在磁盘上是连续的

9.磁盘上连续的request可能被合并成一个request,磁盘上顺序的request被重新排序(36采用NOP调度算法,只进行合并,不进行排序)

10..排序好的请求被发送给AHCI

待续。。。


一下对几个重要的函数解析:

对文件的读写通过generic_file_write进行,初始化一些数据结构之后,调用__generic_file_aio_write_nolock,其中,实际对缓存页进行读写的函数是

static ssize_t generic_perform_write(struct file *file, struct iov_iter *i, loff_t pos);该函数执行如下:

1.获得该文件节点的address_space,调用块设备文件节点address_space的write_begain方法。该方法主要


原创粉丝点击