Kmalloc не работает правильно - PullRequest
0 голосов
/ 05 декабря 2011

У меня возникли некоторые проблемы с этим системным вызовом и, вероятно, с 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;

}

Просто добавим, это struct 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;

1 Ответ

0 голосов
/ 05 декабря 2011

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...