📄 namespace.c.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 + -