我在使用此系统调用以及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;

最佳答案

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

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

您使用GFP_ATOMIC和GFP_KERNEL的原因是什么?

这可能会有所帮助,

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

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

关于c - Kmalloc无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8379060/

10-12 03:04