Linux kernel 什么';这两者的区别是什么;inode->;i_数据和索引节点->;i_映射

Linux kernel 什么';这两者的区别是什么;inode->;i_数据和索引节点->;i_映射,linux-kernel,Linux Kernel,我发现在大多数情况下,I_数据只是I_映射的解引用数据,如下所示,为什么在一个inode结构中设置两个相同的值 crash> struct inode ffffffc073c1f360 -o struct inode { ... [ffffffc073c1f4a8] struct file_lock *i_flock; **[ffffffc073c1f4b0] struct address_space i_data;** [ffffffc073c1f558] struct l

我发现在大多数情况下,I_数据只是I_映射的解引用数据,如下所示,为什么在一个inode结构中设置两个相同的值

crash> struct inode ffffffc073c1f360 -o
struct inode {
 ...
  [ffffffc073c1f4a8] struct file_lock *i_flock;
  **[ffffffc073c1f4b0] struct address_space i_data;**
  [ffffffc073c1f558] struct list_head i_devices;
 ...   

crash> struct inode ffffffc073c1f360
struct inode {
...
  i_op = 0xffffffc0007ad1c0 <ext4_file_inode_operations>, 
  i_sb = 0xffffffc002010000, 
  **i_mapping = 0xffffffc073c1f4b0,** 
  i_security = 0xffffffc07230d050, 
...
crash>struct inode ffffff c073c1f360-o
结构节点{
...
[FFFFFF C073C1F4A8]结构文件_lock*i_flock;
**[FFFFFF C073C1F4B0]结构地址空间输入数据**
[FFFFFF C073C1F558]结构列表头输入设备;
...   
崩溃>结构索引节点FFFFFF C073C1F360
结构节点{
...
i_op=0xFFFFC0007AD1C0,
i_sb=0xFFFFC002010000,
**i_映射=0xFFFFC073C1F4B0,**
i_security=0xffffffc07230d050,
...

地址空间始终处理页面缓存。在访问页面缓存中的页面时,如果页面的所有者是文件,则地址空间对象嵌入VFS inode对象的i_数据字段中。inode的i_映射字段始终指向包含inode数据的页面所有者的地址空间对象。ad的主机字段dress_space object指向内嵌描述符的inode对象

例如,如果页面属于存储在ext4文件系统中的常规文件,则VFS inode的i_数据指向该文件的inode,inode的i_映射字段指向同一inode的i_数据,address_space object的主机字段指向同一inode

然而,事情并非总是那么简单。假设一个页面包含从块设备文件读取的数据,其中包含块设备的“原始”数据,地址空间嵌入到bdev文件的“主”inode中,该文件是与块设备相关联的特殊文件系统(由bd_inode引用)因此,块设备文件的inode的i_映射字段指向 嵌入主索引节点中的地址空间对象;相应地,地址空间对象的主机字段指向主索引节点。这样,包含从块设备读取的数据的所有页面都具有相同的地址空间对象,即使它们是通过引用不同的块设备文件访问的。 因此,当页面属于常规文件或阻止设备特殊文件时,两者之间有细微区别。

来源:

i_数据是“此inode读取/写入的页面”

i_映射是“我应该向谁索取页面?”

注意,每个文件系统之外的所有东西都应该使用后者。 如果(且仅当)inode拥有数据,则它们是相同的 本地缓存(fs)上的缓存数据将具有指向的i_数据的i_映射 如果块设备进入pagecache,它会缓存到。同上- 我们应该将pagecache与struct block_设备相关联,因为我们可以 许多具有相同主调的索引节点:minor.IOW,->i\u映射应该指向 他们都在同一个地方

发件人:

它由围绕现有文件系统的文件系统使用 树中唯一一个真正使用这个的

所有VFS函数始终使用inode->i_映射->a_操作。尾码复制 基础inode到它自己的inode的i_映射 与容器文件的地址空间相同,并避免映射同一文件 内存中不同位置的页

i_映射是真正的页面缓存。i_数据是地址空间所在的位置,由inode分配和释放,通常是i_映射指向的位置。但是文件系统可以将一个inode的i_数据保留为空,并将i_映射指向另一个inode的i_数据,以避免多个页面缓存