Je copier et coller du code de cette URL pour créer et lire / écrire un fichier PROC à l'aide d'un module de noyau et obtenez l'erreur que proc_root est non déclaré. Ce même exemple est sur quelques sites donc je suppose que cela fonctionne. Des idées pourquoi j'aurais cette erreur? Mon fabricant a-t-il besoin de quelque chose de différent? Ci-dessous mon maquillage aussi:
Exemple de code pour une création de fichier de base Proc (copie directe et coller pour obtenir le test initial effectué): http://tldp.org/ldp/lkmpg/2.6/html/lkmpg .html # AEN769 P>
Makefile strong> J'utilise: P> obj-m := counter.o
KDIR := /MY/LINUX/SRC
PWD := $(shell pwd)
default:
$(MAKE) ARCH=um -C $(KDIR) SUBDIRS=$(PWD) modules
3 Réponses :
Cet exemple est obsolète. Sous l'API actuelle du noyau, passez Aussi, au lieu de null code> pour la racine des procfs. P>
create_proc_enterry code>, vous devez utiliser
proc_create () code> avec un fichier
Const struch fichier_operations * p>. p>.
Super! Merci. Maintenant, je peux l'obtenir pour compiler correctement.
Il y a eu une modification de l'interface pour créer une entrée dans le système de fichiers PRO. Vous pouvez regarder http: // pointeur-surcharge. blogspot.in/2013/09/linux-creature-entry-in-proc-file.html pour plus de détails
Voici un exemple "Hello_Proc" avec la nouvelle interface: P>
#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);
La réponse acceptée ci-dessus aurait peut-être travaillé pour vous. Cela ne fonctionne plus à GNU / Linux 5.6.y et ci-dessus! Depuis 5,6, comme Une note latérale, un programmeur souhaiterait un code portable. Dans ce cas, le même code fonctionnera sur différentes versions de GNU / Linux. Donc, vous devrez peut-être également utiliser proc_create () code> acceptera
proc_ops code> comme argument au lieu de
file_opérations code>. Les champs sont achusés avec
proc _ code> et il n'y a pas de champ
propriétaire code> dans
proc_ops code> ( Vérifiez ici ). P>
linux_version_code code>,
kernel_version (5,6,0) code> macros qui sont dans
linux / version.h code>. Par exemple, P>
#include <linux/version.h>
...
...
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0))
static struct file_operations
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0))
static struct proc_ops
#endif
proc_file_ops = {
#if (LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0))
owner : THIS_MODULE,
read : proc_file_read,
write : proc_file_write
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0))
proc_read : proc_file_read,
proc_write : proc_file_write
#endif
};
...
...