2012-09-10 5 views
0

J'essaie d'ajouter un fichier proc pour lire certaines informations du noyau. Mais quand j'essaie de cat les informations du fichier proc, il donne une erreur "mauvaise adresse".lors de l'utilisation de copy_to_user, il donne une mauvaise adresse

int proc_read(char *buffer, char **starter, off_t off, int count, 
       int *eof, void *data) 
{ 

    if (off > 0) 
    { 
     *eof = 1; 
     return 0; 
    } 

    if (copy_to_user(buffer, info_str, info_str_size)) 
    { 
     return -EFAULT; 
    } 

    return info_str_size; 
} 

Après insmod, utilisez cat pour lire le fichier proc, mais donne la mauvaise erreur d'adresse; info_str est un tableau global char.

+3

semble ok, pouvez-vous montrer la définition de info_str et info_str_size – roni

Répondre

3

La réponse à votre problème est étonnamment simple. Dans proc_read fonctions que vous n'avez pas besoin d'utiliser copy_to_user: un simple memcpy fera le travail, car le tampon vit dans la mémoire du noyau. Cependant, si vous créez une fonction proc_write, vous devez utiliser copy_from_user, car dans ce cas le tampon reste dans la mémoire de l'utilisateur. Un point est que vous devriez également signaler EOF en cas de succès. Cela sauvera votre fonction d'avoir besoin d'être appelée deux fois.

Ce qui suit devrait suffire:

int proc_read(char *buffer, char **starter, off_t off, int count, 
       int *eof, void *data) 
{ 
    if (off > 0) 
    { 
     *eof = 1; 
     return 0; 
    } 

    memcpy(buffer, info_str, info_str_size); 
    *eof = 1; 
    return info_str_size; 
} 

Vous devriez également noter que cette façon d'écrire des entrées de fichier est assez vieux et vous devriez éviter probablement. L'interface seq_file est beaucoup moins sujet aux erreurs (et fonctionnera avec les pagers comme de moins en moins). Jetez un oeil à http://lwn.net/Articles/22355/ si vous êtes intéressé.

Questions connexes