免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2158 | 回复: 1
打印 上一主题 下一主题

[其他] init进程之前的设备文件怎样建立的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-17 11:06 |显示全部楼层 |倒序浏览
比如kernel_init中,加载完所有驱动之后,如果要挂载跟文件系统的话,那么这个根文件系统的设备文件(/dev/sda2类似的)时谁创建的呢,这个时候用户态进程都还没有起,因为还没有起到用户态的init进程。

以前听说是加载驱动的时候device_add的devtmpfs_create_node创建的。但是发现以前老点的内核根本没有devtmpfs_create_node这个动作。还有现在我的内核配置CONFIG_DEVTMPFS是关闭的,devtmpfs_create_node是个空动作。
#ifdef CONFIG_DEVTMPFS
extern int devtmpfs_create_node(struct device *dev);
#else
static inline int devtmpfs_create_node(struct device *dev) { return 0; }
#

请高手看下。

论坛徽章:
0
2 [报告]
发表于 2012-05-17 13:04 |显示全部楼层
回复 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进程,并且挂载了根文件系统。




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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP