我在使用此係統調用時可能會遇到一些問題,可能是使用了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;
粘貼發生崩潰時獲得的Oops消息。 – caf