我是一名学生,正在尝试学习Linux字符设备驱动程序。我一直在关注写为 here 的教程经过一些修改。该驱动程序的读写系统调用仅在字符缓冲区上进行读写。问题是,在我看来,参数 loff_t *off 在不应该这样做时改变了它的值。我的意思是,如果你看到下一段代码。
static ssize_t my_write(struct file *f, const char __user *buf,
size_t len, loff_t *off){
int i;
char byte;
printk(KERN_INFO "Driver: write()\n");
printk(KERN_INFO "1. The value of *off is:%i\n",*off);
if (*off >= (BUFFER_SIZE - 1)){
return 0;
}
printk(KERN_INFO "2. The value of *off is:%i\n",*off);
if ((*off + len) > (BUFFER_SIZE - 1)){
len = BUFFER_SIZE - 1 - *off;
}
printk(KERN_INFO "3. The value of *off is:%i\n",*off);
for (i = 0; i < len; i++){
if (copy_from_user(&byte, buf + i, 1)){
return -EFAULT;
}
c[i]=byte;
}
printk(KERN_INFO "4. The value of *off is:%i\n",*off);
c[len]='\n';
*off += len;
printk(KERN_INFO "5. The value of *off is:%i\n",*off);
return len;
}
控制台上 printk 调用的结果是:
- *off 的值为:0
- *off 的值为:-1
- *off 的值为:0
- *off 的值为:693260
- *off 的值为:-2132049164
你能告诉我为什么吗?谢谢。
最佳答案
摘自第 3 章:LDD 中的字符驱动程序...
off
是一个指向“长偏移类型”对象的指针,该对象指示用户正在访问的文件位置。
无论方法传输多少数据量,它们通常都应该更新 *offp 处的文件位置表示成功完成后的当前文件位置 系统调用。
有关详细信息,请参阅 https://lwn.net/images/pdf/LDD3/ch03.pdf 中的图 3-2
关于linux - 使用 Linux 字符设备驱动程序的 'write' 函数中的参数之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23239464/