Linux kernel Linux设备驱动程序-什么';我的设备有什么问题?
我一直在写一个devicedev/my_inc,它将取一个表示为ASCII字符串的正整数N,并将其存储在内部。从设备读取的任何数据都应产生整数(N+1)的ASCII字符串表示形式 但是,当我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的输出: 当从
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()解决了我的问题。谢谢