2011-12-04 2 views
0

이 시스템 호출 및 kmalloc에 ​​문제가 있습니다.Kmalloc가 올바르게 작동하지 않습니다.

글쎄, 기본적으로 나는 시스템 호출을 만들고 있는데,이 시스템 호출과 커널은 문제없이 컴파일된다. 그러나 시스템 호출을 호출하면 쉘이 많은 메시지를 표시하고 컴퓨터가 충돌합니다.

나는 내가 kmalloc이을 envolves 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; 
+1

충돌이 발생할 때 나타나는 죄송 메시지를 붙여 넣습니다. – caf

답변

0

나는 아직 말씀 드릴 수 없습니다, 그래서 대답으로 몇 가지 질문을 할 것입니다 ...

내가 볼

"EXPORT_SYMBOLL (bloqueados를);" ...이 실수는 복사/붙여 넣기에 실수 였거나 실제 코드에서 잘못 입력 한 것입니까? 문제가 될 수 있습니다 ...

왜 GFP_ATOMIC 대 GFP_KERNEL을 사용하고 있습니까?

이 도움이 될 수

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

당신이 절대적으로하지 않습니다 필요하면 ... 그것은 실패 할 수 있기 때문에이 GFP_ATOMIC를 사용하지 않는 것이 좋습니다. 나는 뭔가를 놓친 것일 수도 있지만, 왜 당신이 그것을 필요로하는지 모르겠다 ... 자물쇠를 사용하지 않는 것 같습니다.

+0

전에 GFP_KERNEL로 할당하려했지만 컴퓨터가 충돌했습니다. kmalloc.But 없이도 작동하기 때문에 EXPORT_SIMBOL (bloqueados)이 문제가 아닌 것 같습니다. EXPORT_SIMBOL (bloqueados)를 사용하여 시스템의 전역 변수를 참조하고 있습니다. . – UserJ

+0

글쎄, 나는 여기에 "EXPORT_SYMBOLL (bloqueados)"을 썼다 고 생각하고 있는데, "EXPORT_SYMBOL (bloqueados)"이라고 생각한다.하지만 EXPORT_SYMBOL (bloqueados)로 컴파일 한 것 같다. EXPORT_SYMBOLL bloqueados) 커널을 컴파일하는 데 문제가 있습니다. – UserJ

관련 문제