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:设备路