索引节点和inode的指针结构浅析

本博文参考维基百科:

索引节点是一个数据结构用来代表一个文件系统对象,其可以是各种事情,包括一个文件或一个目录。每个inode存储文件系统对象的数据的属性和磁盘块位置(多个)。的文件系统对象的属性可包括操纵元数据(例如,修改,JVSANTEN的访问,修改时间),以及雇主和权限数据(例如组ID,用户ID,权限)。

目录是分配给索引节点名称的列表。该目录包含自己,其母公司,及其每个孩子的条目。

详细信息
文件描述符,文件表和inode表中的Unix
文件系统依赖于数据结构有关的文件,文件内容旁边。前者被称为元数据描述数据-data。每个文件与相关联的索引节点,它是由一个整数,通常被称为所识别的i编号或节点号码。
索引节点存储有关的文件和目录(文件夹),如文件所有权,访问模式(读,写,执行权限),以及文件类型的信息。在许多类型的文件系统实现的,索引节点的最大数目被固定在创建文件系统,限制文件的文件系统能够容纳的最大数量。在文件系统中的inode一个典型的分配方案是总规模的百分之一。
inode号指标在设备上的已知位置的inode表。从节点号码,内核的文件系统驱动程序都可以访问的索引节点的内容,其中包括文件​​的位置 - 从而允许访问该文件。
一个文件的inode编号可以使用发现LS -i命令。该LS -i命令打印在报告的第一列的i节点号。
一些Unix风格文件系统,如ReiserFS的省略一节点表,但必须存储以便提供等效的功能等效的数据。该数据可以被称为统计数据,在参照统计 系统调用提供数据给节目。


文件名和目录的含义:
i节点不包含文件名,唯一的其他文件的元数据。
Unix目录是缔合结构,其每一个包含一个文件名,一个节点号码的列表。
文件系统驱动程序必须搜索寻找一个特定的文件名,目录,然后把文件名转化为正确的对应索引节点号。
该数据的操作系统内核的内存中表示称为结构的inode中的Linux。源自系统BSD使用术语v节点,随着v的v节点指的是内核的虚拟文件系统层。


POSIX的inode描述
该POSIX是强烈影响的传统标准要求的文件系统行为的UNIX文件系统。常规文件必须具有以下属性:
在该文件的大小的字节。
设备ID(本标识包含文件的设备)。
该用户ID文件的所有者。
该组ID的文件。
该文件模式,它决定了文件类型以及文件的所有者,其组以及其他人可以访问该文件。
其他系统和用户的标志,以进一步保护文件(限制其使用和修改)。
时间戳告诉当inode中的最后修改(的ctime,索引节点更改时间),该文件内容的最后一次修改(修改时间,修改时间),并最后访问(的atime,访问时间)。
一个链接数,告诉许多如何硬链接指向的inode。
指向存储文件内容的磁盘块(见inode的指针结构)。

该统计系统调用检索文件的inode编号和一些在inode信息。

索引节点和inode的指针结构浅析_第1张图片

内联
它可以使感非常小的文件存储在inode本身节省空间(无需数据块)和查找时间(不需要进一步的接盘)。此文件系统功能称为内联。索引节点和文件数据的严格分离从而可以利用现代文件系统时不再承担。


如果一个文件的数据中分配给指针的数据空间配合,可以方便地使用此空间。例如,EXT2及其后继存储符号链接(通常是文件名 ​​)在本方式的数据,如果数据是不超过60个字节(“快速符号链接”)。[8]


EXT4有一个名为inline_data一个文件系统选项,当文件系统创建过程中启用,将允许EXT4执行内联。作为一个inode的大小是有限的,这仅适用于非常小的文件。



inode的指针结构

i节点指针结构是由所采用的一种结构的inode在一个文件中的Unix文件系统(UFS)列出一个文件的的地址的数据块。它也被许多相关的文件系统,包括采用EXT3文件系统,颇受Linux用户。


结构
在过去,该结构可能是由十三岁指针,但大多数现代的文件系统使用15指针。这些指针包括(在inode假设15球)的:
十二指针直接指向该文件的数据块(直接指针)
一个单独的间接指针(指向指针的块,然后指向文件的数据块的指针)
一个双重间接指针(指向指向指针的其他块的然后指向该文件的数据块的指针块的指针)

一个三重间接指针(指向指向指向指针的其他块的然后指向该文件的数据块的指针的其他块的指针块的指针)

索引节点和inode的指针结构浅析_第2张图片

主要特点
固定的逻辑块大小

该结构本文附带图中所示部分。该结构允许的inode与固定的逻辑块大小描述文件系统非常大的文件。中央的机制是,地址(也称为块间接块)根据需要仅分配。例如,一个12块文件将被仅使用索引节点,因为它的块装配到可用的直接指针的数量描述。然而,13块文件需要一个间接块包含第十三地址。


位置数据易于
i节点指针结构不仅允许文件容易地分配给非连续块,它也允许在一个文件中的特定位置的数据可以很容易地定位。因为逻辑块大小是固定的,这是可能的。例如,如果每个块为8KB,文件数据,在120至128 kB的将被指向的第一间接块的第四指针(假定12直接指针在inode指针结构)。


间接块

不像i节点,其被固定在数量和在文件系统中的一个特殊的部分分配,所述间接块可以是任何数目的,并在文件系统中作为数据块的相同的部分被分配。在间接块的指针的数目是依赖于块的指针的块大小和尺寸。例如:用一个512字节的块大小,和4个字节的块的指针,每个间接块可以由128(512/4)的指针。




关联到文件的目录入口( dentry )结构. 设备驱动编写者正常地不需要关心 dentry 结构, 除了作为 filp->f_dentry->d_inode 存取 inode 结构.
file 结构如下所示:
  struct file {
  union {
  struct list_head fu_list; 文件对象链表指针linux/include/linux/list.h
  struct rcu_head fu_rcuhead; RCU(Read-Copy Update)是Linux 2.6内核中新的锁机制
  } f_u;
  struct path f_path; 包含dentry和mnt两个成员,用于确定文件路径
  #define f_dentry f_path.dentry f_path的成员之一,当前文件的dentry结构
  #define f_vfsmnt f_path.mnt 表示当前文件所在文件系统的挂载根目录
  const struct file_operations *f_op; 与该文件相关联的操作函数
  atomic_t f_count; 文件的引用计数(有多少进程打开该文件)
  unsigned int f_flags; 对应于open时指定的flag
  mode_t f_mode; 读写模式:open的mod_t mode参数
  off_t f_pos; 该文件在当前进程中的文件偏移量
  struct fown_struct f_owner; 该结构的作用是通过信号进行I/O时间通知的数据。
  unsigned int f_uid, f_gid; 文件所有者id,所有者组id
  struct file_ra_state f_ra; 在linux/include/linux/fs.h中定义,文件预读相关
  unsigned long f_version;
  #ifdef CONFIG_SECURITY
  void *f_security;
  #endif
  
  void *private_data;
  #ifdef CONFIG_EPOLL
  
  struct list_head f_ep_links;
  spinlock_t f_ep_lock;
  #endif
  struct address_space *f_mapping;
  };


文件结构体代表一个打开的文件,系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。在内核创建和驱动源码中,struct file的指针通常被命名为file或filp。



接下来,内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符。Linux2.6.27内核中,inode结构体具体定义如下:

struct inode {
struct hlist_node    i_hash;
struct list_head    i_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;   //该成员表示设备文件的inode结构,它包含了真正的设备编号。
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;
unsigned int        i_blkbits;
blkcnt_t        i_blocks;
unsigned short          i_bytes;
umode_t            i_mode;
spinlock_t        i_lock;    
struct mutex        i_mutex;
struct rw_semaphore    i_alloc_sem;
const struct inode_operations    *i_op;
const struct file_operations    *i_fop;    
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; //该成员表示字符设备的内核的 内部结构。当inode指向一个字符设备文件时,该成员包含了指向struct cdev结构的指针,其中cdev结构是字符设备结构体。
};
int            i_cindex;


__u32            i_generation;


#ifdef CONFIG_DNOTIFY
unsigned long        i_dnotify_mask;
struct dnotify_struct    *i_dnotify;
#endif


#ifdef CONFIG_INOTIFY
struct list_head    inotify_watches;
struct mutex        inotify_mutex;    
#endif


unsigned long        i_state;
unsigned long        dirtied_when;    


unsigned int        i_flags;


atomic_t        i_writecount;
#ifdef CONFIG_SECURITY
void            *i_security;
#endif
void            *i_private;
};

你可能感兴趣的:(struct,File,索引节点,inode的指针结构浅析)