📄 vfs+-+
字号:
any problems, send mails to sindybear@163.com
相关文件
/mm/filemap.c
####如果想了解文件系统的缓冲系统,应该参考内存管理中的相应章节
在整个linux系统中,缓冲是最复杂也最为头疼的一个部分。
总体来说,系统中有两大类缓冲,一个是文件系统级的缓冲,一个设备级的缓冲。
在文件系统这一级,所有的缓冲都是以页为单位进行分配,处理的。在每一个特定的文件系统中
每一个文件都有一个inode节点对应。在这个inode结构中,就有一个域i_data,这个域是一个
struct address_space结构,所有对应于这个文件的缓冲页面都保存在这个结构中,依次连接成一个
链。
而对于块设备而言,并没有页这个概念,只有buffer_head的概念,所以,在设备驱动程序这一层,
这些从文件系统来的缓冲页面又会被分解为一个个的buffer_head所指向的缓冲,这就存在一个同步问题,
这也是现在的linux的一个缺陷,在后续的版本中会进行改进。
下面是简要的示意图
struct file
struct dentry
inode----->i_mapping
clean_pages----->
dirty_pages----->struct page
list<---->struct page<------>struct page
……
virtual--->实际的物理页面地址(有可能是临时的)
在页面结构page中,又一个极为重要的域mapping,当一个页面用来作为文件系统的缓冲,或者作为交换分区
的缓冲的话,这个域一般存储各种文件系统的mapping结构,其实也就是从inode节点结构中的i_mapping中复制
过来的,所以,一个页面的具体的读写操作,如果在mapping不为空的情况下,就调用这个mapping中所属的
writepage,readpage等和具体的文件系统相关的操作函数进行实际的读写。当然,系统提供了诸如
block_write_full_page,block_read_full_page等通用操作函数,一般的文件系统只用使用这些就足够了
这里要提醒一点,一个inode所包含的i_mapping结构中只连接有struct page结构,真正的页面
是page结构中的virtul域所指向的。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -