Chinaunix

标题: init进程之前的设备文件怎样建立的 [打印本页]

作者: blake326    时间: 2012-05-17 11:06
标题: init进程之前的设备文件怎样建立的
比如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; }
#

请高手看下。


作者: tempname2    时间: 2012-05-17 11:11
设备号通过硬件编码或者命令行指定,设备文件现做现用,见mount_root。
作者: linuxfellow    时间: 2012-05-17 11:27
本帖最后由 linuxfellow 于 2012-05-17 11:34 编辑

最早是手工mknod, 有一段时间用devfs文件系统;现在用tmpdevfs文件系统
作者: linuxfellow    时间: 2012-05-17 12:03
回复 1# blake326
根文件设备驱动文件是用户空间代码,应该是事先建好,放在initramfs里。这就是所谓early_userspace_init.  这样做的目的就是把根设备驱动从内核转到用户。
在用户init程序创建根目录后,就用scripts把initramfs的dev挂载到根目录下。

   
作者: blake326    时间: 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进程,并且挂载了根文件系统。





作者: zhuqing_739    时间: 2012-05-17 13:10
想必blake326是在arm上搞的,以前也一直捣鼓过,但是没有捣鼓清楚,今天看到了LZ的帖子,学习了。。。。。。
blake326 发表于 2012-05-17 13:04
回复 4# linuxfellow





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2