Linux设备模型(热插拔、mdev 与 firmware)(2)

以我实验为例,我以上一篇的文章中的sculld为基础,加上了类接口(这样在/sys/devices/ldd0/sculld*/和 /sys/class/ldd/sculld* 中都有内容为设备号的“dev”属性文件)。在运行时发现一直会将有的sculld*创建为块设备节点文件。郁闷死了,难道我的驱动有错???最后研究了mdev源码之后发现,只要在 /sys中建立了“dev”属性文件且内容是设备号,mdev就会以所在的目录为名在/dev 下创建设备节点文件。像sculld模块,mdev会为一个设备创建两次设备文件,由于文件名一样,第二次的文件会覆盖第一次的。如果第二次是因为/sys/devices/ldd0/sculld*/dev 产生的设备节点文件,那么设备节点文件就会被错误地创建为块设备。

我认为这个bug的解决办法有如下两种:

(1)在你写驱动的时候,只在/sys/class 和 /sys/block 中的类设备目录中存在包含设备号的“dev”属性文件。(你无法保证被人的驱动会这么做)

(2)修正mdev源码:

修改/busybox-1.9.0/util-linux/mdev.c文件的第328行:

if (!strcmp(action, "remove"))
       make_device(temp, 1);

else if (!strcmp(action, "add")) {
         if (env_path[2]=='l') make_device(temp,0);  //tekkamanninja
            if (ENABLE_FEATURE_MDEV_LOAD_FIRMWARE)
                load_firmware(getenv("FIRMWARE"), temp);
        }

 

也就是在增加设备节点文件之前检查/sys/目录下的路径是否为/class和/block(通过检查路径字符串的第3个字符是否为‘l’)。

本人推荐第二种做法!

 

 

mdev使用

mdev的使用在busybox中的mdev.txt文档已经将得很详细了。但作为例子,我简单讲讲我的使用过程:

 

(1)在编译时加上对mdev的支持(我是使用的是busybox1.9.0):
    Linux System Utilities  --->   
           [*] mdev      
           [*]   Support /etc/mdev.conf
           [*]     Support command execution at device addition/removal

 

(2)在启动时加上使用mdev的命令:

我在自己创建的根文件系统(nfs)中的/linuxrc文件中添加了如下指令:

#挂载/sys为sysfs文件系统
    echo "----------mount /sys as sysfs"
    /bin/mount -t tmpfs mdev /dev
    /bin/mount -t sysfs sysfs /sys
    echo "----------Starting mdev......"
    /bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s

 
注意:是/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug,并非/bin/echo /bin/mdev > /proc/sys/kernel/hotplug。busybox的文档有错!!

(3)在你的驱动中加上对类设备接口的支持,并在类设备目录下添加包含设备号的名为“dev”的属性文件。

 

(4)至于/etc/mdev.conf文件,可有可无,不影响使用,只是添加了些功能。

     为了实验我在/etc创建了mdev.conf文件并输入了:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwxxwf.html