⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 namespace.c.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 TXT
字号:
any problems, send mails to sindybear@163.com


相关文件
	/include/linux/sched.h
	/include/capablility.h


*********************文件系统的mount流程**********************
相关文件
	/fs/super.c

(1)asmlinkage long sys_mount(char * dev_name, char * dir_name, char * type,
			  unsigned long flags, void * data)
	dir_page = getname(dir_name);	
	……				//将用户态的dir_name, dev_name,type等复制到内核空间

	lock_kernel();	//锁定内核
	retval = do_mount((char*)dev_page, dir_page, (char*)type_page,	
			  flags, (void*)data_page);	//执行真正的mount工作
	unlock_kernel();//解锁内核
	……	//清楚分配的内存


(2)long do_mount(char * dev_name, char * dir_name, char *type_page,
			  unsigned long flags, void *data_page)
	if (path_init(dir_name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, &nd))
		retval = path_walk(dir_name, &nd);	//找到mount安装点的信息,放入nameidata结构
	
	if (flags & MS_REMOUNT)
		retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags,
				    data_page);
	else if (flags & MS_BIND)
		retval = do_loopback(&nd, dev_name, flags & MS_REC);
	else if (flags & MS_MOVE)
		retval = do_move_mount(&nd, dev_name);
	else
		retval = do_add_mount(&nd, type_page, flags, mnt_flags,
				      dev_name, data_page);	//一般的安装走的是这条路


(3)static int do_add_mount(struct nameidata *nd, char *type, int flags,
			int mnt_flags, char *name, void *data)
	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;		//检查当前进程的权限

	mnt = do_kern_mount(type, flags, name, data);//进行实际的mount的准备,声称vmount结构,填充
	……	//上面的步骤可能等待,所以下面要检查安装点的当前状态,确定是否继续

	err = graft_tree(mnt, nd);	//确定安装点没有被重复安装以后,将设备安装到安装点


(4)struct vfsmount * do_kern_mount(const char *fstype, int flags, char *name, void *data)
	struct file_system_type *type = get_fs_type(fstype);	//在内核中找到fstype类型的结构
	mnt = alloc_vfsmnt(name);	//分配一个vfsmount结构。

	f (type->fs_flags & FS_REQUIRES_DEV)	
		sb = get_sb_bdev(type, flags, name, data);	//一般的文件系统走这条路,
	else if (type->fs_flags & FS_SINGLE)
		sb = get_sb_single(type, flags, name, data);
	else
		sb = get_sb_nodev(type, flags, name, data);	//这部分主要得到文件系统的超级块

	mnt->mnt_sb = sb;
	mnt->mnt_root = dget(sb->s_root);
	……					//用这些信息填充vfsmount结构
	
	put_filesystem(type);			//增加文件系统计数


(5)static int graft_tree(struct vfsmount *mnt, struct nameidata *nd)
	if (S_ISDIR(nd->dentry->d_inode->i_mode) !=	
	      S_ISDIR(mnt->mnt_root->d_inode->i_mode))
		return -ENOTDIR;	//这个节点代表的必须是一个目录
		????





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -