获取 cat:/dev/mydevice1:尝试在驱动程序中通信时将无效参数作为输出

Posted

技术标签:

【中文标题】获取 cat:/dev/mydevice1:尝试在驱动程序中通信时将无效参数作为输出【英文标题】:Getting cat: /dev/mydevice1: Invalid argument as output when trying to communicate in driver 【发布时间】:2013-12-15 18:18:54 【问题描述】:

我正在尝试在 Linux 内核中开发一个 FIFO 虚拟字符设备驱动程序。 我正在尝试将数据从在一台设备上执行的一个进程复制到在另一台相同类型的设备上执行的另一个进程。

我试图从 mydevice1 读取数据

cat /dev/mydevice1

并写入我的设备

echo a > /dev/mydevice

但我不断收到错误:

cat: /dev/mydevice1: 参数无效

在第二个设备输出(即读取设备)中。

这是我要从设备读取的代码

static ssize_t device_read( struct file *file,char *bufStoreData, size_t count,
loff_t *ppos )                       


    ssize_t val = 1;
    if(access_mode == WRITE_MY)
        return -EINVAL;
    else
          res = wait_event_interruptible (read_queue, ready_to_read);

    printk(KERN_ALERT "going to copy\n");
    res = copy_from_user(bufStoreData,virtual_device.data,count);           
    printk(KERN_ALERT "copied data %c \n",virtual_device.data[0]);
    ready_to_read = 0;  
    ready_to_write = 1;  
    wake_up_interruptible (&write_queue);
        return val;  

当我使用dmesg 检查输出时,我得到数据正在被复制,但我没有在设备上得到任何输出。在读取设备的输出中获取无效参数。

【问题讨论】:

在读取的代码中,需要复制to用户,而不是from用户。 我同意 n.m.当你在读取一个文件时,你是从进程的角度来读取的,数据需要从内核的内存复制到用户的内存,也就是copy_to_user。 【参考方案1】:

同意 n.m 和 Safayet Ahmed,尝试改变:

res = copy_from_user(bufStoreData,virtual_device.data,count);           

收件人:

res = copy_to_user(bufStoreData,virtual_device.data,count);           

命名法可能有点混乱,我认为它是用户空间进程从内核内存读取数据或向内核内存写入数据。

在稍微不同的主题上,该函数始终返回1,无论读取的字节数如何。传统的读取函数返回读取的字节数,或者-1 与设置errno 结合使用以指示错误。你是故意打破这个约定吗?

另外,每次函数运行时,res 变量中的wait_event_interruptible 的结果都会被覆盖。

【讨论】:

以上是关于获取 cat:/dev/mydevice1:尝试在驱动程序中通信时将无效参数作为输出的主要内容,如果未能解决你的问题,请参考以下文章

Shell:用 cat 捕获用户输入

在 RegEx 中的最后一个斜杠之后获取值并忽略类别 slug

有没有办法在 FxCop 10.0 中获取 CAT.NET 规则

如何获取路由器未加载的组件中路由更改的当前路由参数

LARAVEL - 如何获取模型的属性

destoon6.0获取当前分类和子类