【发布时间】:2014-04-23 08:58:46
【问题描述】:
我是一名正在尝试学习 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
你能告诉我为什么吗?谢谢。
【问题讨论】:
标签: linux linux-kernel linux-device-driver kernel-module