读书笔记深入linux内核架构Chapter8part2

文件系统的操作

l  注册文件系统

²  文件系统信息用struct file_system_type来描述。

²  fs/super.cregister_filesystem注册文件系统。

 l  装载和卸载文件系统

²  文件系统的装载由mount系统调用发出。

²  UNIX使用单一的文件系统层次描述,新的文件系统集成到其中(mount到这个文件系统中)。

²  装载点:原来的文件系统的一个目录,用来挂载新的文件系统。挂载后,该目录的内容变成新文件系统的根目录的内容,原有内容消失直到被挂载的文件系统卸载。装载可以嵌套。

²  每个装载的文件系统都对应一个struct vfsmount结构体。该结构体描述了父文件系统,挂载点的dentry,指向超级块的指针

²  装在操作开始于读取超级块。超级块用struct super_block来描述。其中记录了块大小、文件系统一般类型信息、指向全局根目录的dentry、记录脏inode的链表表头、记录打开的文件的链表、以及struct super_operation(其中包含了丰富的函数:对inode的操作函数---标记为脏、读取、删除;对超级块的操作;对文件系统的操作)。

 l  mount  unmount系统调用,自动过期(定时自动卸载),伪文件系统(ramfs  tmpfs  procfs  sysfs

 

文件的操作

l  查找inode

²  一个常见的文件操作是根据文件名查找inode(文件名àinode)。

struct nameidata结构体用来记录查找结果。

struct nameidata {

struct dentry *dentry;      //找到的结果dentry

struct vfsmount *mnt;       //找到的结果vfsmount

struct qstr last;        //要查找的文件名

unsigned int flags;        

...

}

²  内核使用path_lookup查找路径或文件名。

int fastcall path_lookup(  const char *name, unsigned int flags,

struct nameidata *nd)

  l  打开文件

²  得到一个未被使用的fd

²  do_filp_namei:调用path_lookup查找文件名对应的inodenameidata_to_flip初始化预读结构。

²  fd填入task_structfd[]数组。

  

l  读取和写入(读写类似)

²  函数fget_light根据fd找到struct file

²  函数file_pos_read返回f_pos

²  vfs读取:f_op->read或者do_sync_read(缺省标准例程)

²  更新f_pos

 读写操作的难点在于Linux系统中精细复杂的缓冲区和缓存系统。

  

原文地址:https://www.cnblogs.com/apprentice89/p/2868749.html