文件系统系列学习笔记 - inode/dentry/file/super(2)
此篇文章主要介绍下linux 文件系统下的主要对象及他们之间的关系。
1 inode
inode结构中主要包含对文件或者目录原信息的描述,原信息包括但不限于文件大小、文件在磁盘块中的位置信息、权限位、文件属性等。文件系统主要通过查找内存中是否有对应的inode来判断一个文件是否存在。
inode本质上分为两种,一种是磁盘文件系统确实存在的inode信息,这里暂叫disk_inode,另一种是内存中的inode,是根据disk_inode生成的,这里暂叫mm_inode。mm_inode中包含文件文件系统特殊管理的复杂数据信息,比对应disk_inode信息量大的多。这里注意,disk_inode并非每个磁盘文件系统都包含,但如前文所述,若想被挂载使用,必须模拟出对应的disk_inode(最终目的是mm_inode)。
inode 结构体定义:
/include/linux/fs.h
struct inode {
struct hlist_node i_hash;
struct list_head i_list;
struct list_head i_dentry;//All the dentrys which point to this inode list together.
unsigned long i_ino;//The inode id, unique in a certain fils system.Sometimes kernel use the i_ino to locate the inode structure
atomic_t i_count;
umode_t i_mode;
unsigned int i_nlink;//How many dentrys points to this same inode.
uid_t i_uid;
gid_t i_gid;
dev_t i_rdev;//if this inode standard for a specific device file, the region include major/minor device number.
loff_t i_size;//The size of the data in this inode.
struct timespec i_atime;
struct timespec i_mtime;
struct timespec i_ctime;
unsigned int i_blkbits;
unsigned long i_blksize;
unsigned long i_version;
unsigned long i_blocks;
unsigned short i_bytes;
unsigned char i_sock;
spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
struct semaphore i_sem;
struct rw_semaphore i_alloc_sem;
struct inode_operations *i_op;
struct file_operations *i_fop; /* former ->i_op->default_file_ops */
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
/* These three should probably be a union */
struct list_head i_devices;
struct pipe_inode_info *i_pipe;
struct block_device *i_bdev;
struct cdev *i_cdev;
int i_cindex; __u32 i_generation; #ifdef CONFIG_DNOTIFY
unsigned long i_dnotify_mask; /* Directory notify events */
struct dnotify_struct *i_dnotify; /* for directory notifications */
#endif unsigned long i_state;
unsigned long dirtied_when; /* jiffies of first dirtying */ unsigned int i_flags; atomic_t i_writecount;
void *i_security;
union {
void *generic_ip;
} u;
#ifdef __NEED_I_SIZE_ORDERED
seqcount_t i_size_seqcount;
#endif
};
2 dentry
dentry 表示目录项,这里注意目录项和目录的区分。目录中包含有文件和子目录。而目录项是文件系统逻辑概念,简单讲是一个全路径当中的字段,但这个字段必然代表某一文件系统下的目录或者文件。在文件路径名到具体文件的解析中dentry有重要应用。这里注意一个inode可能对应多个不同的dentry对象,但一个dentry能切只能指向一个inode对象。即多个文件路径指向同一个文件物理。
dentry结构体定义:
/include/linux/dcache.h
struct dentry {
atomic_t d_count;
unsigned int d_flags; /* protected by d_lock */
spinlock_t d_lock; /* per dentry lock */
struct inode *d_inode; /* Where the name belongs to - NULL is
* negative */
/*
* The next three fields are touched by __d_lookup. Place them here
* so they all fit in a 16-byte range, with 16-byte alignment.
*/
struct dentry *d_parent; /* parent directory */
struct qstr d_name; struct list_head d_lru; /* LRU list */
struct list_head d_child; /* child of parent list */
struct list_head d_subdirs; /* our children */
struct list_head d_alias; /* inode alias list */
unsigned long d_time; /* used by d_revalidate */
struct dentry_operations *d_op;
struct super_block *d_sb; /* The root of the dentry tree */
void *d_fsdata; /* fs-specific data */
struct rcu_head d_rcu;
struct dcookie_struct *d_cookie; /* cookie, if any */
struct hlist_node d_hash; /* lookup hash list */
int d_mounted;
unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};
dentry结构有6个list_head(list_head既可以作为队列的头部,也可以将其数据结构挂入到某个队列中):
d_vfsmount:仅在该dentry结构是一个安装点时才可以使用
d_hash:一个dentry结构一旦建立就通过就通过d_hash挂入杂凑表dentry_hashtable中的某个队列中。
d_lru:当共享计数为0时,通过d_lru挂入LRU队列的dentry_unused中。
d_child:一个dentry通过d_child挂入其父节点的d_subdirs中。同时通过d_parent指向其父目录的dentry结构。
d_subdirs:该dentry自己的所有子目录挂在该队列下。
d_alias:在inode结构中有个队列i_dentry,凡是代表这个文件的所有目录项头通过d_alias挂入相应inode结构中的i_dentry队列。
一个有效的dentry必然关联一个inode,然而反过来一个inode却可能对应着不止一个dentry结构。也就是说一个文件可能有不止一个路径名(因为一个已建立的文件可以被link到其他的文件名)
3 File
4 Super_block
5 他们之间连接的数据结构
文件系统系列学习笔记 - inode/dentry/file/super(2)的更多相关文章
- 文件系统VFS数据结构(超级块 inode dentry file)(收集整理)
Linux虚拟文件系统四大对象: 1)超级块(super block) 2)索引节点(inode) 3)目录项(dentry) 4)文件对象(file) 一个进程在对一个文件进行操作时各种对象的引用过 ...
- 21.TFS文件系统搭建笔记
TFS文件系统搭建笔记 参考地址: https://github.com/alibaba/tfs/blob/master/INSTALL.md https://github.com/alibaba/t ...
- Linux文件系统中的inode节点详细介绍
这篇文章主要介绍了Linux文件系统中的inode节点,详细讲解了inode是什么.inode包含的信息.inode号码的相关资料等,需要的朋友可以参考下 一.inode是什么? 理解inode,要从 ...
- Zynq Fatfs文件系统应用笔记
Zynq Fatfs文件系统应用笔 Hello,panda 笔记介绍基于所描写叙述的Zynq Fatfs基于Xilinx xilffsv3.0和Sdpsv2.4,文件系统採用在Bare-Metal和轻 ...
- MVA Universal Windows Apps系列学习笔记1
昨天晚上看了微软的Build 2015大会第一天第一场演讲,时间还挺长,足足3个小时,不过也挺震撼的.里面提到了windows 10.Microsoft edge浏览器.Azure云平台.Office ...
- Java基础知识强化之IO流笔记09:File类功能
详见如下: Android(java)学习笔记87:File类使用
- 《Machine Learning》系列学习笔记之第一周
<Machine Learning>系列学习笔记 第一周 第一部分 Introduction The definition of machine learning (1)older, in ...
- lesson - 4 笔记 /inode / suid / sgid / sbit / chmod /umask / chown / rwx / wc /grep / tr / sort / cut /which / whereis / locate / find / ln /
一.帮助+基本文件管理+用户管理 1.怎么查看命令帮助 ls --help man ls :查看命令/man 5 file:查看配置文件 二.基本文件管理,通过{查,建,删,改} 四个维度介绍了不同的 ...
- block(data block,directory block)、inode、块位图、inode位图和super block概念详解【转】
本文转载自:https://blog.csdn.net/jhndiuowehu/article/details/50788287 一.基本概念: 1.block:文件系统中存储数据的最小单元 ...
随机推荐
- [loj2393]门票安排
为了方便,不妨假设$a_{i}\le b_{i}$,并将问题转换为以下形式: $\forall 1\le i\le m$,将$[a_{i},b_{i})$或$[1,a_{i})\cup [b_{i}, ...
- arm中断汇编
IRQ_Handler: push {lr} /* 保存 lr 地址 */ push {r0-r3, r12} /* 保存 r0-r3,r12 寄存器 */ mrs r0, spsr /* 读取 sp ...
- 【机器学习基础】卷积神经网络(CNN)基础
最近几天陆续补充了一些"线性回归"部分内容,这节继续机器学习基础部分,这节主要对CNN的基础进行整理,仅限于基础原理的了解,更复杂的内容和实践放在以后再进行总结. 卷积神经网络的基 ...
- asList和subList的缺陷
概述 在开发中我们经常使用asList去把一个数组转换为List.也存在通过subList.subMap.来对List.Map.Set来进行类似使用subString方法来对String对象进行分割处 ...
- Python之浏览器的前进或后退
import webbrowserwebbrowser.back() 后退webbrowser.forward() 前进
- NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)
自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的. 1 Glove - 基于统计方法 Glove是一个典型的基于统计的获取词向量的方 ...
- FESTUNG — 3. 采用 HDG 方法求解对流问题
FESTUNG - 3. 采用 HDG 方法求解对流问题[1] 1. 控制方程 线性对流问题控制方程为 \[\begin{array}{ll} \partial_t c + \nabla \cdot ...
- MetaboAnalyst的多组学分析
MetaboAnalyst是做代谢的R包,功能十分强大.也开发了web版本,代谢组学的分析这里不介绍,主要讲讲它开发的多组学分析的相关内容. 既然是做代谢的工具,即使是增加了多组学内容,肯定也是以代谢 ...
- Linux服务器I/O性能分析-1
一.IOSTAT误区 1.1 误区-svctm Linux上的svctm是重要的I/O指标(I/O平均服务时间-单位毫秒),这个值直接反映了硬件的性能(I/O请求从SCSI层发出--->I/O完 ...
- EXCEL-批量删除筛选出的行,并且保留首行
筛选->ctrl+G->可见单元格->鼠标右键->删除整行. 之前的时候,是有个方法类似于上述步骤,可以保留标题行的,但是,不知道是不是少了哪一步,上述过程总是会删除标题行.就 ...