解决开发板中加载驱动后,不能在/dev下自动创建设备节点问题

在制作linux根文件系统时,会创建/etc/init.d/rcS文件,如下:

#!/bin/sh

echo "----------myrootfs start-------------------"

/bin/mount -a
/sbin/dev -s 

echo "----------myrootfs end-------------------"

每次开机,都会执行上面脚本文件,其中/bin/mount -a为挂载fstab中的文件系统,/sbin/dev -s 为创建设备节点

但是,如果要insmod一个驱动时,驱动加载成功,但是并没有在/dev下创建设备节点,原因是:/sbin/dev -s 只是系统启动时执行一次,之后再加载驱动,/sbin/mdev并不会再执行,所以没有在/dev下创建设备节点。

解决方法:

讲/etc/init.d/rcS文件中的/sbin/dev -s  改为:

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

重启开发板即可解决问题。

而其原理是:

mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用场合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或者动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。以‘-s’为参数调用位于/sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 /sys/class 和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。

启动时运行命令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。

 

 

你可能感兴趣的:(linux)