【随笔】几个VFS系统调用

本文详细介绍了Linux操作系统中的VFS(虚拟文件系统)调用,包括mount过程中的mount树构造,open调用的文件查找与打开流程,以及open时的flags属性对文件操作的影响。内容涵盖了从路径解析、dentry cache到inode的获取,展示了Linux内核如何处理文件系统操作。
摘要由CSDN通过智能技术生成

一、mount

mount的文件系统在内核面会组织成一颗mount树,根节点是root filesystem的struct mount。

http://note.youdao.com/yws/public/resource/726e6d0e167b09fb0d7fb917d156bc63/xmlnote/WEBRESOURCEb7a559c9afea1b860d7ed9bff183cb9f/12358

(注:图来自《趣谈Linux操作系统》)

struct mount {
	struct hlist_node mnt_hash;
	struct mount *mnt_parent;
	struct dentry *mnt_mountpoint;
	struct vfsmount mnt;
	union {
		struct rcu_head mnt_rcu;
		struct llist_node mnt_llist;
	};
#ifdef CONFIG_SMP
	struct mnt_pcp __percpu *mnt_pcp;
#else
	int mnt_count;
	int mnt_writers;
#endif
	struct list_head mnt_mounts;	/* list of children, anchored here */
	struct list_head mnt_child;	/* and going through their mnt_child */
	struct list_head mnt_instance;	/* mount instance on sb->s_mounts */
	const char *mnt_devname;	/* Name of device e.g. /dev/dsk/hda1 */
	struct list_head mnt_list;
	struct list_head mnt_expire;	/* link in fs-specific expiry list */
	struct list_head mnt_share;	/* circular list of shared mounts */
	struct list_head mnt_slave_list;/* list of slave mounts */
	struct list_head mnt_slave;	/* slave list entry */
	struct mount *mnt_master;	/* slave is on master->mnt_slave_list */
	struct mnt_namespace *mnt_ns;	/* containing namespace */
	struct mountpoint *mnt_mp;	/* where is it mounted */
	union {
		struct hlist_node mnt_mp_list;	/* list mounts with the same mountpoint */
		struct hlist_node mnt_umount;
	};
	struct list_head mnt_umounting; /* list entry for umount propagation */
#ifdef CONFIG_FSNOTIFY
	struct fsnotify_mark_connector __rcu *mnt_fsnotify_marks;
	__u32 mnt_fsnotify_mask;
#endif
	int mnt_id;			/* mount identifier */
	int mnt_group_id;		/* peer group identifier */
	int mnt_expiry_mark;		/* true if marked for expiry */
	struct hlist_head mnt_pins;
	struct hlist_head mnt_stuck_children;
} __randomize_layout;
struct vfsmount {
	struct dentry *mnt_root;	/* root of the mounted tree */
	struct super_block *mnt_sb;	/* pointer to superblock */
	int mnt_flags;
} __randomize_layout;

 

二、open

方法调用栈:

  1. do_sys_open
    1. get_unused_fd_flags:拿fd
    2. do_filp_open:查找文件
      1. set_nameidata:创建nameidata
      2. path_openat:开始路径查找
        1. get_empty_filp:创建一个空的file
        2. path_init:初始化nameidata
        3. link_path_walk:一个大循环对路径名逐层查找
        4. do_last:拿到inode并初始化file
          1. lookup_fast:先找dentry cache
          2. lookup_open:到文件系统中去找
          3. vfs_open:真正的打开文件,然后将打开的文件信息填写到file
    3. fd_install:查找成功,将fd放入文件,然后系统调用返回

文字版描述:

  1. 会先去拿fd,拿不到就报too many open filse的错;
  2. 查找文件;
    1. 创建st
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值