3

我从 lkmpg 编译并运行chardev.c示例,写入设备时收到意外错误:

anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied

模块写入函数如下所示:

/*  
 * 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;
}

我没有收到无效操作的预期错误,并且错误打印到 /var/log/messages。

我可以毫无问题地从设备读取,收到预期的结果:

anon@anon:~/lkmpg$ cat /dev/chardev 
I already told you 6 times Hello world!

设备 /dev/chardev 是使用以下命令手动创建的:

sudo mknod /dev/chardev c 252 0

这是怎么回事?

- 编辑 -

显然,当我 mknod 创建设备时,它最终具有以下权限:

crw-r--r-- 1 root root 252, 0 2009-10-30 09:27 /dev/chardev. 

一旦我这样做sudo chmod a+w /dev/chardev了,司机就会按预期工作。

但是,人们说这样做是不正确的。

什么是正确的行动方针,为什么?

4

2 回答 2

5

关于如何实现字符驱动程序的一个非常、非常、非常直接且简单的示例可以在drivers/watchdog/softdog.c

您可以将您的代码与此示例进行比较,该示例向您展示了如何执行以下操作:

  • 从设备读取
  • 写入设备
  • 通过设备呈现 ioctl 接口

虽然 softdog 是一个非常有用的工具,但它与其他任何东西一样都是教程。艾伦考克斯把它放在一起,所以它是更“正确”实施的一个很好的例子。

如果您可以将整个源代码发布到您的模块,我们可以帮助您找出您的函数未按预期输入的原因。

更新:

允许特权用户写入字符设备是完全可以接受的!我再说一遍,允许特权用户写入字符设备是完全可以接受的!如果不是这种情况,FUSE、调制解调器、USB Gadgets、CD ROMS 和其他东西将需要 root 访问权限才能使用。

您可以做的是利用成员身份。即,在 Ubuntu 上,允许使用 FUSE(用户空间中的文件系统)的用户应该属于“fuse”组,该组允许精细访问谁可以使用该功能,谁不能使用该功能。同样,在我的一些系统上,正在使用 QRNG(量子随机数生成器)......并且是(你猜对了)一个字符设备。我需要允许 PHP 访问该设备,所以我:

  • 创建一个 QRNG 组
  • 确保 PHP 以用户身份运行(不是匿名系统用户)
  • 将拥有需要访问设备的应用程序的用户添加到 QRNG 组

我希望能解决它:)

于 2009-10-31T01:57:28.607 回答
4

我认为,实际问题是您发出的写入命令不正确。尝试

#sudo sh -c "echo "hi" > /dev/chardev"

如果要使用 sudo 运行多个命令,则应使用如上所示的命令。有了这个,您也不需要执行 chmod 并更改其权限。希望这可以帮助。

于 2009-10-30T11:34:09.833 回答