Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: UserJОтветов: 1

У меня проблемы с этим системным вызовом и, возможно, с 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;
  • Вставьте сообщение Oops, которое вы получаете, когда происходит сбой. caf 05.12.2011

clinux-kernel

Ответы

Ответ 1 · Daniel Placek

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

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

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы