【问题标题】:Linux kernel module copy_to_user not workingLinux内核模块copy_to_user不工作
【发布时间】:2014-10-30 18:43:38
【问题描述】:

我正在尝试为 Raspberry Pi 编写一个 Linux 内核模块。一切都很好,除了当我尝试使用 copy_to_user 或 put_user 时,如果我将其打印为 llu,它总是返回值“34336”,如果我将其打印为字符,则什么都不是。

有趣的是它正在工作,我做了一些更改,它停止工作,我恢复到工作版本,它不再工作。

模块代码:

    ssize_t st_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
    {
            char memory_buffer = 'b';
            /* Transferring data to user space */
            copy_to_user(buf,memory_buffer,1);

            /* Changing reading position as best suits */
            if (*f_pos == 0) {
                    *f_pos+=1;
                    return 1;
            } else {
                    return 0;
            }
    }

读码值:

    fd = open("/dev/systimer", O_RDONLY);

    // check for errors
    if(fd < 0) {
            perror("open(O_RDONLY)");
            return errno;
    } else
            close(fd);

    read(fd, &buf, 1);
    printf("Buffer: %llu\n", buf);
    printf("Buffer2: %c\n", buf);

输出是:

    Buffer: 34336
    Buffer2:

谢谢。

【问题讨论】:

  • buf 是否声明为 charunsigned long long
  • buf的类型是什么?是否与memory_buffer 相同? printf("Buffer: %x\n", buf); 的结果是什么?

标签: c linux kernel


【解决方案1】:

您在阅读之前已关闭。你应该经常检查read()的返回值

// check for errors
if(fd < 0) {
        perror("open(O_RDONLY)");
        return errno; 
} else
        close(fd);   // <-- you are closing the fd here

read(fd, &buf, 1);   // <-- fd is closed

【讨论】:

    【解决方案2】:

    你试过了吗?

    copy_to_user(buf, &memory_buffer, 1);
    

    【讨论】:

    • @MustardTiger 是否也是相同的值 (34336)?
    【解决方案3】:

    你可以试试下面的代码,而不是 copy_to_user

     sprintf(buf, "%u\n", memory_buffer);
    

    -帕尼

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2013-12-17
      • 2021-10-31
      • 2012-03-06
      • 1970-01-01
      • 2018-02-28
      相关资源
      最近更新 更多