Chinaunix首页 | 论坛 | 博客
  • 博客访问: 811674
  • 博文数量: 172
  • 博客积分: 3836
  • 博客等级: 中校
  • 技术积分: 1988
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-10 14:59
文章分类

全部博文(172)

文章存档

2014年(2)

2013年(1)

2012年(28)

2011年(141)

分类: LINUX

2011-02-10 16:14:27

 
今天在解决工作问题的同时也扩展我的知识面,有一种想深入研究文件系统的冲动,初略的研究了一下。
虚拟文件系统:VFS, virtual fiel system.
struct super_block {
 struct list_head s_list;  //维护super_blocks全局变量的成员
 dev_t   s_dev; 
 unsigned long  s_blocksize;
 unsigned long  s_old_blocksize;
 unsigned char  s_blocksize_bits;
 unsigned char  s_dirt;
 unsigned long long s_maxbytes;
 struct file_system_type *s_type;
 struct super_operations *s_op;
 struct dquot_operations *dq_op;
  struct quotactl_ops *s_qcop;
 struct export_operations *s_export_op;
 unsigned long  s_flags;
 unsigned long  s_magic;
 struct dentry  *s_root;
 struct rw_semaphore s_umount;
 struct semaphore s_lock;
 int   s_count;
 int   s_syncing;
 int   s_need_sync_fs;
 atomic_t  s_active;
 void                    *s_security;
 struct xattr_handler **s_xattr;
 struct list_head s_inodes;
 struct list_head s_dirty;
 struct list_head s_io; 
 struct hlist_head s_anon; 
 struct list_head s_files;
 struct block_device *s_bdev;
 struct list_head s_instances; //维护特定文件系统全局变量的成员
 struct quota_info s_dquot;
 int   s_frozen;
 wait_queue_head_t s_wait_unfrozen;
 char s_id[32];   
 void    *s_fs_info;

 struct semaphore s_vfs_rename_sem;

 u32     s_time_gran;
};
super_block存在于两个链表中,一个是系统所有super_block的链表, 一个是对于特定的文件系统的super_block链表. 前者是被维护在一个全局变量super_blocks中,这个全局变量定义在文件fs/super.c。后者也是被维护在一个全局变量file_systems中,它被定义在文件fs/filesystems.c中。下图给予形象的展示:
                                                                           
所有的super_block都存在于 super-blocks 链表中:                                                                           
                                                                           
            /------------\                                                 
 /--------->|super_blocks|<---     ..........       ---------------------\ 
 |          \------------/                                               | 
 |                                                                       | 
 |       super_block            super_block             super_block      | 
 |      +-----------+           +-----------+           +-----------+    | 
 \----->|  s_list   |<--------->|  s_list   |<--------->|  s_list   |<---/ 
        +-----------+           +-----------+           +-----------+      
        |  s_inodes |           |  s_inodes |           |  s_inodes |      
        +-----------+           +-----------+           +-----------+      
        |  s_files  |           |  s_files  |           |  s_files  |      
        +-----------+           +-----------+           +-----------+      
        |  s_dirty  |           |  s_dirty  |           |  s_dirty  |      
        +-----------+           +-----------+           +-----------+      
        |  s_op     |           |  s_op     |           |  s_op     |      
        +-----------+           +-----------+           +-----------+      
        |  s_fs_info|           |  s_fs_info|           |  s_fs_info|      
        +-----------+           +-----------+           +-----------+      
        |           |           |           |           |           |      
                                                                           
                                                                           
对于特定的文件系统, 该文件系统的所有的super block 都存在于file_sytem_type中的fs_supers链表中.
而所有的文件系统,都存在于file_systems链表中.这是通过调用register_filesystem接口来注册文件系统的.
int register_filesystem(struct file_system_type * fs)
                                                                            
                         file_system_type        file_system_type           
                    /--->+-------------+    /--->+-------------+            
                    |    |    name     |    |    |    name     |            
/--------------\    |    +-------------+    |    +-------------+     /------\
| file_systems |----/    |    next     |----/    |    next     |---->| NULL |
\--------------/         +-------------+         +-------------+     \------/
                         |   get_sb    |         |   get_sb    |            
                         +-------------+         +-------------+            
                         |   kill_sb   |         |   kill_sb   |            
                         +-------------+         +-------------+            
       /---------------->|  fs_supers  |<---\    |  fs_supers  |            
       |                 +-------------+    |    +-------------+            
       |                 |             |    |    |             |            
       |  /------------->+-------------+    |    +-------------+            
       |  |                     /\          |                               
       |  |                     ||          \------------.............------\
       |  |                     |\--------------------\                     |
       |  |                     |                     |                     |
       |  |     super_block     |      super_block    |     super_block     |
       |  |   +-------------+   |    +-------------+  |   +-------------+   |
       |  \---|  s_type     |   \----|    s_type   |  \---|   s_type    |   |
       |      +-------------+        +-------------+      +-------------+   |
       \----->| s_instances |<------>| s_instances |<---->| s_instances |---/
              +-------------+        +-------------+      +-------------+   
              |             |        |             |      |             |   
              +-------------+        +-------------+      +-------------+   
              |             |        |             |      |             |   
              +-------------+        +-------------+      +-------------+   
              |             |        |             |      |             |
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mychz2006/archive/2011/02/10/6177145.aspx
阅读(1868) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~