参考自:https://blog.csdn.net/kidd_3/article/details/6909097?utm_source=copy
什么是文件系统?
文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构,在操作系统中负责管理和存储文件系统信息。
文件系统主要分为三部分:文件系统接口,对对象的操作和管理的软件集合,对象及属性
从系统的角度看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的数据进行保护和检索的系统。
具体来说,它负责为用户建立文件,存入,读取,修改,转存文件控制文件的存取及不使用时撤销文件等。
常见的文件系统有哪些?
FAT32/FAT16,exFAT,NTFS,ext4/ext3 ,
FAT文件系统是File Allocation Table的简称,将硬盘分为MBR区、DBR区、FAT区、FDT区、DADT区等5个区域。
NTFS文件系统是一个基于安全性的文件系统,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统
exFAT是一种适合于闪存的文件系统
Ext是 GNU/Linux 系统中标准的文件系统,对于中小型存取文件的性能极好
VFS: 为各类文件系统抽象一个统一的操作界面和应用编程接口,可以让应用的函数调用如:read,write等不需要关注硬件和文件系统的类型。
文件系统的读写流程?
文件系统对数据调用的处理分为用户空间和内核空间处理两部分
对文件进行读写操作时,首先需要调用VFS虚拟文件系统上的write,read接口,然后到具体的文件系统,如FAT32,然后到页高速缓冲存层(引入cache层的目的,是为了提高IO效率)、通用块层(接收上层发出的磁盘请求,并最终发出IO请求)、IO调度层(根据设置好的调度算法对通用块层的bio请求合并和排序,回调驱动层提供的请求处理函数,以处理具体的IO请求)、设备驱动层(它从上层取出IO请求,并根据该IO请求中指定的信息,通过向具体块设备的设备控制器发送命令的方式,来操纵设备传输数据)、和设备层(具体的物理设备)。
通过ext2_file_operations结构知道,上述函数最终会调用到do_sync_read函数,它是系统通用的读取函数。所以说,do_sync_read才是ext2层的真实入口。
该层入口函数 do_sync_read 调用函数 generic_file_aio_read ,后者判断本次读请求的访问方式,如果是直接 io (filp->f_flags 被设置了 O_DIRECT 标志,即不经过 cache)的方式,则调用 generic_file_direct_IO 函数;如果是 page cache 的方式,则调用 do_generic_file_read 函数。它会判断该页是否在页高速缓存,如果是,直接将数据拷贝到用户空间。如果不在,则调用page_cache_sync_readahead函数执行预读(检查是否可以预读),它会调用mpage_readpages。如果仍然未能命中(可能不允许预读或者其它原因),则直接跳转readpage,执行mpage_readpage,从磁盘读取数据。
通用块层
在缓存层处理末尾,执行mpage_submit_bio之后,会调用generic_make_request函数。这是通用块层的入口函数。
它将bio传送到IO调度层进行处理。
IO调度层
对bio进行合并、排序,以提高IO效率。然后,调用设备驱动层的回调函数,request_fn,转到设备驱动层处理。
设备驱动层
request函数对请求队列中每个bio进行分别处理,根据bio中的信息向磁盘控制器发送命令。处理完成后,调用完成函数end_bio以通知上层完成。