上一篇做字符设备驱动时,创建的设备节点/dev/mycdev 为root用户root组,且权限为0600,这就导致一般的应用程序无法访问上网查询得知可通过udev自创规则来实现:创建设备节点时设置权限。
详情参考:http://blog.chinaunix.net/uid-23670869-id-2391638.html。
zhou@zhoupc:~$ cd /etc/udev/rules.d/
zhou@zhoupc:/etc/udev/rules.d$ ls
99-vmware-scsi-udev.rules README
里面是一些以两位数字开头,以rules为后缀的规则文件,数字小的规则文件先执行。必须以sudo创建规则文件。
zhou@zhoupc:/etc/udev/rules.d$ sudo vim 99-my-udev.rules
里面写入
KERNEL=="mycdev",MODE="0666"
其中 == 号表示匹配,= 号表示赋值。KERNEL表示内核中看到的设备名称,也就是你在驱动里面设置的DEV_NAME。MODE表示要设置的权限。结合起来整句话就是,如果发现一个新的设备叫做“mycdev”的话,就把它的节点权限设置为“0666”。这样其他程序就能以普通权限来访问了。
KERNEL匹配的字符串可以是 sd* 这种类型的,代表匹配sd开头的设备。
配置前:
zhou@zhoupc:/etc/udev/rules.d$ ls
! 99-my-udev.rules.old 99-vmware-scsi-udev.rules README
改后缀名后就不生效了。
zhou@zhoupc:~/lnxdrv$ sudo insmod mycdev.ko
zhou@zhoupc:~/lnxdrv$ ll /dev/mycdev
crw------- 1 root root 250, 0 9月 10 21:19 /dev/mycdev
可以看到只有root用户可以RW
zhou@zhoupc:~/lnxdrv$ ./mycdevtst
open error: Permission denied
这时普通程序尝试open /dev/mycdev时产生权限错误
zhou@zhoupc:/etc/udev/rules.d$ ls
! 99-my-udev.rules 99-vmware-scsi-udev.rules README
加入规则
zhou@zhoupc:~/lnxdrv$ sudo insmod mycdev.ko
zhou@zhoupc:~/lnxdrv$ ll /dev/mycdev
crw-rw-rw- 1 root root 250, 0 9月 10 21:24 /dev/mycdev
可以看到权限已经变为其他用户RW
zhou@zhoupc:~/lnxdrv$ ./mycdevtst
old data is 0
new data is 1
ioctl : new data is 90
普通权限也可以访问了
但是我还是觉得有缺点,毕竟还得手动添加规则,可能还不如直接在驱动里面更改权限来得快。
下一篇想用一个暴力点的办法解决,在网上实在找不到好点的解决办法