在玩我板子是发现,编写驱动自动创建设备节点的函数后,mdev竟然会自动产生"字符设备"的节点!因为我移植的驱动是块设备驱动,所以肯定mdev机制出现问题,文件系统我用的是busybox 1.16.2。寻找解决方法找到竟然是busybox自身的bug导致....尼玛坑爹不,不过也正常,毕竟是开源工具,又不付费~~免费用人家东西,出点问题正常
...
其实问题出在busybox 1.16.2 的源码文件 util-linux/mdev.c中的make_device()函数(不同版本的busybox源码稍微有所不同,不过问题肯定在make_device()函数中):
type = S_IFCHR;
if (strstr(path, "/block/"))
type = S_IFBLK;
改为:
type = S_IFCHR;
f (strstr(path, "block"))
type = S_IFBLK;然后重新make(记得修改Makefile中的ARCH等~),以及make CONFIG_PREFIX=/path/from/root install。
![](http://ctc.qzs.qq.com/qzone/em/e143.gif)
其实问题出在busybox 1.16.2 的源码文件 util-linux/mdev.c中的make_device()函数(不同版本的busybox源码稍微有所不同,不过问题肯定在make_device()函数中):
type = S_IFCHR;
if (strstr(path, "/block/"))
type = S_IFBLK;
改为:
type = S_IFCHR;
f (strstr(path, "block"))
type = S_IFBLK;然后重新make(记得修改Makefile中的ARCH等~),以及make CONFIG_PREFIX=/path/from/root install。
strstr 函数是在第一个变量中查找第二个变量字符串找到了就返回真,否则返回假;在没改之前:打印make_device 函数中的path , type, S_IFBLK变量如下:
对于字符设备:以.device/mtd1 为例:
打印出的信息:
path = /sys/devices/virtual/mtd/mtd1
type = 8192, S_IFBLK = 24576
肯定type 和 S_IFBLK是不相等的。毫无疑问,因为他是字符设备,但是对于块设备,代码的意图应该是如果在path中找到block的字眼(而不是/block/字眼),就认为它是块设备,重新使type = S_IFBLK,即 块设备的这两个值是相等的。
而对于/device/mtdblk:
打印出来居然是这样的:
path = /sys/devices/virtual/mtd/mtd3/mtdblock3
type = 8192, S_IFBLK = 24576
很显然type 与 S_IFBLK 不等,显然是上述bug造成的,除非你的块设备文件名里含有/mtdblock/ 它才认为你是块设备。
还有一种解决法案:
每次加载模块后,执行mdec -s.
其实在/etc/init.d/rc.S(用Busybox制作的自启动文件) 中最后有句就是mdev -s,只不过是内核刚启动后对其自身生成的设备节点进行了mdev -s,这方面可看下busybox解压后的使用说明书