2012-10-26 2 views
-1

Ceci est mon premier noyau et dans mon exemple de programme ci-dessous, j'ai créé un proc/système de fichiers simple. Je vois READ est appelé 3 fois chaque fois que je chat le noyau. Vous vous demandez pourquoi il le fait./proc/filesystem read est appelé trois fois

Sortie et le code est ci-dessous.

cat /proc/myKernel 
dmesg | grep -i myKernel 
myKernel: Read (/proc/myKernel) called 
myKernel: Read (/proc/myKernel) called 
myKernel: Read (/proc/myKernel) called 

int myKernel_read(char *buffer, char **bufferLocation, off_t offset, int bufferLength, int *eof, void *data) 
{ 
    int ret = 0; 
    u64 msrvalue; 

    printk(KERN_INFO "myKernel: Read (/proc/%s) called\n", procFile_name); 
    ret = sprintf(buffer, "Hello World\n"); 

    return ret; 
} 

static int __init myKernel_init(void) 
{ 
    entry = create_proc_entry(procFile_name, 0644, NULL); 
    if(!entry) 
     printk(KERN_INFO "myKernel: error registering proc control file\n"); 
    else 
    { 
     entry->read_proc = myKernel_read; 
    } 

    return 0; 
} 
+0

Avez-vous essayé de lire le code source 'cat'? –

+1

Eh bien, vous retournez des ordures (variable 'ret' non initialisée) de votre fonction' myKernel_read', ce qui signifie que vous n'avez aucune idée de ce que ça retourne. Je suppose que vous ne remplissez pas certains des paramètres de sortie que vous êtes censé remplir (comme '* eof'). Essayez de régler cela et de voir ce qui se passe. Si cela se produit toujours, essayez de consigner les paramètres importants dans 'myKernel_read' comme' offset' afin de vous donner une meilleure idée de ce qui se passe. Enfin, que signifie "Ceci est mon premier noyau"? – Celada

+0

mon mauvais. En copiant le texte sélectionné, je n'ai pas inclus la ligne de code de remplissage du tampon. Je vois encore trois messages de débogage (dnesg | grep myKernel) – RedFox

Répondre

1

Le problème est lié à la valeur de ret. Je ne sais toujours pas pourquoi cela s'appelle trois fois mais je dois faire la lecture réelle lorsque le décalage est inférieur à zéro.

int myKernel_read(char *buffer, char **bufferLocation, off_t offset, int bufferLength, int *eof, void *data) 
{ 
    int ret; 
    u64 msrvalue; 

    if (offset > 0) 
    { 
     /* we have finished to read, return 0 */ 
     ret = 0; 
    } else 
    { 
     /* fill the buffer, return the buffer size */ 
       // DO THE READ HERE. NOT OUTSIDE 
       // 
       printk(KERN_INFO "myKernel: Read (/proc/%s) called\n", procFile_name); 
     ret = sprintf(buffer, "MyKernel = %x\n", 0); 
    } 

    return ret; 
} 
Questions connexes