Kmalloc работает некорректно

У меня проблемы с этим системным вызовом и, возможно, с kmalloc.

Ну, в основном я строю системный вызов, и этот системный вызов и ядро ​​компилируются без проблем. Но когда я вызываю свой системный вызов, оболочка показывает много сообщений, а затем происходит сбой компьютера.

Я думаю, что проблема связана с kmalloc , потому что, когда я удаляю kmalloc и другой код, включающий kmalloc, системный вызов работает отлично.

Например: bloqueados = kmalloc(sizeof(struct bloqueio),GFP_ATOMIC);

Просто добавлю: возможно, это тупик, но я точно не знаю.

Спасибо.

Это код:

#include <linux/linkage.h>
#include <linux/io_block_unblock.h>
//#include <linux/printk.h>
#include <linux/kernel.h>
#include <linux/unistd.h>
#include <linux/stddef.h>
#include <linux/slab.h>
#include <linux/gfp.h>
#include <linux/unistd.h>
#include <linux/uaccess.h>
#include <linux/fs.h>
#include <linux/mount.h>
#include <linux/genhd.h>
#include <linux/device.h>

struct bloqueio *bloqueados;
EXPORT_SYMBOLL(bloqueados);
asmlinkage long sys_io_block(const char __user *particao, const char __user *arquivo){
    int id_inode;
    struct file *arq;
    char *part;
    struct bloqueio *tmp;
    arq  = filp_open(arquivo,O_CREAT, S_IRWXU);
    printk(KERN_EMERG "\nstruct file criado para o arquivo %s",arquivo);
    id_inode = arq->f_path.dentry->d_inode->i_ino;
    printk(KERN_EMERG "\nO inode do arquivo %s e  %d",arquivo, id_inode);
    //part = arq->f_path.mnt->mnt_sb->s_bdev->bd_part->__dev.init_name;
    //printk(KERN_EMERG "\nA particao a qual o arquivo se encontra e %s",part);
    if(bloqueados == NULL){
            bloqueados = kmalloc(sizeof(struct bloqueio),GFP_ATOMIC);//<--------------
            if(!bloqueados){
                    printk(KERN_EMERG "\n Erro ao alocar memoria");
                    return 0;
            }
            bloqueados->inode = id_inode;
            bloqueados->tipo = 0;
            bloqueados->prox = NULL;
    }
    else
    {
            tmp = kmalloc(sizeof(struct bloqueio), GFP_ATOMIC);//<--------------------
            if(!bloqueados){
                    printk(KERN_EMERG "\n Erro ao alocar memoria");
                    return 0;
            }
            tmp->inode = id_inode;
            tmp->tipo = 0;
            tmp->prox = bloqueados->prox;
            bloqueados->prox = tmp;
    }
    return 1;

}

Добавлю, что это структура bloqueio.

extern int contem(const char *arquivo);

struct bloqueio{
   int inode;
   int tipo;   // 0 -> arquivo   1 -> partição
   struct bloqueio *prox;
};

 extern struct bloqueio *bloqueados;

person UserJ    schedule 04.12.2011    source источник
comment
Вставьте сообщение Oops, которое вы получаете, когда происходит сбой.   -  person caf    schedule 05.12.2011


Ответы (1)


Видимо, я пока не могу комментировать, поэтому задам пару вопросов в качестве ответа...

Я вижу "EXPORT_SYMBOLL(блокировки);" ... это была опечатка только при копировании/вставке или это опечатка в самом коде? Это может быть проблемой...

По какой причине вы используете GFP_ATOMIC против GFP_KERNEL?

Это может помочь,

http://www.linuxjournal.com/article/6930

Он рекомендует не использовать GFP_ATOMIC, если он вам абсолютно не нужен... потому что он может дать сбой. Я мог бы что-то упустить, но я не понимаю, зачем вам это нужно... похоже, вы не используете никаких замков.

person Daniel Placek    schedule 04.12.2011
comment
Раньше я пытался выделить с помощью GFP_KERNEL, но компьютер также дал сбой. Я думаю, что EXPORT_SIMBOL(bloqueados) не проблема, потому что он работает без kmalloc. Но я использую EXPORT_SIMBOL(bloqueados) для ссылки на глобальную переменную системы. - person UserJ; 05.12.2011
comment
Ну, я вижу здесь, что я написал EXPORT_SYMBOLL(bloqueados), я думаю, что правильно EXPORT_SYMBOL(bloqueados). Но я думаю, что я скомпилировал с EXPORT_SYMBOL(bloqueados). И я думаю, что если бы я написал EXPORT_SYMBOLL(bloqueados), у меня будет проблема с компиляцией ядра. - person UserJ; 05.12.2011