linux文件系统总结

apue中:其中进程表项内部的数组又称为 进程打开文件表   

另外一个角度:

从linux内核角度开:

task_struct是进程描述符对应上面的进程表项,在task_struct描述符中有struct file_struct*类型的变量file,指向struct file_struct结构。

1.file_struct:该结构体有进程描述符中的files域指向,如下:

struct files_struct {

        atomic_t    count;              /* structure‘s usage count */

        spinlock_t  file_lock;          /* lock protecting this structure */

        int         max_fds;            /* maximum number of file objects */

        int         max_fdset;          /* maximum number of file descriptors */

        int         next_fd;            /* next file descriptor number */

        struct file **fd;               /* array of all file objects */

        fd_set      *close_on_exec;     /* file descriptors to close on exec() */

        fd_set      *open_fds;           /* pointer to open file descriptors */

        fd_set      close_on_exec_init; /* initial files to close on exec() */

        fd_set      open_fds_init;      /* initial set of file descriptors */

        struct file *fd_array[NR_OPEN_DEFAULT]; /* default array of file objects */

};

该结构中有一个struct file *fd_array[NR_OPEN_DEFAULT]的数组,对应上面的进程打开文件表,其数组的元素指向struct file 结构,此结构对应apue中的文件表
2、文件对象:文件对象表示进程以打开的文件。文件对象仅仅在进程观点上代表已打开文件,它反过来指向目录项对象(反过来指向索引节点),其实只有目录项对象才表示已打开的实际文件。虽然一个文件对应的文件对象不是唯一的,但对应的索引节点和目录项对象无疑是唯一的。文件对象由file结构表示,定义在文件linux/fs.h中,如下:

struct file {

        struct list_head       f_list;        /* list of file objects */

        struct dentry          *f_dentry;     /* associated dentry object */

        struct vfsmount        *f_vfsmnt;     /* associated mounted fs */

        struct file_operations *f_op;         /* file operations table */

        atomic_t               f_count;       /* file object‘s usage count */

        unsigned int           f_flags;       /* flags specified on open */

        mode_t                 f_mode;        /* file access mode */

        loff_t                 f_pos;         /* file offset (file pointer) */

        struct fown_struct     f_owner;       /* owner data for signals */

        unsigned int           f_uid;         /* user‘s UID */

        unsigned int           f_gid;         /* user‘s GID */

        int                    f_error;       /* error code */

        struct file_ra_state   f_ra;          /* read-ahead state */

        unsigned long          f_version;     /* version number */

        void                   *f_security;   /* security module */

        void                   *private_data; /* tty driver hook */

        struct list_head       f_ep_links;    /* list of eventpoll links */

        spinlock_t             f_ep_lock;     /* eventpoll lock */

        struct address_space   *f_mapping;    /* page cache mapping */

};

文件表项中包括了文件描述符的状态标志,文件的偏移量(或者说文件的位置),和v节点指针(unix独有)

struct file 包括我们通常说的文件描述符引用计数,文件偏移量,文件模式等等以系列核心功能,同时又指向文件file_operation结构的指针

struct file_operations {

        struct module *owner;

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

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

        ssize_t (*aio_read) (struct kiocb *, char *, size_t, loff_t);

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

        ssize_t (*aio_write) (struct kiocb *, const char *, size_t, 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);

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

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

        int (*flush) (struct file *);

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

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

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

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

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

        ssize_t (*readv) (struct file *, const struct iovec *,

                          unsigned long, loff_t *);

        ssize_t (*writev) (struct file *, const struct iovec *,

                           unsigned long, loff_t *);

        ssize_t (*sendfile) (struct file *, loff_t *, size_t,

                             read_actor_t, void *);

        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 flags);

        int (*dir_notify) (struct file *filp, unsigned long arg);

        int (*flock) (struct file *filp, int cmd, struct file_lock *fl);

};

struct file包括指向struct dentry 的指针

struct dentry {

        atomic_t                 d_count;      /* usage count */

        unsigned long            d_vfs_flags;  /* dentry cache flags */

        spinlock_t               d_lock;       /* per-dentry lock */

        struct inode             *d_inode;     /* associated inode */

        struct list_head         d_lru;        /* unused list */

        struct list_head         d_child;      /* list of dentries within */

        struct list_head         d_subdirs;    /* subdirectories */

        struct list_head         d_alias;      /* list of alias inodes */

        unsigned long            d_time;       /* revalidate time */

        struct dentry_operations *d_op;        /* dentry operations table */

        struct super_block       *d_sb;        /* superblock of file */

        unsigned int             d_flags;      /* dentry flags */

        int                      d_mounted;    /* is this a mount point? */

        void                     *d_fsdata;    /* filesystem-specific data */

        struct rcu_head          d_rcu;        /* RCU locking */

        struct dcookie_struct    *d_cookie;    /* cookie */

        struct dentry            *d_parent;    /* dentry object of parent */

        struct qstr              d_name;       /* dentry name */

        struct hlist_node        d_hash;       /* list of hash table entries */

        struct hlist_head        *d_bucket;    /* hash bucket */

        unsigned char            d_iname[DNAME_INLINE_LEN_MIN]; /* short name */

};

由于目录项并非真正保存在磁盘上,所有目录项没有对应的磁盘数据结构,VFS根据字符串形式的路径名现场创建它,目录项结构体也没有是否被修改的标志。目录项对象有三种状态:被使用,未被使用和负状态。一个被使用的目录项对应一个有效的索引节点(即d_inode指向相应的索引节点)并且该对象存在一个或多个使用者(即d_count为正值)。一个未被使用的目录项对应一个有效的索引节点(d_inode指向一个索引节点),但是VFS当前并未使用它(d_count为0)。该目录项对象仍然指向一个有效对象,而且被保留在内存中以便需要时再使用它。显然这样要比重新创建要效率高些。一个负状态的目录项没有对应的有效索引节点(d_inode为NULL).因为索引节点已被删除了,或路径不再正确了,但是目录项仍然保留,以便快速解析以后的路径查询。虽然负的状态目录项有些用处,但如果需要的话话,还是可以删除的,可以销毁它。

只是路径对应的innode节点

时间: 2024-10-13 02:05:13

linux文件系统总结的相关文章

linux 文件系统笔记

文件格式: windows:PE linux:  ELF 文件系统: rootfs FHS:规定linux应该创建哪些目录 /下的目录结构: /boot: 系统启动相关的文件,如内核,initrd,以及 grub(bootloader) /dev :设备文件(例如:光盘,cdrom) 类型: 块设备:随机访问, 数据块 字符设备:线性访问, 以字节为单位 设备号:主设备号(major),次设备号(minor) /etc:  配置文件(绝大多数为纯文本格式) /home: 用户的家目录,默认为/h

【转】LINUX文件系统剖析

引自:http://www.ibm.com/developerworks/cn/linux/l-linux-filesystem/   在文件系统方面,Linux? 可以算得上操作系统中的 "瑞士军刀".Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统.对于使用标准的和比较奇特的文件系统以及开发文件系统来说,Linux 是极好的平台.本文讨论 Linux 内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器),然后介绍将文件系统连接在一起的主要结构.

Linux文件系统

文件系统与目录结构 文件系统 1.文件和目录被组织成一个单根倒置数结构 2.文件系统从根目录下开始,用"/"表示 3.根文件系统(rootfs):root filesystem 4.文件名称区分大小写 5.以.开头的文件为隐藏文件 6.路径分隔符:/ 7.文件的两类数据: 元数据(metadata)和 数据(data) 8.文件系统分层结构:LSB (Linux Standard Base) 9.FHS(Filesystem Hierarchy System) 文件名规则 1.文件名最

linux文件系统索引节点浅析

索引节点,Inode是Index Node的缩写,存储于文件系统上的任何文件都可以用索引节点来表示,所以也可以说索引节点是整个linux文件系统的基础.操作系统在读取硬盘的时候不是一个块一个块的来读取信息,因为这样做的话效率太低,文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者.文件的创建日期.文件的大小等等.这种储存文件元信息的区域就叫做inode,中文译名为"索引节点". 在Linux系统中,文件系统主要分为两部分,

嵌入式 Linux根文件系统移植(一)——Linux文件系统简介

嵌入式 Linux根文件系统移植(一)--Linux文件系统简介 本文对文件系统分析的代码来源于linux 2.6.35.7版本. 一.文件系统的体系结构 文件系统是对存储设备上的数据和元数据进行组织的机制,便于用户和操作系统的交互.Linux支持多种文件系统,文件系统接口实现为分层的体系结构,将用户接口层.文件系统实现和操作存储设备的驱动程序分隔开.Linux文件系统的体系结构如下: 用户空间包含一些应用程序(例如,文件系统的使用者)和 GNU C库(glibc),为文件系统调用(打开.读取.

linux --> 文件系统十问

文件系统十问 参考:http://djt.qq.com/article/view/620 关于Linux文件系统相关的问题: 1.机械磁盘随机读写时速度非常慢,操作系统是采用什么技巧来提高随机读写的性能的? 2.touch一个新的空文件占用磁盘空间吗? 占用的话占用多少? 3.新建一个空目录占用磁盘空间吗?占用多少?和新建一个文件相比,哪个占用的更大? 4.你知道文件名是记录在磁盘的什么地方吗? 5.文件名最长多长?受什么制约? 6.文件名太长了会影响系统性能吗?为什么会产生影响? 7.一个目录

linux文件系统学习总结

linux最优秀的特点在于它是多用户多任务的环境,而且对于linux来讲一切皆文件,提到文件这个概念就免不了提文件相关的权限与属性的概念,那相关文件的属性记录在硬盘的哪个地方呢?这就需要了解linux的文件系统是如何记录文件,如何读取文件. 大家都知道硬盘作为存储介质,如果要使用硬盘存储数据需要对硬盘进行分区,格式化之后才可以存储数据.那为什么要对硬盘进行分区呢?因为我们必须要告诉操作系统:"这块硬盘可以访问的区域是有A柱面到B柱面",只有这样,操作系统才能控制硬盘磁头去A~B范围内的

Vim,find,bash,Linux文件系统的特殊权限2015.8.30作业

一   Vim 1.vim的使用方法 1.1 三种模式化 编辑模式.输入模式.末行模式 1.2 模式转换 编辑模式 --> 输入模式: i:在当前光标所在字符的前面,转为输入模式 a:在当前光标所在字符的后面,转为输入模式 o:在当前光标所在行的下方,新建一行,并转为输入模式 I:在当前光标所在行的行首,转为输入模式 A:在当前光标所在行的行尾,转为输入模式 O:在当前光标所在行的上方,新建一行,并转为输入模式 输入模式 --> 编辑模式:ESC 编辑模式 --> 末行模式:: 末行模式

攻城狮在路上(叁)Linux(二十六)--- linux文件系统的特殊查看与操作

一.boot sector 与 super block的关系: 1.boot sector用于存放引导装载程序,占用1024个字节. 2.super block的大小也为1024字节. 3.若block大小为1k,则boot sector和super block各占一个block. 4.若block大于1K(2K/4K)时,则两者都位于第一个block中. 二.磁盘空间的浪费问题:暂不考虑. 三.利用GUN的parted命令进行分区行为: 因为fdisk不支持高于2TB的分区. 命令格式: pa

操作系统——linux文件系统初实现——为fileSystem添加驱动,让linux可以识别。

0.我的理解,所为驱动,就是用户可以通过自己的应用程序访问你的文件系统.而我恰恰相反. 1.我是谢了字符驱动,让我的fileSystem去做应用程序,同样可以被linux系统识别. 2.其实我对驱动理解也不深,暂且贴代码. 3.驱动程序: /*chardev.c 驱动程序*/ #include <linux/kernel.h> #include <linux/fs.h>/*for file-f_op*/ #include <linux/module.h> #includ