用linux,有这样一个疑问:要访问一个文件就得先访问一个目录,才能根据文件名从目录中找到该文件的目录项,进而找到i节点;可是目录本身也是文件,它本身的目录项又在另一个目录项中,这样一来不是成了 “先有鸡还是先有蛋”的问题,或者是递归了吗?这个圈子的出口在哪里呢?
答案是:系统中有这样一个目录,能够在固定的位置找到。这就是初始根节点
现在就来看看内核中是怎样实现的。
我们知道,打开文件时,需要调用path_lookup()函数查找文件名对应的目标节点 。这个函数首先会根据文件名的首字母是否为'/',设置查找的起点。若为'/'则从currend->fs->root目录开始。这里currend->fs->root是当前进程的根目录。那么,可以猜想,系统第一个进程的根目录就应该是“先有鸡还是先有蛋”问题出口了。
查看代码
在文件Namespace.c中,有系统启动初始化时设置进程根目录的代码
//>>start_kernel>vfs_caches_init>mnt_init>init_mount_tree]
mnt = do_kern_mount("rootfs", 0, "rootfs", NULL);//这里挂载rootfs文件系统
.....
namespace->root = mnt;
.....
set_fs_pwd(current->fs, namespace->root, namespace->root->mnt_root);
set_fs_root(current->fs, namespace->root, namespace->root->mnt_root);
系统第一个进程是所有进程的祖先,由它fork出来的进程将继承它的根目录