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 文件系统

例如:

  1. #!/bin/sh
  2.  
  3. if [ ! -x /sbin/mdev ]
  4.  
  5. then
  6.  
  7. exit
  8.  
  9. fi
  10.  
  11. case "$1" in
  12.  
  13. start)
  14.  
  15. echo "/sbin/mdev" > /proc/sys/kernel/hotplug
  16.  
  17. # put /dev in a tmpfs
  18.  
  19. mount -n -o mode= -t tmpfs mdev /dev
  20.  
  21. # Create static device nodes in /dev
  22.  
  23. mknod /dev/console c
  24.  
  25. chmod /dev/console
  26.  
  27. mknod /dev/null c
  28.  
  29. chmod /dev/null
  30.  
  31. # make and mount devpts
  32.  
  33. mkdir /dev/pts
  34.  
  35. mount -n -t devpts devpts /dev/pts
  36.  
  37. echo "Starting the hotplug events dispatcher mdev"
  38.  
  39. /sbin/mdev -s
  40.  
  41. mkdir /dev/shm
  42.  
  43. ;;
  44.  
  45. stop)
  46.  
  47. ;;
  48.  
  49. *)
  50.  
  51. echo "Usage: /etc/rc.d/init.d/mdev {start|stop}"
  52.  
  53. echo
  54.  
  55. exit
  56.  
  57. ;;
  58.  
  59. esac
  60.  
  61. exit

说明:以上内容就是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

linux udev、mdev 介绍的更多相关文章

  1. I.MX6 Linux udev porting

    /*********************************************************************** * I.MX6 Linux udev porting ...

  2. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  3. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  4. Linux性能工具介绍

    l  Linux性能工具介绍 p  CPU高 p  磁盘I/O p  网络 p  内存 p  应用程序跟踪 l  操作系统与应用程序的关系比喻为“唇亡齿寒”一点不为过 l  应用程序的性能问题/功能问 ...

  5. Linux core 文件介绍

    Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个 ...

  6. Linux 启动参数介绍

    Linux 启动参数介绍 取自2.6.18 kernel Documentation/i386/boot.txt 文件中介绍 vga= 这里的不是一个整数(在C语言表示法中,应是十进制,八进制或者十六 ...

  7. Linux系统启动过程介绍

    Linux系统启动过程介绍 学习操作系统有必要了解一下系统的启动过程,这样在面对各种系统故障的时候能快速定位解决问题,下面以Centos来分析linux系统的启动过程. 1.BIOS自检:当开机的时候 ...

  8. Linux内核策略介绍

      Linux内核策略介绍学习笔记   主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...

  9. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

随机推荐

  1. 201521123033《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. answer: 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1.List中指定元 ...

  2. 201521123073 《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料: 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码: ...

  3. 201521123017 《Java程序设计》第4周学习总结

    1. 本周学习总结 2. 书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图)   Q2.面向对象设计(大作业1,非常重要) 2.1 将 ...

  4. sublime text3 好用的插件!!!

    1.首先,你要保证sublime有Package Control,所以,如果没有,那么将Ctrl+`打开sublime控制台,将下列代码复制进去! import urllib.request,os; ...

  5. mysql:视图,触发器,事务,存储过程,函数

    一.视图 视图是一个虚拟表并不是(正实存在的) 创建老师表 create table teacher( id int primary key auto_increment, tname varchar ...

  6. Linux-hexdump命令调试event驱动—详解(13)

    hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用 1.调试 键盘驱动 讲解 当我们insmod挂载了键盘驱动后,找到键盘驱动被放在event1设备里, 此时没有按 ...

  7. JDBC第二篇--【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】

    这是我JDBC的第一篇 http://blog.csdn.net/hon_3y/article/details/53535798 1.PreparedStatement对象 PreparedState ...

  8. Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/***]]

    问题描述:Tomcat容器和Eclipse启动运行时候报错 Failed to start component [StandardEngine[Catalina].StandardHost[local ...

  9. Openlayers系列(一)关于地图投影的理解

    背景 近期开发以MongoDB为基础的分布式地理数据管理平台系统,被要求做一个简单的demo给客户进行演示.于是笔者便打算向数据库中存储一部分瓦片数据,写一个简单的存取服务器,使用Openlayers ...

  10. Java编程 “提高性能” 应尽力做到

    除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Java编程中尽可能要做到的 ...