Linux虚拟文件系统VFS

文件系统中各种概念的关系梳理:
1. Linux为每个进程维护一个task_struct结构体来维护进程信息,task_struct可以被称为进程描述符(Process Descriptor)或者进程控制块(Process Control Block)
 
2. task_struct中有一个指针struct files_struct *files指向files_struct结构体,files_struct被称为文件描述符表。文件描述符表中的每个表项是指向一个已打开的文件的指针(file*)
 
Sam注: file是linux内核实现的,是内核用来管理文件的,一般我们不会接触到;而 FILE是标准C封装的,FILE中包含fd的信息,而且还包含IO缓冲,所以可以理解为FILE*是对fd的封装,我们在编写C文件操作时会经常用到。

 
  563 struct file {
  564         struct list_head        f_list;
  565         struct dentry           *f_dentry;
  566         struct vfsmount         *f_vfsmnt;
  567         struct file_operations  *f_op;
  568         atomic_t                f_count;
  569         unsigned int            f_flags;
  570         mode_t                  f_mode;
  571         loff_t                  f_pos;
  572         unsigned long           f_reada, f_ramax, f_raend, f_ralen, f_rawin;
  573         struct fown_struct      f_owner;
  574         unsigned int            f_uid, f_gid;
  575         int                     f_error;
  576
  577         unsigned long           f_version;
  578
  579         /* needed for tty driver, and maybe others */
  580         void                    *private_data;
  581
  582         /* preallocated helper kiobuf to speedup O_DIRECT */
  583         struct kiobuf           *f_iobuf;
  584         long                    f_iobuf_lock;
  585 };
 
3. 进程通过文件描述符表的索引,如
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
 来索引到一个file结构体实例,即表示一个打开的文件
 
4. file实例中有一个f_dentry成员,指向内存中dentry_cache中的一个dentry
            dentry: 实现了文件名和inode编号的映射,当然还有其他功能


 
5. inode: 一个文件对应的inode包含这个文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息,还有文件在数据块中存放位置的指针。每个文件(包括目录以及/proc目录下的文件)都有对应的inode,inode包括磁盘上的和内存中的inode,只有在需要时,Linux才会内存中创建inode.
inode又分两种:
(1) 磁盘上的inode: 跟在超级块后面的"i节点表"中,如下图所示
(2) 内存中的inode: 
 
 
 
参考文档
file:///C:/Users/nnnn/Desktop/VFS/linux%E5%91%BD%E4%BB%A4%E5%AE%9E%E8%B7%B5-%E5%85%B3%E4%BA%8Einode%20-%20%E5%8F%AF%E8%8B%A6%E5%8F%AF%E4%B9%90%20-%2051CTO%E6%8A%80%E6%9C%AF%E5%8D%9A%E5%AE%A2.htm
 
file:///C:/Users/nnnn/Desktop/VFS/linux%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B%E4%B9%8B%E5%9F%BA%E7%A1%80%E5%BF%85%E5%A4%87%EF%BC%88%E4%B8%89%EF%BC%89%EF%BC%9A%E6%96%87%E4%BB%B6%E6%8F%8F%E8%BF%B0%E7%AC%A6file%20descriptor%E4%B8%8Einode%E7%9A%84%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86_Linux_%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F_%E7%BD%91%E7%BB%9C%E5%AD%A6%E9%99%A2_%E5%A4%A9%E6%96%B0%E7%BD%91.htm
 
file:///C:/Users/nnnn/Desktop/VFS/Linux%20%E7%9A%84%E8%99%9A%E6%8B%9F%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%28%E5%BC%BA%E7%83%88%E6%8E%A8%E8%8D%90%29%20demo%E5%A4%A7%E5%85%A8.htm

猜你喜欢

转载自chuanwang66.iteye.com/blog/1900371