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

操作系统文件管理:从FCB到inode,深入理解文件系统核心原理与实战 文件系统是操作系统中负责数据持久化存储的核心组件,它定义了数据在存储设备上的组织、管理与访问方式。其核心原理在于通过高效的数据结构(如FCB、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本身节省空间(无需数据块)和查找时间(不需要进一步的接盘)。此文件系统功能称为内联。索引节点和文件数据的严格分离从而可以利用现代文件系统时不再承担。


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


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



inode的指针结构

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


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

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


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

该结构本文附带图中所示部分。该结构允许的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;
};

Arm Neoverse CMN-700 SLC内存系统与缓存分区技术解析 现代处理器架构中,缓存一致性协议与内存子系统设计直接影响系统性能。Arm Neoverse CMN-700采用的SLC(System Level Cache)通过16-way组相联设计实现高效数据缓存,其物理地址索引机制支持灵活的way分区配置。在软件可配置内存(OCM)模式下,SLC可作为独立内存空间使用,通过寄存器控制实现模式切换与区域锁定。缓存分区技术则通过请求源分类way-based分配策略,满足实时性任务与吞吐量场景的不同需求。这些技术在5G基站、边缘计算等低延迟场景中具有重要应用价值,特别是C 阅读详情

相关推荐

Halcon学习之一维测量(3)

带定位器的测量。首先看一下“定位”是什么意思?回答:比如我们测量一个芯片,这时候我们设置一个测量矩形,来沿着测量目标进行测量。但是下一张当芯片的位置发生变化时,测量矩形的位置就不对了,就不是沿着测量目标了。这样就不对了!芯片在转,测量矩形也要跟着一起转才行。这个时候就需要“定位”来起作用了!定位之后得到这个芯片的旋转角度之后,测量矩形可以跟着这个角度转。这就是“定位”+“测量”,这是我们工业视觉常用的一个手法,在Halcon里面也是有例子展现的。

deep_love1314的博客 775

计算机考研——操作系统【文件管理】

【命题重点】 1.绝对目录与相对目录,文件控制块,文件共享的两种方式,文件的打开与关闭。 2.文件的集中物理结构及特点,FCB的存储方式及原因,混合索引分配方式。 3.各种磁盘调度算法的原理,特别是SCANCSCAN。 目录结构 【考点笔记1】绝对路径与相对路径        用户要访问某个文件时,用文件路径名标识文件,文件路径名是个字...

qq_44408319的博客 913

【Claude】Not logged in 错误:未登录状态的判断与 /login 认证路径 bug报错已解决

login 是首选修复:大多数 "Not logged in" 只需重新执行 /login检查系统时间:时间偏差是 Token 验证失败的常见原因避免密钥库被清理:将 Claude Code 添加到系统清理工具的白名单企业环境用 API Key:如果组织禁用 OAuth,使用 API Key 认证区分凭证类型:理解 Not logged in(无凭证)vs Invalid key(有但无效)

博客 7193

inode 及软链接、硬链接

inode:用来存储文件的元信息的索引节点。包括文件的创建者、创建日期、文件的大小等。Linux下一切皆文件,每个文件都有其对应的inodeinode内容:文件的字节数文i件拥有者的UserID文件的GroupID文件读、写、执行权限文件的时间戳:ctime(inode上一次变动时间) mtime(文件内容上次变动的时间) atime(文件上次打...

weixin_34341229的博客 143

索引结点的总结

这需要从目录结构说起。文件目录:包含有关文件的信息,信息主要有:属性,位置,所有权。这些信息主要是由OS进行管理。 目录管理的基本要求:从用户角度看待,目录在用户(应用程序)所需要的文件名文件之间提供一种映射。目录管理提供的是:按名存取。 共享系统中目录还需要提供控制访问文件的信息。重名问题主要通过树形结构来解决。 FCB:文件控制块。用于存放控制文件的各种信息的数据结构,实现了案名存取。

Bing's Blog 1万+

数据结构与算法之双向链表

数据结构与算法之双向链表 文章目录数据结构与算法之双向链表双向链表标题双向链表节点结构c++代码实现一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 双向链表 双向链表:每一个节点包含两个指针域,一个指针域(pre)指向前一个节点,一个指针域(next)指向后一个节点,另外包含一个数据域用于保存数据。因此双向链表可以向前查询,也可以向后查询。 双向链表单个节点示意图如下: 双向链表如下(改图出处:代码随想录): 标题双向链表节点结构c++代码实现 struct 提示:这里可以

weixin_45669649的博客 386

第 4 章:文件管理

4.1 文件系统基础 4.1.1 文件的基本概念 文件 (File)是以硬盘为载体的存储在计算机上的信息集合,文件可以是文本文档、图片、程序等。在系统运行时,计算机以进程为基本单位进行资源的调度分配;而在用户进行的输入、输出中,则以文件为基本单位。大多数应用程序的输入都是通过文件来实现的,其输出也都保存在文件中,以便信息的长期存储及将来的访问。当用户将文件用于程序的输入、输出时,还希望可以访问、修改保存文件等,实现对文件的维护管理,这就需要系统提供一个文件管理系统,操作系

知一的博客 1854

linux文件索引号,linux文件系统索引节点浅析

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

weixin_36053084的博客 3140

linux文件系统索引节点浅析

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

weixin_33812433的博客 1021

linux复制文件数据结构,7.28_Linux_ext数据结构inode的原理浅析、软硬链接的区别

inode结构浅析下图以ext文件系统为参考,以4k块大小分区,简单描述一下ext文件系统的数据结构原理,如果有任何错误,烦请各位指出inode 索引节点硬盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。扇区的大小,是2的N次方倍。分区的大小可以有多样,1k、2k、4k…以4k块大小来说明。4k块大小分为8个扇区,每个扇区对应512字节。每一块也称为bloc...

weixin_39983427的博客 174

SDcardFS文件系统浅析(二) - inode、dentry、super_block

SDcardFS文件系统浅析(二) - inode、dentry、super_block 在开始之前,首先得理解文件系统中inode、dentry、super_block的含义,下面简单介绍下这三个结构的作用,但不做代码层面分析,有个大概认知即可,如果详细了解,可以Google或者百度 inode inode索引节点,操作系统读取硬盘的时候,不会一个个扇区地读取,而是一次性连续读取多个扇区...

Kian_G 的博客 2017

Linux文件系统与索引节点inode浅析

我们知道磁盘在分区后还需要进行格式化,之后操作系统才能使用这个分区。而需要格式化的原因正是因为每种操作系统所设置的文件属性/权限并不相同。在Linux中,传统的磁盘文件系统是EXT,下面以EXT为例浅析Linux的文件系统与索引节点。 我们知道,文件的数据除了文件实际内容之外,通常还含有非常多的属性。文件系统通常会将权限与属性等数据放置到inode(index node...

weixin_33913332的博客 265

浅析文件系统索引节点

文件有两种数据组成,数据元数据,创建一个分区的时候,需要把分区格式化,就是创建文件系统,linux中有 ext4,xfs,ext3等文件系统,windows中有fat32 ntfs,exfat等文件系统,如果想在分区下写入存储数据,不光需要文件分区,还需要创建文件系统。现在文件系统主要分为inodeblock两大部分,inode就是存储文件的元数据的部分,文件系统根...

weixin_34067102的博客 1267

7.28_Linux_ext数据结构inode的原理浅析、软硬链接的区别

inode结构浅析下图以ext文件系统为参考,以4k块大小分区,简单描述一下ext文件系统的数据结构原理,如果有任何错误,烦请各位指出inode 索引节点硬盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。扇区的大小,是2的N次方倍。分区的大小可以有多样,1k、2k、4k...以4k块大小来说明。4k块大小分为8个扇区,每个扇区对应512...

weixin_34067980的博客 187

linux虚拟文件系统浅析

虚拟文件系统(VFS) 在我看来, "虚拟"二字主要有两层含义: 1, 在同一个目录结构中, 可以挂载着若干种不同的文件系统. VFS隐藏了它们的实现细节, 为使用者提供统一的接口; 2, 目录结构本身并不是绝对的, 每个进程可能会看到不一样的目录结构. 目录结构是由"地址空间(namespace)"来描述的, 不同的进程可能拥有不同的namespace, 不同的namespace可能有着不

ctthuangcheng 2639

Linux文件系统浅析

Linux文件系统浅析   作者:TP    撰写日期:2011-09-20 ~ 2011-09-25     自从上次面试中被问及设计一个文件系统的问题后,我就一直纠结中。文件到底有着什么样的数据结构去表现它们? 我们的操作系统是怎么去管理他们?前辈大侠们设计文件系统的过程中有些什么样的思考,它又是怎么一步步的演变成今天这样一个稳定而伸缩性强的体系结构的。        在查看一段

1107

linux下文件链接方法,浅析Linux下的链接文件

【摘 要】Linux在其文件系统中引入了链接文件用于方便用户使用系统管理。本文对Linux下的链接文件的实质、分类、用途进行了分析综述。【关键词】Linux;链接文件0 引言链接文件在Linux的文件系统中扮演重要角色,而其背后又涉及到索引节点(index node,又称inode)这一概念索引节点是Linux虚拟文件系统(VFS)的基本概念之一。通过剖析链接文件的实质,理解链接文件的分类与...

weixin_39724362的博客 337
上一篇: fork()函数解析
下一篇: 管道,匿名管道及其命名管道的解析
Csoul89757
博客等级 码龄10年 34粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值