美文网首页
记录-设备结点创建问题

记录-设备结点创建问题

作者: JalynFang | 来源:发表于2019-01-10 14:27 被阅读0次

    在这里,特别感谢韦东山老师的指导。

    Q:
    请教个问题 在看hotplug_uevent时,有这样疑问:
    驱动程序中调用class_device_create最终会调用到mdev
    (假设系统里使用的是mdev)来创建设备节点,为啥我将文件系统里的mdev删掉后 系统开机后 一样会有设备节点存在?
    A:
    你执行 cat /proc/mounts ,贴图。
    R:

    root@Jalyn:~$ cat /proc/mounts 
    ubi0:rootfs / ubifs rw,relatime 0 0
    devtmpfs /dev devtmpfs rw,relatime,size=125288k,nr_inodes=31322,mode=755 0 0
    proc /proc proc rw,relatime 0 0
    devpts /dev/pts devpts rw,relatime,gid=5,mode=620 0 0
    tmpfs /dev/shm tmpfs rw,relatime,mode=777 0 0
    tmpfs /tmp tmpfs rw,relatime 0 0
    tmpfs /run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0
    sysfs /sys sysfs rw,relatime 0 0
    

    A:
    执行 mount -t devtmpfs none /mnt
    ls /mnt
    R:

    root@Jalyn:~$ ls /mnt/
    autofs              ram11               tty35
    bus                 ram12               tty36
    console             ram13               tty37
    cpu_dma_latency     ram14               tty38
    fd                  ram15               tty39
    full                ram2                tty4
    fuse                ram3                tty40
    hwrng               ram4                tty41
    i2c-1               ram5                tty42
    input               ram6                tty43
    kmsg                ram7                tty44
    log                 ram8                tty45
    loop-control        ram9                tty46
    loop0               random              tty47
    loop1               rtc0                tty48
    loop2               shm                 tty49
    ......
    

    A:
    你看到了吧?它使用的是devtmpfs虚拟文件系统创建设备节点的。
    对话,到这里;问题也清晰了,是devtmpfs虚拟文件系统创建的设备节点。没有udev/mdev啥事。


    问题产生的根本原因,在于对整个Linux文件系统认知的欠缺和学习的信息稍有些过时了。
    其实udev/mdev不是主用来动态生成设备节点用的,udev的本质是用来接收一个kset加入离开系统这样的事件,简单点说是用来捕捉内核空间某些设备加入移除等事件,udev/mdev据此做一些处理,比如加载卸载相应的模块。动态设备节点的生成其实在内核中是由"devtmpfs"来完成的,跟xdev一点关系没有。
    具体到device_create,它生成动态设备节点的调用链是:
    device_create --> device_create_vargs --> device_register --> device_add --> devtmpfs_create_node
    所以系统有没有xdev都不会影响设备节点的生成。(基于内核4.14版本分析)
    2009年devtmpfs出现之前,/dev/下面的设备节点应该都是udev-daemon收到内核的事件后用mknod程序或者直接调mknod()系统调用创建出来的;现在基本上不走udev/mdev了,几乎所有的设备文件(比如/dev/sda1)都是内核直接创建的。这样可以缩短Linux的开机时间。
    接下来,了解下什么是devtmpfs?

    • devtmpfs 概述

    devtmpfs 的功用是在 Linux 核心 启动早期建立一个初步的 /dev,令一般启动程序不用等待 udev,缩短 GNU/Linux 的开机时间。

    • devtmpfs 解释
    Devtmpfs lets the kernel create a tmpfs very early at kernel 
    initialization, before any driver core device is registered.
     Every device with a major/minor will have a device node created 
    in this tmpfs instance. After the rootfs is mounted by the kernel, 
    the populated tmpfs is mounted at /dev. In initramfs, it can be
    moved to the manually mounted root filesystem before /sbin/init is executed.
    
    • 内核中加入devtmpfs支持

    make menuconfig
         Device Drivers --->
              Generic Driver Options --->
              [*] Maintain a devtmpfs filesystem to mount at /dev
              [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
    devtmpfs,通过devtmpfs_create_node(),唤醒了个内核线程来做设备结点的创建,删除!至于更具体设备节点的创建分析,可移步:devtmpfs文件系统创建设备节点。
    到这里,你可能又会有这样的疑问:
    现在为什么采用devtmpfs这种策略?将所有的信息通过uevent发送到用户空间,让用户空间自行选择对应的动作,将策略排除出内核中,udev就是为了这个目的引进的.不知道现在采用devtmpfs来创建有什么原因吗?
    更多devtmpfs的讨论可以移步:The return of devfs。

    相关文章

      网友评论

          本文标题:记录-设备结点创建问题

          本文链接:https://www.haomeiwen.com/subject/iwfarqtx.html