zoukankan      html  css  js  c++  java
  • linux udev、mdev 介绍

    Udev介绍

    Udev的下载网址:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/

    Udev分为三个子计划:namedev,libsysfs和udev。Namedev为设备命名子系统,libsysfs提供访问sysfs文件系统,从中获取信息的标准接口。Udev是提供/dev设备节点文件的动态创建和删除策略。

    Namedev 使用5个步骤来决定指定设备的命名。

    (1)       标签/序列号

    (2)       设备总线号

    (3)       总线上的拓扑

    (4)       替换名称

    (5)       内核提供的名称

    Udev的规则文件

    Udev规则文件以行为单位,以“#”开头的代表注释行,其余的一行代表一个规则

    规则分为匹配和赋值两部分。两部分皆有自己的关键字。

    匹配关键字:

    ACTION,用于匹配行为

    KERNEL,匹配内核设备名

    BUS,匹配总线

    SYSFS,匹配从sysfs得到的信息,比如label,vendor,USB序列号。

    SUBSYSTEM,匹配子系统名

    赋值关键字

    NAME,创建文件设备名

    SYMLINK,符号链接名

    OWNER,设置设备的所有者

    GROUP,设置设备的组

    IMPORT,调用外部程序

    创建和配置udev

    本人下载了udev-126,udev-100,udev-172, 使用udev-172无法编译通过,udev-126不能得到试验所说的9个工具程序,只有udevd,test-udev,udevadm三个工具程序。Udev-100可得到全部的9个程序

    Udev-126的配置:./configure --prefix=/home/uncompress_software/udev-126/

     --target=arm-Linux --host=arm-vfp-linux-gnu LD=arm-vfp-linux-gnu-ld

    make

    make install

    udev-100:修改了Makefile,其中包括CROSS_COMPILE,prefix两个地方。

    以下内容来自星光灿烂 'S bLog

    由于在kernel启动未完成以前我们的设备文件不可用,如果使用mtd设备作为rootfs的挂载点,这个时候/dev/mtdblock 
    是不存在的,我们无法让kernel找到rootfs,kernel只好停在那里惊慌。 这个问题我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号 从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel 的cmd line参数,使root=31:03,就可以让kernel在udevd未起来之前成功的找到rootfs。 

    嵌入式系统中,只需要udevd和udevstart就能使udev正常工作。

    将生成的udevd和udevstart复制到/sbin目录,同时将udev源代码目录中etc/udev的文件复制到系统/etc目录下。

    最后编写启动,停止,重新启动等工作的udev脚本。

    Mdev介绍

    以下内容来自mdev入门

    mdev有两个主要的应用:初始化对象和动态更新。两个应用都需要内核sysfs的支持。为了实现动态更新,你必须在内核配置时增加热挺拔支持。

    以下是系统初始化脚本中一个典型的使用mdev 的代码片段:

    [1] mount -t sysfs sysfs /sys

    [2] echo /bin/mdev > /proc/sys/kernel/hotplug

    [3] mdev -s

    简单说明一下上面的代码:

    [1]你必须在执行mdev 前挂载 /sys 。

    [2] 命令内核在增删设备时执行 /bin/mdev ,使设备节点文件会被创建和删除。

    [3] 设置mdev,让它在系统启动时创建所有的设备节点。

    当然,一个对mdev 更完整的安装还必须在以上代码片段前执行下面的命令:

    [4] mount -t tmpfs mdev /dev

    [5] mkdir /dev/pts

    [6] mount -t devpts devpts /dev/pts

    [4]确保 /dev 是 tmpfs 文件系统(假设文件系统在 flash 外运行)。

    [5] 创建/dev/pts 挂载点

    [6] 在 /dev/pts 挂载 devpts 文件系统

    例如:

    #!/bin/sh
    
     
    
    if [ ! -x /sbin/mdev ]
    
    then
    
        exit 0
    
    fi
    
     
    case "$1" in
    
        start)
    
            echo "/sbin/mdev" > /proc/sys/kernel/hotplug
    
           
    
            # put /dev in a tmpfs
    
            mount -n -o mode=0755 -t tmpfs mdev /dev
    
     
    
            # Create static device nodes in /dev
    
            mknod /dev/console c 5 1
    
            chmod 600 /dev/console
    
            mknod /dev/null c 1 3
    
            chmod 666 /dev/null
    
     
    
            # make and mount devpts
    
            mkdir /dev/pts
    
            mount -n -t devpts devpts /dev/pts
    
     
    
            echo "Starting the hotplug events dispatcher mdev"
    
            /sbin/mdev -s
    
     
    
            mkdir /dev/shm
    
            ;;
    
        stop)
    
            ;;
    
        *)
    
            echo "Usage: /etc/rc.d/init.d/mdev {start|stop}"
    
            echo
    
            exit 1
    
            ;;
    
    esac
    
     
    
    exit 0

    说明:以上内容就是mdev的启动脚本,基本体现了上面的6个步骤。

    Mount –n,挂载但不写入

            --blind,将一个子树重新挂载到其它地方,使有多个地方可以见到些子树

            --move ,和blind有可比性,此项是移动子树

    Uevent,mdev,udev

    如果你对linux设备模型了解的很清楚,那么很自然就会想起驱动模型中的uevent。

    以下内容来自张俊岭《对Linux 设备驱动模型的一些理解》

    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

    补充一点:如果使用的是udevd,那么uevent_helper变量应为空,即

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

    当嵌入式系统中使用 mdev 机制,即 /proc/sys/kernel/hotplug 值为 /sbin/mdev 时候:

    ps: 当驱动中调用 class_create 和 device_create 创建设备类和设备节点后, 会在 /sys/class/中创建设备类名和 对应的设备节点,并且产生一个 uevent 时间给应用层,此时 mdev 收到该事件后会在 /dev 目录下自动创建设备节点。

    本文参考: http://blog.csdn.net/yongan1006/article/details/6675642

  • 相关阅读:
    链堆栈的实现
    关于HyperLink的NavigateUrl属性的链接地址参数设置
    //yield return用于无缝实现迭代模式。
    NUnit的使用
    非常不错的数据访问架构
    Dictionary应用
    针对数据分析没态度的几句牢骚
    微软算法面试题(4)
    程序员面试题精选100题(60)判断二叉树是不是平衡的
    C++设计模式单件
  • 原文地址:https://www.cnblogs.com/general0878/p/7340816.html
Copyright © 2011-2022 走看看