zoukankan      html  css  js  c++  java
  • linux驱动(三)——自动添加和删除驱动设备文件

    ---恢复内容开始---

    1:我们之前的设备文件都是使用mknod命令来手动添加的,下面我们要解决一下设备文件的自动添加问题:

    设备文件的自动添加需要udev,busybox中的mdev是简化版的udev;

    https://yq.aliyun.com/articles/10546

    http://blog.chinaunix.net/uid-29401328-id-5019678.html

    http://blog.csdn.net/michaelcao1980/article/details/39314615

    http://blog.csdn.net/ce123_zhouwei/article/details/6690539

    http://7071976.blog.51cto.com/7061976/1385965

    http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077435.html

    http://blog.csdn.net/skyflying2012/article/details/8295547

    什么是mdev:

    mdev是busybox自带的一个简化版的udev。
        作用是在系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev创建的
        mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为"dev"的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点

     动态更新不仅是更新/dev目录,还支持热插拔,即支持接入卸下设备时执行某些动作,insmod自动创建/dev/***(class_create,class_device_create要自动创建设备必须依赖udev或mdev

    mdov是根文件系统中的一个文件,属于应用层,这个程序在我们rcS文件中执行的设置mdev -S,让它在系统启动时创建所有的设备节点。

    比如:我们看一下开发板中:

    /sys/class/i2c-dev目录下:

    在看一下/dev/目录下的文件:

    我们挂在根文件系统后执行rcS文件,开启了mdev,执行mdev -S命令,这个命令就会查找sys/class文件,根据下面的dev文件的主次设备号,来建立驱动设备文件,即在/dev/下建立i2c-0 i2c-1 i2c-2,这就是mdev的作用;

    执行mdev -s命令时,mdev扫描/sys/block(块设备保存在/sys/block目录下,内核2.6.25版本以后,块设备也保存在/sys /class/block目录下。mdev扫描/sys/block是为了实现向后兼容)和/sys/class两个目录下的dev属性文件,从该dev 属性文件中获取到设备编号(dev属性文件以"major:minor "形式保存设备编号),并以包含该dev属性文件的目录名称作为设备名 device_name(即包含dev属性文件的目录称为device_name,而/sys/class和device_name之间的那部分目录称为 subsystem。也就是每个dev属性文件所在的路径都可表示为/sys/class/subsystem/device_name/dev),在 /dev目录下创建相应的设备文件。例如,cat /sys/class/tty/tty0/dev会得到4:0,subsystem为tty,device_name为tty0。

    2:mdev的启动方法:

    用法:  

    1. 执行mdev前要挂载 /sys以下是代码片段:    mount -t tmpfs mdev /dev   mount -t sysfs sysfs /sys 

    2.命令内核在增删设备时执行/sbin/mdev,使设备节点会被创建和删除以下是代码片段:echo /sbin/mdev > /proc/sys/kernel/hotplug  

    3.设置mdev,让它在系统启动时创建所有的设备节点以下是代码片段:mdev -s

    这些命令都是在rcS文件中设置好的,开机挂在根文件系统以后,执行linuxrc以后会自动执行rcS文件;

    mdev工作实际是通过uevent文件来实现的。

    uevent 是“user event”的简称,是一种内核向用户空间发送信息的方式。Linux 内核的热拔插机制(hotplug)就是通过uevent 实现的。

    当在总线中注册和删除一个设备或一个设备驱动程序时,会调用kobject_uevent()产生uevent。kobject_uevent()的代码在lib/kobject_uevent.c 中,

    1.查找kobject 所属的kset,并获得kset 的uevent_ops如果kobj->uevent_suppress 为1,表示当前kobject 禁止产生uevent,返回0

    2. 调用kset->uevent_ops->filter(),如果返回0,表示kset 禁止产生uevent,返回0

    3.如果内核支持网络功能,使用netlink Socket 向用户空间广播uevent

    4.如果uevent_helper 有效,则调用它。

    udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,两者的实现机理不同。udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作,包括创建/删除设备节点,加载/卸载驱动模块等等。mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper 变量(通过写/proc/sys/kernel/hotplug),值为“/sbin/mdev”。这样内核产生uevent 时会调用uevent_helper 所指的用户级程序,也就是mdev,来执行相应的热拔插动作。udev 使用的netlink 机制在有大量uevent 的场合效率高,适合用在PC 机上;而mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中。另外要说明的一点是,uevent_helper 的初始值在内核编译时时可配置的,默认值为/sbin/hotplug。如果想修改它的值,写/proc/sys/kernel/hotplug 文件就可以了,例如:

    echo “/sbin/mdev” > /proc/sys/kernel/hotplug

    -------------------------------------------------------------------------------------、

     未完待续继续补充关于mdev、udev、uevent的内容

    ---恢复内容结束---

  • 相关阅读:
    Sass变量、嵌套
    遮罩层2
    遮罩层
    大图轮播
    项目资料(主页)
    关于时间控制和制定时间日期
    dom作业
    js的dom操作和函数
    js数组去重
    js For循环练习。
  • 原文地址:https://www.cnblogs.com/biaohc/p/6624517.html
Copyright © 2011-2022 走看看