2016-04-13 11 views
7

Sto cercando di leggere e scrivere in un file proc tramite modulo del kernel
Ma quando ho eseguito questo comando:Kernel Module Programmazione

echo "hello" >> /proc/hello && cat /proc/hello

E non stampa nulla e quando ho aperto la file tramite editor di testo. Ho trovato simboli misteriosi come questo

^@^@^@^@^@^@^@^@^@^@ 

Qualsiasi aiuto sarà apprezzato grazie in anticipo

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/proc_fs.h> 
#include<linux/sched.h> 
#include <asm/uaccess.h> 
#include <linux/slab.h> 

int len,temp; 
char *msg; 

int read_proc(struct file *filp,char *buf,size_t count,loff_t *offp){ 
    if(count>temp){count=temp;} 
    temp=temp-count; 
    copy_to_user(buf,msg, count); 
    if(count==0)temp=len; 
    return count; 
} 

int write_proc(struct file *filp,const char *buf,size_t count,loff_t *offp){ 
    copy_from_user(msg,buf,count); 
    len=count; 
    temp=len; 
    return count; 
} 

struct file_operations proc_fops = { 
    read: read_proc, 
    write: write_proc 
}; 

void create_new_proc_entry(void){ 
    proc_create("hello",0,NULL,&proc_fops); 
    msg=kmalloc(GFP_KERNEL,10*sizeof(char)); 
} 

int proc_init (void){ 
    create_new_proc_entry(); 
    return 0; 
} 

void proc_cleanup(void){ 
    remove_proc_entry("hello",NULL); 
} 

MODULE_LICENSE("GPL"); 
module_init(proc_init); 
module_exit(proc_cleanup); 
+1

Solo un'osservazione: si copia qualcosa da utente in 'msg', ma 'msg' ha una dimensione di 10 caratteri => in' write_proc' assicurati di non consentire 'count' più di 10, altrimenti avrai un buffer overflow! – Garf365

+0

sì, hai ragione, apprezzo questo –

risposta

4

Oltre ad altri problemi del vostro modulo del kernel (come controllare le frontiere)

Questo

msg=kmalloc(GFP_KERNEL,10*sizeof(char)); 

devono essere

msg=kmalloc(10*sizeof(char), GFP_KERNEL); 

Con la vostra chiamata a kmalloc che si sta cercando, probabilmente, di destinare troppi o non abbastanza byte e rifiuta la richiesta kmalloc.

si dovrebbe sempre controllare il valore di ritorno kmalloc essere coerenti: != NULL

+0

hai perfettamente ragione, grazie mille, e mi dispiace per questa brutta implementazione, sono solo un principiante nella programmazione del kernel e sto cercando di capire come funzionano le cose –

0

Si può trovare in kmalloc slab.h:

static __always_inline void *kmalloc(size_t size, gfp_t flags) 
{ 
    if (__builtin_constant_p(size)) { 
     if (size > KMALLOC_MAX_CACHE_SIZE) 
      return kmalloc_large(size, flags); 
    #ifndef CONFIG_SLOB 
     if (!(flags & GFP_DMA)) { 
      int index = kmalloc_index(size); 

      if (!index) 
       return ZERO_SIZE_PTR; 

      return kmem_cache_alloc_trace(kmalloc_caches[index], 
        flags, size); 
     } 
    #endif 
    } 
    return __kmalloc(size, flags); 
}