gpt4 book ai didi

linux-kernel - &inode->i_data 和 inode->i_mapping 有什么区别

转载 作者:行者123 更新时间:2023-12-01 23:31:40 28 4
gpt4 key购买 nike

我发现在大多数情况下,i_data 只是 i_mapping 的解引用数据,如下所示,为什么在一个 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,
...

最佳答案

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

例如。如果page属于ext4文件系统中存储的常规文件,则VFS inode的i_data指向该文件的inode,inode的i_mapping域指向同一个inode的i_data,address_space对象的host域指向同一个inode。

然而事情并不总是那么简单。假设一个页面包含从块设备文件读取的数据,其中包含块设备的“原始”数据,address_space 被嵌入到 bdev 文件的“主”inode 中,与块设备关联的特殊文件系统(由 bd_inode 引用) )。因此块设备文件的 inode 的 i_mapping 字段指向
address_space 对象嵌入到master inode;对应的address_space 对象的host 字段指向master inode。这样,所有包含从块设备读取的数据的页面都具有相同的 address_space 对象,即使它们已通过引用不同的块设备文件进行访问。
因此,当涉及到页面属于常规文件还是块设备特殊文件时,两者之间略有区别。

关于linux-kernel - &inode->i_data 和 inode->i_mapping 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32047144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com