- 论坛徽章:
- 0
|
回复 4# linuxfellow
差不多理解了,谢谢。
首先不一定有initramfs,假设没有用initramfs的情况下:
根据命令行的参数将root设备名保存到 saved_root_name
static int __init root_dev_setup(char *line)
{
strlcpy(saved_root_name, line, sizeof(saved_root_name));
return 1;
}
__setup("root=", root_dev_setup);
假设没有initrd,则到prepare_namespace
void __init prepare_namespace(void) {
ROOT_DEV = name_to_dev_t(root_device_name);
mount_root();
}
通过name_to_dev_t到所有注册的block_device中查找,转换成相应的设备号。
然后mount_root挂载上来。
mount_root() {
create_dev("/dev/root", ROOT_DEV);
mount_block_root("/dev/root", root_mountflags);
}
如果用了initrd,实际不会走到mount_root。因为initrd指定的ramdisk镜像中已经存在init进程可执行文件,比如ubuntu来说,在这个用户态的init进程中切换到了/sbin/init最终的init进程,并且挂载了根文件系统。
|
|