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 zeile

    static 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.pdf

    Falls 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


Anmelden zum Antworten