“Linux内核模块程序员指南”中的chardev.c示例问题

时间:2009-10-30 07:54:47

标签: linux kernel linux-device-driver kernel-module

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

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后,驱动程序按预期工作。

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

什么是正确的行动方案?为什么?

2 个答案:

答案 0 :(得分:5)

drivers/watchdog/softdog.c

中可以找到真正,非常,非常简单的如何实现字符驱动程序的示例。

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

  • 从设备中读取
  • 写入设备
  • 通过设备提供ioctl接口

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

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

<强> 更新

完全可以允许特权用户在字符设备上写字!我再说一遍,允许特权用户写入角色设备完全可以接受!如果不是这种情况,FUSE,调制解调器,USB小工具,CD ROM和其他东西都需要root权限才能使用。

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

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

我希望能够清除它:)

答案 1 :(得分:4)

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

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

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