Gerät registrieren unter Linux
-
hallo,
ich bin neu hier und habe ein problem, ein gerät unter linux zu registrieren.
wenn ich schreibe:#include <linux/fs.h> static struct file_operations fops; int init_driver(void); int main() { init_driver(); return 0; } int init_driver(void) { if (register_chrdev(62, "DasistmeinneuerTreiber", &fops) == 0 ) { //treiber eingerichtet return 0; } else { return -1; } }
bekomme ich folgende fehlermeldung:
Storage size of 'fops' isn't known
anscheinend hat der irgendein problem mit der variablen fops...
kann mir jemand helfen?mfg tobi
-
Naja, fops musst Du natürlich schon definieren.
-
hallo,
aber definiere ich nicht die variable fops, in dem ich die zeilestatic struct file_operations fops;
schreibe?? ich denk, ich habe jetzt eine variable der structur file_operations aus der datei fs.h deklariert. oder net?
wie könnt ich des denn besser machen?mfg tobi
-
Die Struktur muss ein kompletter Typ sein, also die Definition (und nicht nur die Deklaration) bekannt.
struct foo; // <-- Deklaration struct foo *bar; // <-- Der Compiler weiß nun es gibt einen Typ "struct foo" und da die Größe eines Pointers // unabhängig von dem dahinter liegenden Typ ist, kann er einfach einen Pointer anlegen struct foo baz; // <-- Der Compiler weiß zwar das es einen Typ "struct foo" gibt, aber kennt nicht dessen Größe, // daher kann er keine Variable von diesem Typ anlegen (FEHLER!) struct foo { // <-- Definition (Der Typ ist nun komplett) int i; }; struct foo fou; // <-- Nun weiß der Compiler wie groß "struct foo" ist und kann eine Variable entsprechend anlegen
-
hallo,
aber die struktur wird doch in der fs.h bereits deklariert und definiert.auszug:
struct file_operations { int (*lseek) (struct inode *, struct file *, off_t, int); int (*read) (struct inode *, struct file *, char *, int); int (*write) (struct inode *, struct file *, const char *, int); int (*readdir) (struct inode *, struct file *, void *, filldir_t); int (*select) (struct inode *, struct file *, int, select_table *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct inode *, struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *); void (*release) (struct inode *, struct file *); int (*fsync) (struct inode *, struct file *); int (*fasync) (struct inode *, struct file *, int); int (*check_media_change) (kdev_t dev); int (*revalidate) (kdev_t dev); };
müsst es doch genügen, wenn ich in meinem sourcecode
static struct file_operations fops;
schreib. also müsste die struktur bereits bekannt sein.
mfg tobi
-
Die ist jedoch nur definiert, wenn das Makro __KERNEL__ definiert ist. Das ist nur bei Kernelmodulen der Fall, und der Source da oben sah nicht nach Kernelmodule aus
-
Da kann ich beipflichten. Ich habe mich schon gewundert was das sein soll, ein Treibermodul mit einer main-Funktion? Also was Du hier machen musst ist ein Kernel-Modul oder Treiber-Modul(zwei Namen für das ein und das Selbe). Da gibt es keine main, da Du das ganze ja zum Linux-Kernel dazulinkst!
Wie Du das am besten machst wird hier beschrieben:
http://www.oreilly.de/german/freebooks/linuxdrive2ger/building.html Allerdings wird hier nur der Kernel 2.4 beschrieben. Im Grunde ist aber noch alles so wie dort beschrieben.
Etwas aktueller hast Du es hier:
http://lwn.net/images/pdf/LDD3/ch02.pdfFalls Du weitere Fragen hast, hier gibts offensichtlich Leute, die sich damit auskennen, oder auf dieser Seite: http://kernelnewbies.org/KernelNewbies da gibts auch eine Mailing-Liste
Gruss Christian