prepare_namespace
2015-09-20 14:48:40 2 举报
`prepare_namespace` 是一个用于在计算机编程中创建和管理命名空间的函数。命名空间是一种将程序中的变量、函数和类分组的方法,以避免名称冲突。通过使用 `prepare_namespace` 函数,程序员可以为特定的功能或模块创建一个独立的命名空间,从而确保在整个项目中的代码整洁、可读性高且易于维护。这个函数通常接受一个命名空间名称作为参数,并在内部实现相应的逻辑来创建和管理该命名空间。在使用 `prepare_namespace` 之后,程序员可以在其内部声明和使用变量、函数和类,而无需担心与外部代码发生冲突。
作者其他创作
大纲/内容
include/linux/namei.h
用户可以用root=来指定根文件系统。它的值保存在saved_root_name中。如果用户指定了以mtd、ubi开始的字串做为它的根文件系统。就会直接去挂载。这个文件是mtdblock、ubiblock的设备文件。
完成实际的”挂载“动作
init/main.c kernel_init()
处理ramdisk类型的initrd,这里不深入研究
最后到了path_lookup这里,这是文件系统中最复杂的操作了,其内容可以写好几页纸,不过基本的输入输出还是不变的。name是输入,path是输出。其中name只是个字符串,几乎没有任何信息,而path中不仅有真正的根文件系统挂载信息,还有根目录项信息,怪不得要落实到path_lookup上来。nameidata是路径查找操作返回的结果,其中有path信息和最后查到的目录名。
fs/open.c SYSCALL_DEFINE1
path结构体是对vfsmount、dentry结构的”封装“
user_path_dir竟然是宏定义,最后代码转换为user_path_at()函数,该函数位于fs/namei.c中。
最后这个结果是什么?path中到底是什么?我们理解,此时的输入是”.“,表示当前目录。目前真正的根文件系统是已经挂载到rootfs的\"/root\"目录上了,那么这个所谓的”当前目录“,在rootfs中就是\"/root\",在真正的根文件系统中就是”/“。最后查找的结果,path中应该是真正的根文件系统的根目录”/“,以这种最自然的方式完成根目录切换。
这个”.“是rootfs的当前目录”/root“
sys_chroot(\".\")
ramdisk_execute_command:在kernel解析引导参数的时候使用。如果用户指定了init文件路径,即使用了“init=”,就会将这个参数值存放到这里。如果没有指定init文件路径,默认为/init。
不是mtd或ubi开头的根文件系统,将根设备结点文件名转换为ROOT_DEV即设备节点号。如果根设备名是以”/dev/\"开头的,把“/dev/\"去掉。
init/do_mounts.c mount_root()
include/linux/namei.c
user_path_at是wrap函数,真正的内容在user_path_at_empty中。
将nfs或磁盘文件系统挂载至rootfs的/root目录
init/do_mounts.c prepare_namespace()
include/linux/path.h
user_path_at_empty函数的关键是filename_lookup函数。
通过宏定义进行代码变换
0 条评论
下一页