Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45620
  • 博文数量: 8
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 112
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-14 19:25
个人简介

未来自己创造

文章分类

全部博文(8)

文章存档

2017年(8)

我的朋友

分类: LINUX

2017-04-12 10:56:57

mdev的使用方法和原理

mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生热插拔时间的时候,mdev是被hotplug直接调用,这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式的根文件系统时,使用它是最优的选择。

1)mdev的基本介绍及使用方法
mdev有两个主要的应用,初始化对象和动态更新,两个应用都需要内核sysfs的支持,且必须将sysfs挂载到/sys。为了是实现动态更新,你还必须在内核配置时增加热插拔的支持(hotplugging)\下面是系统初始化脚本中一个典型的使用mdev的代码片段
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s
当然, 一个对mdev更完整的安装还必须在以上代码段前执行下面的命令:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6]mount -t devpts devpts /dev/pts
简单说明一下上面的代码:
[1] 你必须在执行mdev前挂载/sys
[2] 随后你[2]命令内核在增删设备时执行 /bin/mdev
[3] 设置mdev,让它在系统启动时创建所有的设备节点
[4] 而对mdev更完整的安装,你必须确保[4] /dev是tmpfs
[5] (假设文件系统在flash外运行),而且你必须[5]创建
2)mdev.conf的规则
: [<@|$|*> ]
devic regex : 使用正则表达式表示的设备节点
uid gid    : uid 和gid
octal permissions : 八进制的权限位
其中的特殊字符的解释:
@ 在创建设备节点后运行命令
$ 在删除设备节点前运行命令
* 在创建设备节点后和删除设备节点前都运行的命令
//好的,废话说完了,接下来是如何使用和配置

    mdev的使用
      1.在使用busybox制作根文件系统的时候,(make menuconfig)选择支持mdev
Linux System Utilities  --->  
          [*] mdev      
          [*]  Support /etc/mdev.conf
          [*]  Support command execution at device


2.在文件系统添加如下内容
Vim /etc/init.d/rcS
        echo "----------mount /sys as sysfs"
        mount -t tmpfs mdev /dev 
        mount -t sysfs sysfs /sys
        mkdir /dev/pts
        mount -t devpts devpts /dev/pts
        echo "----------Starting mdev......"

 echo "echo /sbin/mdev > /proc/sys/kernel/hotplug"
        echo /sbin/mdev > /proc/sys/kernel/hotplug
        echo "mdev -s"
        mdev -s
这些语句的添加在mdev的手册中可以找到。

注意:是/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug,并非/bin/echo /bin/mdev > /proc/sys/kernel/hotplug。
<注>    udev是要内核支持热插拔的,如果你的内核不支持热插拔,需要配置重新编内核,如果发生类似问题,可以去我另一篇博文
        3.接下来是关于挂载的处理。mdev是走mdev.conf的,依赖它的内容做有趣的事,比如声卡吧
在嵌入式Linux板子上调试USB声卡,使用mdev创建设备节点时默认直接在 /dev/目录下创建,  如
  1. controlC0 pcmC0D0c seq sequencer2
  2. mixer pcmC0D0p sequencer timer
但是用户空间的程序alsa-lib, alsa-utils都是去 /dev/snd/目录下找这些设备节点, 怎么能让mdev把设备节点创建在子目录下呢? 
在busybox源代码的 doc/mdev.txt 文档里面找到以下说明: 
 
  1. You can rename/move device nodes by using the next optional field.
  2.         <device regex> <uid>:<gid> <permissions> [=path]
  3. So if you want to place the device node into a subdirectory, make sure the path
  4. has a trailing /. If you want to rename the device node, just place the name.
  5.         hda 0:3 660 =drives/
  6. This will move "hda" into the drives/ subdirectory.
  7.         hdb 0:3 660 =cdrom
  8. This will rename "hdb" to "cdrom".
  9.  
  10. Similarly, ">path" renames/moves the device but it also creates
  11. a direct symlink /dev/DEVNAME to the renamed/moved device.
所以, 我们只要在 /etc/mdev.conf配置文件里面加入几行就可以了: 

  1. controlC[0-9] 0:0 0660 =snd/
  2. pcm.* 0:0 0660 =snd/
  3. seq.* 0:0 0660 =snd/
  4. mix.* 0:0 0660 =snd/
  5. timer 0:0 0660 =snd/
这样再运行mdev, ALSA相关的设备节点就都创建在  /dev/snd/ 目录下了。 
我的完整的mdev.conf如下(仅供参考)

# support module loading on hotplug
$MODALIAS=.* root:root 660 @modprobe "$MODALIAS"

# alsa sound devices and audio stuff
pcm.* 0:0 660 =snd/
control.* 0:0 660 =snd/
midi.* 0:0 660 =snd/
seq 0:0 660 =snd/
timer 0:0 660 =snd/

dsp 0:0 660 >sound/
mixer 0:0 660 >sound/
sequencer.* 0:0 660 >sound/

另外,在调试的时候你可以去/etc下面找mdev.conf,去/dev下看一下snd是否已经存在,若存在,进去看看是不是有你想要的东西
查看etc/init.d里面的 rcS 是否已经改好了 
之前“”里面说的那个bin和sbin的问题,一定不要搞混了

下面重新编译文件系统重新运行mdev即可



阅读(6673) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:指针函数和函数指针

给主人留下些什么吧!~~