linux_文件系统
2021-10-11 18:09:28 4 举报
linux文件系统io整体协作流程
作者其他创作
大纲/内容
指向address_space模块,从而获得自身文件在内存中的缓存信息
文件操作?
file_operations
pagecache
a_ops
host
进程
d_ops
get_empty_filp()获取一个初始化的file结构体
adress_space_operations
file_struct
打开一个文件,返回一个file结构体指针
inode
i_opi_dentryi_fopi_sbi_mapping
将finlename从用户空间拷贝到内核空间
i_fop
fdt文件指针
s_files
filename
内核已打开的文件连表所有进程共享
进程级别的文件描述表和打开的文件对象信息
文件读写基本流程读文件1、进程调用库函数向内核发起读文件请求;2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;3、调用该文件可用的系统调用函数read()3、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;4、在inode中,通过文件内容偏移量计算出要读取的页;5、通过inode找到文件对应的address_space;6、在address_space中访问该文件的页缓存树,查找对应的页缓存结点:(1)如果页缓存命中,那么直接返回文件内容;(2)如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页;重新进行第6步查找页缓存;7、文件内容读取成功。 写文件前5步和读文件一致,在address_space中查询对应页的页缓存是否存在:6、如果页缓存命中,直接把文件内容修改更新在页缓存的页中。写文件就结束了。这时候文件修改位于页缓存,并没有写回到磁盘文件中去。7、如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页。此时缓存页命中,进行第6步。8、一个页缓存中的页如果被修改,那么会被标记成脏页。脏页需要写回到磁盘中的文件块。有两种方式可以把脏页写回磁盘:(1)手动调用sync()或者fsync()系统调用把脏页写回(2)pdflush进程会定时把脏页写回到磁盘同时注意,脏页不能被置换出内存,如果脏页正在被写回,那么会被设置写回标记,这时候该页就被上锁,其他写请求被阻塞直到锁释放。
已打开文件列表
f_opf_dentry
file指针
进行目录查找前的准备工作
files
维护进程信息,称之为 进程描述符
目录块项操作?
d_entry_operations
d_sb
path_openat
f_op
path_init主要是进行查找前的一些准备工作,最主要的作用是设置好nameidata数据结构中path、inode字段,即查找的起点。nameidata是用于保存path walking过程中的上下文和最后的查找结果
filename
adress_space
hostpage_treea_ops
path_init
目录操作项
d_inoded_sbd_opsname
d_inode
i_op
1.当前文件偏移量(调用read()和write()时更新,或使用lseek()直接修改)2.打开文件时所使用的状态标识(即,open()的flags参数)文件访问模式(如调用open()时所设置的只读模式、只写模式或读写模式)3.与信号驱动相关的设置4.对该文件i-node对象的引用5.文件类型(例如:常规文件、套接字或FIFO)和访问权限6.一个指针,指向该文件所持有的锁列表7.文件的各种属性,包括文件大小以及与不同类型操作相关的时间戳
i_mapping
i_sb
do_sys_open
host指针指向inode来获得文件的元数据
返回fd
inode_operations
page_tree
super_block
i-node存储在磁盘设备上,内核在内存中维护了一个副本,这里的i-node表为后者。副本除了原有信息,还包括:引用计数(从打开文件描述体)、所在设备号以及一些临时属性,例如文件锁。
fd与file关联
task_struct
单个文件描述符的信息file_struct中的文件描述符表实际是一个file类型的指针列表和“已打开文件列表”上的表项是相同的指针),可以支持动态扩展,每一个指针指向虚拟文件系统中文件列表模块的某一个已打开的文件
file结构一方面可从f_dentry链接到目录项模块以及inode模块获取所有和文件相关的信息,另一方面链接file_operations子模块,其中包含所有可以使用的系统调用函数,从而最终完成对文件的操作。这样,从进程到进程的文件描述符表,再关联到已打开文件列表上对应的文件结构,从而调用其可执行的系统调用函数,实现对文件的各种操作
f_dentry
i_dentry
1、多个进程可以同时指向一个打开文件对象(文件列表表项),例如父进程和子进程间共享文件对象;2、一个进程可以多次打开一个文件,生成不同的文件描述符,每个文件描述符指向不同的文件列表表项。但是由于是同一个文件,inode唯一,所以这些文件列表表项都指向同一个inode。通过这样的方法实现文件共享(共享同一个磁盘文件);
do_filp_open
address_space内部维护了一个树结构来指向所有的物理页结构page
0 条评论
回复 删除
下一页