Linux kernel Linux设备驱动程序-什么';我的设备有什么问题?

Linux kernel Linux设备驱动程序-什么';我的设备有什么问题?,linux-kernel,driver,device-driver,Linux Kernel,Driver,Device Driver,我一直在写一个devicedev/my_inc,它将取一个表示为ASCII字符串的正整数N,并将其存储在内部。从设备读取的任何数据都应产生整数(N+1)的ASCII字符串表示形式 但是,当我cat/dev/my_inc时,我似乎只在用户空间中得到myinc_值的前一半 如果myinc_值为48,cat/dev/my_inc产生4 如果myinc_值为489324,cat/dev/my_inc产生489 但是,bytes\u read表示整个消息已复制到用户空间。以下是dmesg的输出: 当从

我一直在写一个devicedev/my_inc,它将取一个表示为ASCII字符串的正整数N,并将其存储在内部。从设备读取的任何数据都应产生整数(N+1)的ASCII字符串表示形式

但是,当我
cat/dev/my_inc
时,我似乎只在用户空间中得到
myinc_值的前一半

  • 如果
    myinc_值
    为48,
    cat/dev/my_inc
    产生4

  • 如果
    myinc_值
    为489324,
    cat/dev/my_inc产生
    489

但是,
bytes\u read
表示整个消息已复制到用户空间。以下是dmesg的输出:

当从shell调用时:

root@rbst:/home/rob/myinc_mod# cat /dev/my_inc
489
资料来源:

// Read from the device
//
static ssize_t device_read(struct file * filp, char * buffer, 
    size_t length, loff_t * offset)
{
    char c;
    int bytes_read = 0;
    int value = myinc_value + 1;

    printk(KERN_INFO "my_inc device_read() called with value %d and msg %s.\n", 
        value, msg);

    // Check for zero pointer
    if (*msg_ptr == 0) 
    {
        return 0;
    }
    // Put the incremented value in msg 
    snprintf(msg, MAX_LENGTH, "%d", value);

    // Copy msg into user space
    while (length && *msg_ptr) 
    {
        c = *(msg_ptr++);
        printk(KERN_INFO "%s device_read() read %c. ", DEV_NAME, c);
        if(put_user(c, buffer++))
        {
            return -EFAULT;
        }
        length--;
        bytes_read++;
    }

    // Nul-terminate the buffer
    if(put_user('\0', buffer++))
    {
        return -EFAULT;
    }
    bytes_read++;
    printk("my_inc device_read() returning %d.\n", bytes_read);
    return bytes_read;
}

它只显示1个字节的原因是,在将msg_ptr设置为c之前,先增加msg_ptr。它需要是c=*msg_ptr++;或c=*msg_ptr;msg_ptr++;因此,增量发生在赋值之后,它只显示1个字节的原因是,在将msg_ptr设置为c之前,您正在增加msg_ptr。它需要是c=*msg_ptr++;或c=*msg_ptr;msg_ptr++;因此,增量发生在赋值之后

可能是将put_user()定义为宏,以便在

if(put_user(c, buffer++))
搞砸了-虽然我不明白它是如何解释你所看到的

无论如何,使用copy_to_user()来复制整个消息将更方便、更高效。

可能是将put_user()定义为宏,以便

if(put_user(c, buffer++))
搞砸了-虽然我不明白它是如何解释你所看到的


无论如何,使用copy_to_user()复制整个msg将更方便、更高效。

msg和msg_ptr在哪里定义/初始化?你为什么在设置味精之前就把它打印出来?我的公司价值是多少?你所说的“我只得到myinc_值输出到shell的第一个字节,即使循环末尾有bytes_read==2”是什么意思?两个字符不足以代表一个字节,而且——在任何情况下——你是以十进制格式打印int,所以只打印一个字节的概念是没有意义的。还要记住,您没有终止返回的字符串。msg和msg_ptr在我的头文件中定义为char*类型。在device_open()调用中,将myinc_值初始化为起始值(由宏定义),然后将与myinc_值等效的ascii复制到msg中。例如:myinc_值被初始化为整数47。字符串“47”被复制到msg指向的缓冲区中。device_read()将myinc_值读入value并递增,将字符串“48”放入msg。当我输入cat/dev/my_inc时,它输出没有换行符的“4”(可能是因为忘记终止字符串),这是我的msg缓冲区的第一个字符(字节)。msg和msg_ptr在哪里定义/初始化?你为什么在设置味精之前就把它打印出来?我的公司价值是多少?你所说的“我只得到myinc_值输出到shell的第一个字节,即使循环末尾有bytes_read==2”是什么意思?两个字符不足以代表一个字节,而且——在任何情况下——你是以十进制格式打印int,所以只打印一个字节的概念是没有意义的。还要记住,您没有终止返回的字符串。msg和msg_ptr在我的头文件中定义为char*类型。在device_open()调用中,将myinc_值初始化为起始值(由宏定义),然后将与myinc_值等效的ascii复制到msg中。例如:myinc_值被初始化为整数47。字符串“47”被复制到msg指向的缓冲区中。device_read()将myinc_值读入value并递增,将字符串“48”放入msg。当我cat/dev/my_inc时,它输出“4”而没有换行符(可能是因为忘记终止字符串),这是我的msg缓冲区的第一个字符(字节)。也不确定这如何解释我看到的内容,但使用copy_to_user()解决了我的问题。谢谢也不确定这是如何解释我看到的,但使用copy_to_user()解决了我的问题。谢谢