Linux内核模块copy_to_user无法正常工作

时间:2013-04-08 23:06:35

标签: c linux kernel

我正在考虑为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:

感谢。

3 个答案:

答案 0 :(得分:0)

您在阅读前已关闭。您应该始终检查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

答案 1 :(得分:-1)

你试过吗?

copy_to_user(buf, &memory_buffer, 1);

答案 2 :(得分:-2)

您可以尝试使用以下代码而不是copy_to_user

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

-Phani