2013-03-04 10 views
6

Wdrażam sterownik urządzenia znakowego Linux.Co to są argumenty "struct file_operations"?

Plik nagłówkowy linux/fs.h zawiera listę operacji file_operations bez nazw argumentów.

np.

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); 
}; 

Gdzie jest dokumentacja, która mówi mi, co każdy argument jest? Niektóre są oczywiste, ale niektóre nie. Wolę odnieść się do oficjalnej dokumentacji, jeśli mogę, ale po prostu nie mogę jej znaleźć.

np.

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

Istnieją dwa argumenty loff_t. Skąd mam wiedzieć, co robią?

Przeglądałem i czytałem książkę o sterownikach urządzeń, ale nie mogę znaleźć żadnych dokumentów wyjaśniających, do czego służą te argumenty. Niektóre z argumentów również uległy zmianie od momentu napisania LDD3.

Odpowiedz

5

Książka LDD3 jest bardzo przydatna, aby zrozumieć cały obraz, ale nie pomoże w szczegółach (dotyczy jądra 2.6.10, tymczasem zmierzamy w kierunku 3,9). kernelnewbies drivers page jest prawdopodobnie najbardziej aktualnym, wszechstronnym zasobem. W przypadku zmian wprowadzanych na co dzień LWN regularnie komentuje zmiany interfejsu API i publikuje dłuższe omówienia nowych funkcji. H-online zawiera serię artykułów opisujących zmiany od wersji jądra do wersji jądra wraz z linkami do dyskusji i łatek.

+0

To są moje zwykłe miejsca do patrzenia. Piszę i dokumentuję, jak napisać sterownik urządzenia dla innych osób, i mam całkowitą stratę, aby powiedzieć im, jak znaleźć te informacje. Próbuję zdobyć serca i umysły i pokazać im, że Linux ma wartość, ale jest to kłopotliwe, gdy nie mogę pokazać im kompletnej lub aktualnej dokumentacji dla jednej z najcenniejszych struktur sterowników urządzeń! Wiem, aby spojrzeć na innych kierowców i próbować po prostu "wymyślić", ale nie sądzę, że to wystarczy. –

+0

Niestety, tak to działa. Najbliżej poszukiwanej dokumentacji była LDD w czasach świetności, ale (jako "3" zaświadczenia) system próbował szybko opisać zmiany i nie nadążał. Być może najlepszym sposobem na wydostanie się z więzów jest po prostu zagłębienie się w jądro i zaktualizowanie ich opisu? – vonbrand

+0

Pomyślałem, że tak być może, pomyślałem, że warto to sprawdzić jako moją ostatnią próbę. Pamiętam używanie LDD3 z powrotem, gdy 2.4 był wycofywany dla systemów 2.6. Nie trwało długo, gdy otrzymywałem "przestarzałe" ostrzeżenia podczas przenoszenia starszych sterowników urządzeń, mimo że śledziłem przykłady w książce. Od kilku lat nie musiałem pracować nad rozwojem sterowników urządzeń linuksowych, więc jestem w fazie rozpoczęcia i nauki w trakcie pracy. Miałem nadzieję, że tak nie jest. –

1

Musiałem wdrożyć mój pierwszy sterownik linux jakiś czas temu. Zdecydowanie najlepszą rzeczą, jaką możesz zrobić, to pobrać źródło Kernela dla wersji, nad którą pracujesz. W drzewie źródłowym jądra znajduje się katalog o nazwie/Documentation. Zacznę od tego, ostatnio sprawdziłem, czy to "Oficjalna Dokumentacja" dla jądra.

Po tym, jak już masz kod źródłowy, naprawdę nie ma lepszej dokumentacji niż czytanie kodu i zobaczenie, jak się go używa. W tym celu przejrzałem/drivers/fs/i znalazłem przykład miejsca, w którym ta struktura jest używana i widzę, jak go używają.