Linux内核源码分析-安装实际根文件系统- prepare_namespace

Linux内核源码分析-安装实际根文件系统- prepare_namespace

内容说明:

1、不描述内核同步、错误处理、参数合法性验证相关的内容

2、源码摘自Linux内核2.6.11.1版

3、阅读本文请结合《深入理解Linux内核》第三版相关章节

4、本文会不定时更新

本文主要参考《深入理解Linux内核》,结合2.6.11.1版的内核代码,分析内核文件子系统中的安装实际根文件系统函数。

1、prepare_namespace

函数功能:

从设备文件路径名到处设备标识符,调用mount_root安装根文件系统

函数源码:

/*

 * Prepare the namespace - decide what/where tomount, load ramdisks, etc.

 */

void __init prepare_namespace(void)

{

    intis_floppy;

 

    mount_devfs();

 

    if(root_delay) {

       printk(KERN_INFO"Waiting %dsec before mounting root device...\n",

              root_delay);

       ssleep(root_delay);

    }

 

    md_run_setup();

 

    if(saved_root_name[0]) {

       root_device_name= saved_root_name;

       ROOT_DEV= name_to_dev_t(root_device_name);

       if(strncmp(root_device_name, "/dev/", 5) == 0)

           root_device_name+= 5;

    }

 

    is_floppy= MAJOR(ROOT_DEV) == FLOPPY_MAJOR;

 

    if(initrd_load())

       gotoout;

 

    if(is_floppy && rd_doload && rd_load_disk(0))

       ROOT_DEV= Root_RAM0;

 

    mount_root();

out:

    umount_devfs("/dev");

    sys_mount(".","/", NULL, MS_MOVE, NULL);

    sys_chroot(".");

    security_sb_post_mountroot();

    mount_devfs_fs();

}

函数处理流程:

1、调用函数mount_devfs安装devfs文件系统

2、如果启动参数中设置了安装根文件系统的延迟参数rootdelay,则调用ssleep延迟安装root_delay秒

3、md_run_setup初始化MD设备,MD设备主要包含了LINUX内核的软RAID实现

4、如果保持的设备文件路径名不为空,在调用函数name_to_dev_t获得设备文件的设备标识符,存入ROOT_DEV全局变量中;如果设备路径名以“/dev/”开头,则跳过前5个字节

5、通过设备文件标识符ROOT_DEV判断启动设备文件是否是软盘,并把判断结果存入局部变量is_floppy中

6、调用initrd_load函数,具体分析参见本文

7、如果从rd启动,加载rd,并设置ROOT_DEV为Root_RAM0

8、调用函数mount_root安装实际根文件系统,参见本文分析

2、mount_root

函数功能:

 

函数源码:

/init/Do_mounts.c

void __init mount_root(void)

{

#ifdef CONFIG_ROOT_NFS

    if(MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {

       if(mount_nfs_root())

           return;

 

       printk(KERN_ERR"VFS: Unable to mount root fs via NFS, trying floppy.\n");

       ROOT_DEV= Root_FD0;

    }

#endif

#ifdef CONFIG_BLK_DEV_FD

    if(MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {

       /*rd_doload is 2 for a dual initrd/ramload setup */

       if(rd_doload==2) {

           if(rd_load_disk(1)) {

              ROOT_DEV= Root_RAM1;

              root_device_name= NULL;

           }

       }else

           change_floppy("rootfloppy");

    }

#endif

    create_dev("/dev/root",ROOT_DEV, root_device_name);

    mount_block_root("/dev/root",root_mountflags);

}

函数处理流程(这里暂不描述网络文件系统和软盘文件系统):

1、调用create_dev函数在/dev目录中创建root设备文件,设备标识符为ROOT_DEV,设备文件名称为root_device_name

2、调用函数mount_block_root安装根文件系统,具体分析见下文

3、name_to_dev_t

函数功能:

把设备路径名转换成设备标识符

函数参数:

name:设备路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值