我正在制作一个简单的fifo风格的字符模块。我在努力让它听话。下面是发生的事情:
我得到
close failed in file object destructor:
IOError: [Errno 14] Bad address
当我试图关闭一个文件对象,我正在使用我的字符设备交谈。当我试图从中读取时,我也得到了一个错误的地址。我对内核编程很陌生,所以我不太确定这些症状意味着什么。下面是一些相关的代码。如有任何帮助,不胜感激:
int pop(char *source, char* dest, int count)
{
// take count values from source, store in dest
memcpy(dest,source,count);
memset(source,0x00,count);
return 0;
}
ssize_t ent_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
int retval;
char *temp;
int copy_count;
printk(KERN_ALERT "entropy_feed: module reading...n");
if (level>=count)
{
copy_count=count;
}
else
{
copy_count=level;
}
printk(KERN_ALERT "entropy_feed: allocating temp memory buffer");
temp = kcalloc(copy_count,1,GFP_KERNEL);
if (down_interruptible(&sem))
{
retval= -ERESTARTSYS;
goto u_out;
}
printk(KERN_ALERT "entropy_feed: semaphore locked");
printk(KERN_ALERT "entropy_feed: popping");
pop(buffer+level-copy_count, temp, copy_count);
printk(KERN_ALERT "entropy_feed: popped");
level-=copy_count;
if (copy_to_user(buf,temp,copy_count))
{
retval= -EFAULT;
goto out;
}
out:
up(&sem);
printk(KERN_ALERT "entropy_feed: semaphore unlocked");
u_out:
kfree(temp);
printk(KERN_ALERT "entropy_feed: exiting read function")
return retval;
}
ssize_t ent_write(struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
{
int retval;
char *temp;
int copy_count;
printk(KERN_ALERT "entropy_feed module writing...n");
copy_count=level-max_lvl;
if (count<copy_count)
copy_count=count;
if (down_interruptible(&sem))
{
retval= -ERESTARTSYS;
goto u_out;
}
printk(KERN_ALERT "entropy_feed: semaphore locked");
temp = kcalloc(count,1,GFP_KERNEL);
if (copy_from_user(temp,buf,count))
{
retval= -EFAULT;
goto out;
}
printk(KERN_ALERT "entropy_feed: popping");
pop(temp, buffer+level, copy_count);
printk(KERN_ALERT "entropy_feed: popped");
level+=copy_count;
out:
up(&sem);
printk(KERN_ALERT "entropy_feed: semaphore unlocked");
u_out:
kfree(temp);
printk(KERN_ALERT "entropy_feed: exiting write function");
return retval;
}
struct file_operations ent_fops = {
.owner = THIS_MODULE,
.read = ent_read,
.write = ent_write,
};
14号错误是EFAULT
。
查看您的ent_read()
函数,如果函数成功,我没有看到您将retval
设置为写入的字节数,因此您只是在非失败情况下返回retval
中未初始化的任何值。尝试添加
retval = copy_count;
在
前面 out:
行,以便在读取成功的情况下获得正确的返回值。
就关闭错误而言,您的实际file_operations结构是否有flush
方法?如果是的话,你从中得到了什么?否则我不明白为什么close()
会为你返回EFAULT
。