VFS数据结构之(file)

1. 文件对象(file object)

文件对象描述进程怎样与一个打开的文件进行交互。文件对象是在文件被打开时创建的。注意:文件对象在磁盘上没有对应的映像,因此file结构体中没有dirty字段表示文件对象是否被修改。

1.1 文件数据结构

struct file {
   
	union {
   
		struct list_head	fu_list;		/* 用于通用文件对象链表的指针 */
		struct rcu_head 	fu_rcuhead;		/* 回收文件对象时,由RCU描述符使用 */
	} f_u;
	struct path			f_path;				/* 包含以下宏定义中的两个元素 */
#define f_dentry		f_path.dentry		/* 与文件相关的目录项对象 */
#define f_vfsmnt		f_path.mnt			/* 含有该文件的已安装文件系统 */
	const struct file_operations	*f_op;	/* 指向文件操作表的指针 */
	atomic_t			f_count;			/* 文件对象的引用计数器 */
	unsigned int 		f_flags;			/* 打开文件时所指定的标志 */
	mode_t				f_mode;				/* 进程的访问模式 */
	loff_t				f_pos;				/* 当前的文件位置(文件指针) */
	struct fown_struct	f_owner;			/* 通过信号进行I/O事件通知的数据 */
	unsigned int		f_uid, f_gid;		/* 用户的UID,用户的GID */
	struct file_ra_state	f_ra;			/* 文件预读状态 */
	unsigned long		f_version;			/* 版本号,每次使用后自动递增 */
	void				*f_security;		/* 指向文件对象的安全结构的指针 */
	void				*private_data;		/* 指向特定文件系统或设备驱动程序所需要的数据的指针 */
	struct list_head	f_ep_links;			/* 文件的事件轮询等待者链表的头 */
	spinlock_t			f_ep_lock;			/* 保护f_ep_links链表的自旋锁 */
	struct address_space	*f_mapping;		/* 指向文件地址空间对象的指针 */
}

1.2 关键字段说明

  • fu_list
    每个超级块对象把文件对象链表的头存放在 s_files 字段中,因此,属于不同文件系统的文件对象包含在不同的链表中。fu_list 字段链接链表中的相邻元素。
  • f_pos
    文件指针存放的是文件中当前的位置,由于几个进程可能同时访问同一文件,因此指针必须存放在文件对象而不是索引节点对象中。
  • f_count
    记录使用文件对象的进程数(以 CLONE_FILES标志创建的轻量级进程共享打开文件表,他们可以使用相同的文件对象)。
  • f_dentry
    指向与文件对应的目录项对象。
  • f_vfsmnt
    指向与该文件相应的已安装文件系统描述符。
  • f_flags
    通过该字段可以解析出打开文件时指定的标志。

1.3 文件操作

每个文件系统都有自己的文件操作集合,执行诸如读写文件这样的操作,由 f_op 字段指向。

1.3.1 文件操作结构体

struct file_operations {
   
	struct module *owner;
	
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值