代码之家  ›  专栏  ›  技术社区  ›  Robert S. Barnes Antoni

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

  •  2
  • Robert S. Barnes Antoni  · 技术社区  · 15 年前

    我编译并运行 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 回复  |  直到 15 年前
        1
  •  5
  •   Tim Post Samir J M Araujo    15 年前

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

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

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

    虽然SoftDog是一个非常有用的工具,但它和其他任何工具一样,也是一个教程。艾伦·考克斯把它放在了一起,所以这是一个更“恰当”实施的好例子。

    如果您可以将整个源代码发布到您的模块,我们可以帮助您了解为什么您的函数没有按预期输入。

    更新:

    它是 完美 允许权限不足的用户写入字符设备!我再说一遍,是 完全可以接受 允许权限不足的用户写入字符设备!如果不是这样的话,诸如保险丝、调制解调器、USB小工具、CD-ROM和其他东西都需要根访问才能使用。

    你能做的就是利用 会员资格。也就是说,在Ubuntu上,允许使用fuse(用户空间中的文件系统)的用户应该属于“fuse”组,该组允许对哪些人可以使用或不能使用该功能进行精细访问。同样,在我的一些系统中,使用了一个qrng(量子随机数发生器)。它是一个字符设备。我需要允许PHP访问该设备,因此我:

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

    我希望能澄清一下:)

        2
  •  4
  •   Vinit Dhatrak    15 年前

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

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

    如果您想用sudo运行多个命令,那么应该使用上面所示的命令。这样,您就不需要执行chmod并更改其权限。希望这有帮助。