LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1014|回复: 2

求分析handle_initrd()函数

[复制链接]
发表于 2006-11-6 11:31:21 | 显示全部楼层 |阅读模式
大家好,我在看下面这代码时有些不明白的地方,希望有人帮我解惑,谢谢!
首先代码(1)处,将initrd img的内容mount 到了/root目录下,此时的目录结构应该如下吧:
  /
    |-----/root(挂载的initrd img)
    |--bin
    |--inuxrc
    |--dev
    |--....
      |-----/dev
    |--console(5:1)
    |--root.old(1:0)        
    |--...

(2)处,该是在要目录下新建了一个/old目录.
  /
    |-----/root(挂载的initrd img)
    |--bin
    |--inuxrc
    |--dev
    |--....
      |-----/old
      |-----/dev
    |--console(5:1)
    |--root.old(1:0)        
    |--...

(3)处执行do_linuxrc()函数,将/root目录置为根目录,此时的目录结构应该是initrd文件系统的目录结构吧?
  /
  |----bin
  |----linuxrc
  |----dev
  |----....
(4)处呢?它表示什么意思?从后面来看,这里应该时将root目录下的initrd文件系统移动到/old目录下的呀,谁为我分析一下(4)处代码,谢谢!

static void __init handle_initrd(void)
{
        int ram0 = kdev_t_to_nr(MKDEV(RAMDISK_MAJOR,0));
        int error;
        int i, pid;

        create_dev("/dev/root.old", ram0, NULL);
(1)        mount_block_root("/dev/root.old", root_mountflags & ~MS_RDONLY);
(2)        sys_mkdir("/old", 0700);
        sys_chdir("/old");

(3)        pid = kernel_thread(do_linuxrc, "/linuxrc", SIGCHLD);
        if (pid > 0) {
                while (pid != wait(&i)) {
                        current->policy |= SCHED_YIELD;
                        schedule();
                }
        }

(4)        sys_mount("..", ".", NULL, MS_MOVE, NULL);
        sys_umount("/old/dev", 0);

        if (real_root_dev == ram0) {
                sys_chdir("/old");
                return;
        }

        ROOT_DEV = real_root_dev;
        mount_root();

        printk(KERN_NOTICE "Trying to move old root to /initrd ... ");
        error = sys_mount("/old", "/root/initrd", NULL, MS_MOVE, NULL);
        if (!error)
                printk("okay\n");
        else {
                .....
        }
}

static int do_linuxrc(void * shell)
{
        static char *argv[] = { "linuxrc", NULL, };
        extern char * envp_init[];

        sys_chdir("/root");
        sys_mount(".", "/", NULL, MS_MOVE, NULL);
        sys_chroot(".");

        mount_devfs_fs ();

        close(0);close(1);close(2);
        setsid();
        (void) open("/dev/console",O_RDWR,0);
        (void) dup(0);
        (void) dup(0);
        return execve(shell, argv, envp_init);
}
 楼主| 发表于 2006-11-6 11:39:11 | 显示全部楼层
不好意思,原先编辑的格式无法保存,请大家耐心看,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-6 12:41:37 | 显示全部楼层
哦, do_linuxrc()与handle_initrd()的执行不是在同一个进程中执行,所以代码(4)处的".."表示"/", 而"."仍然是"/old"目录.
但是我还有个疑问,就是在do_linuxrc()中,已经将initrd文件系统中的移动到了根目录下,这时/old目录应该是被隐藏掉了呀,怎么在代码(4)处又看起来好像仍然可以访问呀?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表