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.
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. –
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
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. –