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/目录下创建, 如
-
controlC0 pcmC0D0c seq sequencer2
-
mixer pcmC0D0p sequencer timer
但是用户空间的程序alsa-lib, alsa-utils都是去 /dev/snd/目录下找这些设备节点, 怎么能让mdev把设备节点创建在子目录下呢?
在busybox源代码的 doc/mdev.txt 文档里面找到以下说明:
-
You can rename/move device nodes by using the next optional field.
-
<device regex> <uid>:<gid> <permissions> [=path]
-
So if you want to place the device node into a subdirectory, make sure the path
-
has a trailing /. If you want to rename the device node, just place the name.
-
hda 0:3 660 =drives/
-
This will move "hda" into the drives/ subdirectory.
-
hdb 0:3 660 =cdrom
-
This will rename "hdb" to "cdrom".
-
-
Similarly, ">path" renames/moves the device but it also creates
-
a direct symlink /dev/DEVNAME to the renamed/moved device.
所以, 我们只要在 /etc/mdev.conf配置文件里面加入几行就可以了:
-
controlC[0-9] 0:0 0660 =snd/
-
pcm.* 0:0 0660 =snd/
-
seq.* 0:0 0660 =snd/
-
mix.* 0:0 0660 =snd/
-
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即可
阅读(6967) | 评论(0) | 转发(0) |