文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>文件系统学习笔记

文件系统学习笔记

时间:2010-06-29  来源:dong066

文件系统学习笔记

每个驱动器:4个主分区  逻辑分区从5开始,一般2为扩展分区。

Linux看待文件系统为一组对象:超级快,inode ,dentry ,数据块(文件)

超级快在每个文件系统的根上,用来描述和维护文件系统的状态,文件系统管理的对象为inode,inode包含所有的元数据。Dentry,实现名称和inode之间的映射,

/proc/filesystems 下包含了所有挂载的文件系统。

注册文件系统:

#include <linux/fs.h>

extern int register_filesystem(struct file_system_type *);

反之:

extern int unregister_filesystem(struct file_system_type *);

文件系统结构体:

struct file_system_type {

       const char *name;

       int fs_flags;

       int (*get_sb) (struct file_system_type *, int,

                     const char *, void *, struct vfsmount *);

       void (*kill_sb) (struct super_block *);

       struct module *owner;

       struct file_system_type * next;

       struct list_head fs_supers;

 

       struct lock_class_key s_lock_key;

       struct lock_class_key s_umount_key;

 

       struct lock_class_key i_lock_key;

       struct lock_class_key i_mutex_key;

       struct lock_class_key i_mutex_dir_key;

       struct lock_class_key i_alloc_sem_key;

};

VFS中维护已近挂载的文件系统结构体为:

struct vfsmount {

       struct list_head mnt_hash;

       struct vfsmount *mnt_parent;       /* fs we are mounted on */

       struct dentry *mnt_mountpoint;    /* dentry of mountpoint */

       struct dentry *mnt_root; /* root of the mounted tree */

       struct super_block *mnt_sb;  /* pointer to superblock */

       struct list_head mnt_mounts; /* list of children, anchored here */

       struct list_head mnt_child;     /* and going through their mnt_child */

       int mnt_flags;

       /* 4 bytes hole on 64bits arches */

       const char *mnt_devname;    /* Name of device e.g. /dev/dsk/hda1 */

       struct list_head mnt_list;

       struct list_head mnt_expire;   /* link in fs-specific expiry list */

       struct list_head mnt_share;    /* circular list of shared mounts */

       struct list_head mnt_slave_list;/* list of slave mounts */

       struct list_head mnt_slave;     /* slave list entry */

       struct vfsmount *mnt_master;       /* slave is on master->mnt_slave_list */

       struct mnt_namespace *mnt_ns;    /* containing namespace */

       int mnt_id;                   /* mount identifier */

       int mnt_group_id;         /* peer group identifier */

       /*

        * We put mnt_count & mnt_expiry_mark at the end of struct vfsmount

        * to let these frequently modified fields in a separate cache line

        * (so that reads of mnt_flags wont ping-pong on SMP machines)

        */

       atomic_t mnt_count;

       int mnt_expiry_mark;           /* true if marked for expiry */

       int mnt_pinned;

       int mnt_ghosts;

#ifdef CONFIG_SMP

       int *mnt_writers;

#else

       int mnt_writers;

#endif

};

struct super_block {

#ifdef CONFIG_SECURITY

#endif

         Cannot be worse than a second */

};

对超级快的操作的结构体:

struct super_operations {

     struct inode *(*alloc_inode)(struct super_block *sb);

       void (*destroy_inode)(struct inode *);

     void (*dirty_inode) (struct inode *);

       int (*write_inode) (struct inode *, int);

       void (*drop_inode) (struct inode *);

       void (*delete_inode) (struct inode *);

       void (*put_super) (struct super_block *);

       void (*write_super) (struct super_block *);

       int (*sync_fs)(struct super_block *sb, int wait);

       int (*freeze_fs) (struct super_block *);

       int (*unfreeze_fs) (struct super_block *);

       int (*statfs) (struct dentry *, struct kstatfs *);

       int (*remount_fs) (struct super_block *, int *, char *);

       void (*clear_inode) (struct inode *);

       void (*umount_begin) (struct super_block *);

 

       int (*show_options)(struct seq_file *, struct vfsmount *);

       int (*show_stats)(struct seq_file *, struct vfsmount *);

#ifdef CONFIG_QUOTA

       ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);

       ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);

#endif

       int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t);

};

Inode 和dentry :

Indoe 表示元数据,表示为一个对象,具有唯一标示符。

inode_operations 定义直接在 inode 上执行的操作,而 file_operations 定义与文件和目录相关的方法(标准系统调用)。

 

struct inode {

       struct hlist_node     i_hash;

       struct list_head       i_list;             /* backing dev IO list */

       struct list_head       i_sb_list;

       struct list_head       i_dentry;

       unsigned long        i_ino;

       atomic_t         i_count;

       unsigned int           i_nlink;

       uid_t                     i_uid;

       gid_t                     i_gid;

       dev_t                    i_rdev;

       u64                i_version;

       loff_t                    i_size;

#ifdef __NEED_I_SIZE_ORDERED

       seqcount_t             i_size_seqcount;

#endif

       struct timespec              i_atime;

       struct timespec              i_mtime;

       struct timespec              i_ctime;

       blkcnt_t          i_blocks;

       unsigned int           i_blkbits;

       unsigned short          i_bytes;

       umode_t                i_mode;

       spinlock_t              i_lock;    /* i_blocks, i_bytes, maybe i_size */

       struct mutex           i_mutex;

       struct rw_semaphore      i_alloc_sem;

       const struct inode_operations *i_op;

       const struct file_operations    *i_fop;    /* former ->i_op->default_file_ops */

       struct super_block  *i_sb;

       struct file_lock       *i_flock;

       struct address_space       *i_mapping;

       struct address_space       i_data;

#ifdef CONFIG_QUOTA

       struct dquot           *i_dquot[MAXQUOTAS];

#endif

       struct list_head       i_devices;

       union {

              struct pipe_inode_info   *i_pipe;

              struct block_device *i_bdev;

              struct cdev             *i_cdev;

       };

       __u32                   i_generation

#ifdef CONFIG_FSNOTIFY

       __u32                   i_fsnotify_mask; /* all events this inode cares about */

       struct hlist_head     i_fsnotify_mark_entries; /* fsnotify mark entries */

#endif

#ifdef CONFIG_INOTIFY

       struct list_head       inotify_watches; /* watches on this inode */

       struct mutex           inotify_mutex;       /* protects the watches list */

#endif

       unsigned long        i_state;

       unsigned long        dirtied_when;  /* jiffies of first dirtying */

       unsigned int           i_flags;

       atomic_t         i_writecount;

#ifdef CONFIG_SECURITY

       void               *i_security;

#endif

#ifdef CONFIG_FS_POSIX_ACL

       struct posix_acl      *i_acl;

       struct posix_acl      *i_default_acl;

#endif

       void               *i_private; /* fs or device private pointer */

};

直接对inode的操作:

 

struct inode_operations {

       int (*create) (struct inode *,struct dentry *,int, struct nameidata *);

       struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);

       int (*link) (struct dentry *,struct inode *,struct dentry *);

       int (*unlink) (struct inode *,struct dentry *);

       int (*symlink) (struct inode *,struct dentry *,const char *);

       int (*mkdir) (struct inode *,struct dentry *,int);

       int (*rmdir) (struct inode *,struct dentry *);

       int (*mknod) (struct inode *,struct dentry *,int,dev_t);

       int (*rename) (struct inode *, struct dentry *,

                     struct inode *, struct dentry *);

       int (*readlink) (struct dentry *, char __user *,int);

       void * (*follow_link) (struct dentry *, struct nameidata *);

       void (*put_link) (struct dentry *, struct nameidata *, void *);

       void (*truncate) (struct inode *);

       int (*permission) (struct inode *, int);

       int (*check_acl)(struct inode *, int);

       int (*setattr) (struct dentry *, struct iattr *);

       int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);

       int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);

       ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);

       ssize_t (*listxattr) (struct dentry *, char *, size_t);

       int (*removexattr) (struct dentry *, const char *);

       void (*truncate_range)(struct inode *, loff_t, loff_t);

       long (*fallocate)(struct inode *inode, int mode, loff_t offset,

                       loff_t len);

       int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,

                    u64 len);

};

对文件和目录相关的操作:

struct file_operations {

       struct module *owner;

       loff_t (*llseek) (struct file *, loff_t, int);

       ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

       ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

       ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

       ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

       int (*readdir) (struct file *, void *, filldir_t);

       unsigned int (*poll) (struct file *, struct poll_table_struct *);

       int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

       long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);

       long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

       int (*mmap) (struct file *, struct vm_area_struct *);

       int (*open) (struct inode *, struct file *);

       int (*flush) (struct file *, fl_owner_t id);

       int (*release) (struct inode *, struct file *);

       int (*fsync) (struct file *, struct dentry *, int datasync);

       int (*aio_fsync) (struct kiocb *, int datasync);

       int (*fasync) (int, struct file *, int);

       int (*lock) (struct file *, int, struct file_lock *);

       ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);

       unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);

       int (*check_flags)(int);

       int (*flock) (struct file *, int, struct file_lock *);

       ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);

       ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);

       int (*setlease)(struct file *, long, struct file_lock **);

};

相关阅读 更多 +
排行榜 更多 +
火柴人勇士3

火柴人勇士3

休闲益智 下载
射击之王

射击之王

飞行射击 下载
危险战争

危险战争

飞行射击 下载