2011-12-15 2 views
27

Quelqu'un peut-il me donner proc_create() par exemple?Exemple avec proc_create() pour le module du noyau

Plus tôt, ils ont utilisé create_proc_entry() dans le noyau mais maintenant ils utilisent proc_create().

+1

pourquoi ne pas simplement télécharger les sources du noyau actuel et grep pour proc_create? – Roland

Répondre

30

Cet exemple crée une entrée de proc permettant l'accès en lecture. Je pense que vous pouvez activer d'autres types d'accès en changeant l'argument mode passé à la fonction. Je n'ai pas passé un répertoire parent car il n'y en a pas besoin. La structure file_operations est l'endroit où vous configurez vos callbacks de lecture et d'écriture.

struct proc_dir_entry *proc_file_entry; 

static const struct file_operations proc_file_fops = { 
.owner = THIS_MODULE, 
.open = open_callback, 
.read = read_callback, 
}; 

int __init init_module(void){ 
    proc_file_entry = proc_create("proc_file_name", 0, NULL, &proc_file_fops); 
    if(proc_file_entry == NULL) 
    return -ENOMEM; 
    return 0; 
} 

Vous pouvez vérifier cet exemple pour plus de détails: https://www.linux.com/learn/linux-training/37985-the-kernel-newbie-corner-kernel-debugging-using-proc-qsequenceq-files-part-1

+0

En regardant les sources du noyau, je devrais faire une remarque. 'proc_file_fops' ne doit pas être placé dans une mémoire de pile (fonction variable locale). Il doit s'agir d'une variable globale ou se trouver dans la mémoire allouée avec une fonction de mémoire de tas. –

21

Voici un code 'hello_proc', qui utilise la plus récente 'proc_create()' interface.

#include <linux/module.h> 
#include <linux/proc_fs.h> 
#include <linux/seq_file.h> 

static int hello_proc_show(struct seq_file *m, void *v) { 
    seq_printf(m, "Hello proc!\n"); 
    return 0; 
} 

static int hello_proc_open(struct inode *inode, struct file *file) { 
    return single_open(file, hello_proc_show, NULL); 
} 

static const struct file_operations hello_proc_fops = { 
    .owner = THIS_MODULE, 
    .open = hello_proc_open, 
    .read = seq_read, 
    .llseek = seq_lseek, 
    .release = single_release, 
}; 

static int __init hello_proc_init(void) { 
    proc_create("hello_proc", 0, NULL, &hello_proc_fops); 
    return 0; 
} 

static void __exit hello_proc_exit(void) { 
    remove_proc_entry("hello_proc", NULL); 
} 

MODULE_LICENSE("GPL"); 
module_init(hello_proc_init); 
module_exit(hello_proc_exit); 

Ce code a été prise de http://pointer-overloading.blogspot.in/2013/09/linux-creating-entry-in-proc-file.html

+1

Merci pour un lien, vraiment utile. Je recommande de lire à ceux qui veulent comprendre comment cela fonctionne. –

+1

Cet exemple avec [QEMU + Buildroot test boilerplate] (https://github.com/cirosantilli/linux-kernel-module-cheat/blob/4727fadcc8f6e0685f80dc88a2913995a8df01f3/kernel_module/procfs.c). –

Questions connexes