我是驱动程序编程的新手,我编写了一个简单的char设备驱动程序代码。当我在不使用指针的情况下编写它时,它崩溃了。
使用echo写入驱动程序时,它可以正常工作。但是当从中读取时,没有输出。有人请帮忙。文件操作部分代码如下所示。 'p'和'q'是正常的字符指针。 'max'值设置为10.'ptr'是静态int类型,初始化为'0'。
int my_open(struct inode *inode,struct file *filp)
{
printk("In open.\n");
if((filp->f_flags & O_ACCMODE) == O_WRONLY){
p = (char *)buffer;
ptr = 0;
}
else if((filp->f_flags & O_ACCMODE) == O_RDONLY)
q = (char *)buffer;
return 0;
}
int my_close(struct inode *inode,struct file *filp)
{
printk("In close.\n");
return 0;
}
ssize_t my_read(struct file *filp,char *buff,size_t count,loff_t *pos)
{
long ret;
printk("In read.\n");
ret = copy_to_user(buff,q,max);
q += max;
*pos += max;
if(ptr -= max)
return max;
else
return 0;
}
ssize_t my_write(struct file *filp,const char *buff,size_t count,loff_t *pos)
{
long ret;
printk("In write.\n");
ret = copy_from_user(p,buff,max);
p += max;
*pos += max;
ptr += max;
return max;
}
module_init(my_init);
module_exit(my_exit);
答案 0 :(得分:1)
在读取和写入时,您没有考虑“count”参数,因为您的代码似乎假设“count> = max”,这是不能保证的。这本身可能会导致执行读取过程中出现任何问题。另外,在检查当前读取或写入位置是否超过缓冲区限制之前,先复制copy_to / from_user。此外,赋值/测试if (ptr -= max)
仅在ptr完全等于max时有效,也不保证您多次执行读取。
注意:由于缺少p,q,buffer,ptr和max的定义,我假设它们看起来像:
static char *p;
static char *q;
statint int ptr = 0;
static char buffer[10];
static int max=10;