无法写入/ dev/*文件

hia*_*ome 3 linux bash shell linux-device-driver linux-kernel

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

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

我在代码中添加了read,write,open,release方法.

当我尝试读取/ dev /下的设备文件时,调用read方法.但是当我尝试使用echo在/ dev/file上写入时会出错

"bash:/ dev/scull:Permission denied"

我已经检查了文件的权限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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我用来打开文件的确切命令

    $ sudo echo 54 > /dev/scull
    
    Run Code Online (Sandbox Code Playgroud)
  3. 开放实现的源代码

    ssize_t scull_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos){
         pr_alert("Device Written\n");
         return 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)

行为我正在寻找这里,我应该能够看到'Device Written'dmesg输出中?

Mar*_*bel 7

我假设你通常不是你的bash shell的root.然后这个命令行

sudo echo 54 > /dev/scull
Run Code Online (Sandbox Code Playgroud)

不是你的想法.该命令分两步执行:

  1. bash设置输出重定向,即它尝试/dev/scull使用当前用户权限打开.
  2. sudo echo 54执行该命令,然后stdout连接到该文件.

由于您没有作为非root用户的写入权限,因此第一步失败并且bash报告

"bash:/ dev/scull:Permission denied"

您必须已经root设置输出重定向.这样执行

sudo -i
Run Code Online (Sandbox Code Playgroud)

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

echo 54 > /dev/scull
Run Code Online (Sandbox Code Playgroud)

在那个root shell中.

  • @hiabcwelcome不,这个命令打开另一个子shell.按CTRL + D或键入`exit`命令. (2认同)