Ext3文件系统读写过程分析 - 面向对象网,存储技术,nosql,学习,对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > 计算机相关技术 > 存储技术 > 正文

Ext3文件系统读写过程分析

来源: www.bianceng.cn 阅读:

Ext3文件读写流程概述

Ext3文件系统在进行读写操作的时候,首先需要open相应的文件,然后再进行读写操作。在open操作时,Linux kernel会创建一个file对象描述这个文件。File对象和文件的dentry和inode对象建立联系,并且将ext3的文件操作方法、映射处理方法(address space)注册到file对象中。

Ext3文件读写过程会涉及到VFS层的page cache,并且通常的读写操作都会使用到这层page cache,目的是提高磁盘的IO性能。在Linux中后台会运行writeback线程定时同步pagecache和设备之间的数据。Page cache的方式虽然能够提高IO性能,但是也对数据的安全性带来了潜在影响。

本文的目的是分析ext3文件系统读写流程中的关键函数,对于page cache原理以及writeback机制将在后继文章中做深入分析。

关键数据结构

File数据结构是Linux用来描述文件的关键数据结构,该对象在一个文件被进程打开的时候被创建。当一个文件被关闭的时候,file对象也会被立即销毁。file数据结构不会被作为元数据信息持久化保存至设备。该数据结构定义如下:

struct file {  
    /*  
     * fu_list becomes invalid after file_free is called and queued via  
     * fu_rcuhead for RCU freeing  
     */
    union {  
        struct list_head    fu_list;  
        struct rcu_head     fu_rcuhead;  
    } f_u;  
    struct path     f_path;     /* 文件路径,包含文件dentry目录项和vfsmount信息 */
#define f_dentry    f_path.dentry  
#define f_vfsmnt    f_path.mnt  
    const struct file_operations    *f_op;  /* 文件操作函数集 */
     
    /*  
     * Protects f_ep_links, f_flags, f_pos vs i_size in lseek SEEK_CUR.  
     * Must not be taken from IRQ context.  
     */
    spinlock_t      f_lock;  
#ifdef CONFIG_SMP  
    int         f_sb_list_cpu;  
#endif  
    atomic_long_t       f_count;  
    unsigned int        f_flags;  
    fmode_t         f_mode; /* 文件操作模式 */
    loff_t          f_pos;  
    struct fown_struct  f_owner;  
    const struct cred   *f_cred;  
    struct file_ra_state    f_ra;  
     
    u64         f_version;  
#ifdef CONFIG_SECURITY  
    void            *f_security;  
#endif  
    /* needed for tty driver, and maybe others */
    void            *private_data;  
     
#ifdef CONFIG_EPOLL  
    /* Used by fs/eventpoll.c to link all the hooks to this file */
    struct list_head    f_ep_links;  
    struct list_head    f_tfile_llink;  
#endif /* #ifdef CONFIG_EPOLL */  
    struct address_space    *f_mapping; /* address space映射信息,指向inode中的i_mapping */
#ifdef CONFIG_DEBUG_WRITECOUNT  
    unsigned long f_mnt_write_state;  
#endif  
};

Tags:
相关文章列表: