无法写入/dev/*文件



我正在为Linux内核编写一个基本的char设备驱动程序。为此,我考虑的代码流如下:

  1. alloc_chrdev_region()->使用主号码的动态分配
  2. class_create()->在sysfs中创建设备类
  3. device_creat()->在/dev/下创建设备/
  4. cdv_init()->初始化字符设备结构
  5. cdev_add()->在内核中添加我的设备结构

我在代码中添加了读、写、打开和发布方法。

当我尝试在/dev/下读取设备文件时,会调用我的读取方法。但当我尝试使用echo在/dev/文件上写入时,它会出现错误

"bash:/dev/scull:权限被拒绝"

我已经使用ls -l检查了文件的权限,并且我有权读取或写入此文件。

我编写的每个设备驱动程序模块都会出现此问题。它在另一台机器上运行良好。

我正在开发ubuntu 15.10,自定义编译的内核4.3.0

  1. ls -l /dev/scull:的结果

    crw------- 1 root root 247, 0 Dec 30 18:06 /dev/scull
    
  2. 我用来打开文件的确切命令

    $ sudo echo 54 > /dev/scull
    
  3. 开放实现的源代码

    ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){
         pr_alert("Device Writtenn");
         return 0;
    }
    

我在这里寻求的行为是,我应该能够在dmesg输出中看到'Device Written'

我假设您通常不是bash shell的root用户。然后这个命令行

sudo echo 54 > /dev/scull

不是你想的那样。该命令分两步执行:

  1. bash设置输出重定向,即尝试使用当前用户权限打开/dev/scull
  2. 命令CCD_ 11被执行,而CCD_

由于您作为非root用户没有写权限,第一步失败,bash报告

"bash:/dev/scull:权限被拒绝"

您必须已经是root才能设置输出重定向。从而执行

sudo -i

它为您提供了一个具有root权限的交互式shell。您可以执行

echo 54 > /dev/scull

在根壳内。

我知道线程太老了,无法回答,但如果有人想知道另一种方法而不切换到根用户,这里有解决方案:

sudo bash -c 'echo "54" > /dev/my_dev'

我想注意的是,在您的系统上,只有root(文件所有者)具有读/写权限。您的(正常)用户帐户没有!因此,另一个(快速)解决方案是授予所有用户读/写权限。

这可能不是最安全的解决方案!只能在测试环境中执行此操作

sudo chmod a+rw /dev/scull

但现在你用你的用户帐户测试你的模块(没有sudo)

echo "hello, world!" > /dev/scull
cat < /dev/scull

您可以在使用命令进行root操作时执行此操作

sudo su

然后进入/dev文件夹并输入命令(将数据保存到/dev/scull中)。

cd /dev
echo 54 > scull

最新更新