Rob*_*nes 2 linux kernel kernel-module linux-device-driver
我编译和运行的chardev.c从例子中lkmpg和写入设备时,收到了意想不到的错误:
anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied
Run Code Online (Sandbox Code Playgroud)
模块写入功能如下所示:
/*
* Called when a process writes to dev file: echo "hi" > /dev/chardev
*/
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
return -EINVAL;
}
Run Code Online (Sandbox Code Playgroud)
我没有收到无效操作的预期错误,并且错误打印到/ var/log/messages.
我可以从设备上读取没有问题,收到预期的结果:
anon@anon:~/lkmpg$ cat /dev/chardev
I already told you 6 times Hello world!
Run Code Online (Sandbox Code Playgroud)
使用以下命令手动创建设备/ dev/chardev:
sudo mknod /dev/chardev c 252 0
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
- 编辑 -
显然,当我mknod创建设备时,它最终具有以下权限:
crw-r--r-- 1 root root 252, 0 2009-10-30 09:27 /dev/chardev.
Run Code Online (Sandbox Code Playgroud)
一旦我做sudo chmod a+w /dev/chardev了驱动程序按预期工作.
然而,人们说这样做是不正确的.
什么是正确的行动方案,为什么?
有关如何实现字符驱动程序的真正,非常非常直接和简单的示例,请参阅 drivers/watchdog/softdog.c
您可以将代码与此示例进行比较,该示例向您展示了如何执行以下操作:
虽然softdog是一个非常有用的工具,但它与其他任何东西一样多.Alan Cox把它放在一起,所以它是更"正确"实现的一个很好的例子.
如果您可以将整个源发布到模块,我们可以帮助您找出未按预期输入功能的原因.
更新:
允许特权用户写入字符设备是完全可以接受的!我再说一遍,允许特权用户写入字符设备是完全可以接受的!如果不是这种情况,FUSE,调制解调器,USB小工具,CD ROM和其他东西都需要使用root访问权限.
你可以做的是利用团体会员资格.即,在Ubuntu上,允许使用FUSE(用户空间中的文件系统)的用户应该属于"fuse"组,这允许对谁能够和不能使用该功能进行细粒度访问.同样,在我的一些系统中,QRNG(量子随机数发生器)正在使用中......并且(你猜对了)一个字符设备.我需要允许PHP访问该设备,所以我:
我希望清除它:)