2011-12-04 110 views
0

我在使用此系统调用时可能会遇到一些问题,可能是使用了kmalloc。Kmalloc无法正常工作

那么,基本上我正在建立一个系统调用,这个系统调用和内核编译没有问题。 但是当我打电话给我的系统调用时,shell会显示很多消息,然后电脑崩溃。

我认为这个问题是与kmalloc的,因为当我删除kmalloc的和其他代码envolves的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; 
+1

粘贴发生崩溃时获得的Oops消息。 – caf

回答

0

显然我不能发表评论,所以我会问几个问题,作为一个答案......

我看到“EXPORT_SYMBOLL(bloqueados);” ...这是一个错误的只是在你的复制/粘贴,或者在实际代码中输入错误?这可能是一个问题...

你使用GFP_ATOMIC vs GFP_KERNEL的原因是什么?

这可能会帮助,

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

如果你不是绝对需要它...因为它可以失败,那么建议不要使用GFP_ATOMIC。我可能会错过一些东西,但我不明白你为什么需要它......你似乎没有使用任何锁。

+0

我试图用GFP_KERNEL进行分配,但计算机也崩溃了。我认为EXPORT_SIMBOL(bloqueados)不是问题,因为它的工作方式没有kmalloc.But我使用EXPORT_SIMBOL(bloqueados)来引用系统的全局变量。 – UserJ

+0

嗯,我在这里看到我写了“EXPORT_SYMBOLL(bloqueados)”,我认为正确的是“EXPORT_SYMBOL(bloqueados)”。但我认为我编译时使用了EXPORT_SYMBOL(bloqueados)。并且我认为如果我写了EXPORT_SYMBOLL bloqueados)编译内核时会出现问题。 – UserJ