2013-03-04 9 views
6

Ich implementiere einen Linux-Zeichengerätetreiber.Was sind die Argumente "struct file_operations"?

Die Headerdatei linux/fs.h listet die Dateioperationen ohne Argumentnamen auf.

z.B.

struct file_operations { 
    struct module *owner; 
    loff_t (*llseek) (struct file *, loff_t, int); 
    ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 
    ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 
    ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 
    ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 
    int (*readdir) (struct file *, void *, filldir_t); 
    unsigned int (*poll) (struct file *, struct poll_table_struct *); 
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); 
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 
    int (*mmap) (struct file *, struct vm_area_struct *); 
    int (*open) (struct inode *, struct file *); 
    int (*flush) (struct file *, fl_owner_t id); 
    int (*release) (struct inode *, struct file *); 
    int (*fsync) (struct file *, loff_t, loff_t, int datasync); 
    int (*aio_fsync) (struct kiocb *, int datasync); 
    int (*fasync) (int, struct file *, int); 
    int (*lock) (struct file *, int, struct file_lock *); 
    ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); 
    unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); 
    int (*check_flags)(int); 
    int (*flock) (struct file *, int, struct file_lock *); 
    ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); 
    ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); 
    int (*setlease)(struct file *, long, struct file_lock **); 
    long (*fallocate)(struct file *file, int mode, loff_t offset, 
       loff_t len); 
}; 

Wo ist die Dokumentation, die mir sagt, was jedes Argument ist? Einige sind offensichtlich, manche aber nicht. Ich ziehe es vor, auf offizielle Dokumente zu verweisen, wenn ich kann, aber ich kann es einfach nicht finden.

z.B.

int (*fsync) (struct file *, loff_t, loff_t, int datasync); 

Es gibt zwei loff_t-Argumente. Woher weiß ich, was sie tun?

Ich habe gegoogelt und das Gerätetreiber-Buch gelesen, aber ich kann keine Dokumente finden, die erklären, wofür die Argumente sind. Einige der Argumente haben sich seit dem Schreiben von LDD3 geändert.

Antwort

5

Das LDD3-Buch ist noch sehr nützlich, um das Gesamtbild zu verstehen, aber es wird nicht mit Details helfen (es ist für Kernel 2.6.10, inzwischen marschieren wir in Richtung 3.9). Die kernelnewbies drivers page ist vielleicht die aktuellste, umfassendste Ressource. Für alltägliche Änderungen kommentiertcregelmäßig API-Änderungen und veröffentlicht längere Übersichten für neue Funktionen. H-online enthält eine Reihe von Artikeln, in denen Änderungen von der Kernel-Version zur Kernel-Version mit Links zu Diskussionen und Patches beschrieben werden.

+0

Das sind meine üblichen Orte zu sehen. Ich schreibe und dokumentiere, wie ich einen Gerätetreiber für einige andere Leute schreiben kann, und ich kann nicht sagen, wie ich diese Informationen finde. Ich versuche, Herzen und Köpfe zu gewinnen, und zeige ihnen, dass Linux wertvoll ist, aber es ist peinlich, wenn ich ihnen keine vollständige oder aktuelle Dokumentation für eine der wertvollsten Strukturen für Gerätetreiber zeigen kann! Ich weiß, die anderen Fahrer zu sehen und zu versuchen, es einfach "auszuarbeiten", aber ich denke nicht, dass das gut genug ist. –

+0

Leider funktioniert das so. Die Dokumentation, nach der Sie suchen, war LDD in der Blütezeit, aber (wie die "3" attestiert), das System, das es zu beschreiben versuchte, ändert sich schnell, und es hielt nicht Schritt. Vielleicht ist der beste Weg, aus der Klemme zu kommen, nur in kernernewbies zu graben und ihre Beschreibung zu aktualisieren? – vonbrand

+0

Ich dachte, dass das der Fall sein könnte, dachte, es war es wert, als mein letzter Versuch zu überprüfen. Ich erinnere mich daran, LDD3 zu verwenden, als 2.4 für 2.6-Systeme auslief. Es dauerte nicht lange, bis ich "veraltete" Warnungen erhielt, während ich ältere Gerätetreiber portierte, obwohl ich die Beispiele im Buch befolgte. Ich musste die Entwicklung von Linux-Gerätetreibern seit einigen Jahren nicht mehr machen, deshalb bin ich in der Start-Läuft-und-Lernen-am-Arbeitsplatz-Phase. Ich hatte gehofft, dass das nicht mehr der Fall war. –

1

Ich musste meinen ersten Linux-Treiber vor einiger Zeit implementieren. Bei weitem das Beste, was Sie tun können, ist das Herunterladen der Kernel-Quelle für die Version, gegen die Sie entwickeln. In der Kernel-Quellstruktur befindet sich ein Verzeichnis namens/Documentation. Ich würde dort anfangen, zuletzt habe ich überprüft, das ist die "Offizielle Dokumentation" für den Kernel.

Das heißt, sobald Sie den Quellcode haben, gibt es wirklich keine bessere Dokumentation als den Code zu lesen und zu sehen, wie es verwendet wird. Für solche Dinge würde ich nach/drivers/fs/suchen und ein Beispiel dafür finden, wo diese Struktur verwendet wird und wie sie sie benutzt.

Verwandte Themen