символьный модуль блюз: плохой адрес памяти при закрытии и чтении - PullRequest
0 голосов
/ 03 октября 2011

Я делаю простой символьный модуль в стиле 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,
};

1 Ответ

1 голос
/ 04 октября 2011

Ошибка номер 14 - EFAULT.

Глядя на вашу ent_read() функцию, я нигде не вижу, чтобы вы установили retval на количество записанных байтов, если функция завершится успешно, так что выпросто возвращают любое неинициализированное значение в retval в случае отказа.Попробуйте добавить

    retval = copy_count;

прямо перед строкой

    out:

, чтобы получить правильное возвращаемое значение в случае успешного чтения.

Что касается ошибкиесли закрыть, есть ли у вашей структуры file_operations метод flush?Если так, что ты возвращаешься из этого?Иначе я не понимаю, почему close() вернул бы EFAULT для вас.

...