Do tematu: Podsystem wejścia-wyjścia

Do tematu: Struktury danych

struct device_struct

Struktura zdefiniowana w pliku fs/devices.c. W tym samym pliku zdefiniowane są tablice rozdzielcze urządzeń:

Tablice te indeksowane są numerami głównymi urządzeń, więc można łatwo dotrzeć do operacji na urządzeniach o tym samym numerze głównym.
 
const char  name nazwa urządzenia
struct file_operations * fops wskaźnik do struktury z funkcjami charakterystycznymi dla tego urządzenia 
struct file_operations

Struktura file_operations jest częścią systemu plików. Zawiera wskaźniki do wielu funkcji, które są dostępnymi operacjami na pliku. Strukturę tę omawiam jednak w związku z dostępem do urządzeń. Ponieważ dostęp do urządzeń odbywa się przez pliki specjalne, więc zbiór operacji file_operations dla takiego pliku jest zbiorem operacji na urządzeniu. Każde urządzenie ma przypisany jakiś zbiór operacji na nim. Dla większości urządzeń duża część wartości pól w file_operations ma wartość NULL. Oznacza to, że dana funkcja nie jest zdefiniowana dla tego urządzenia.
 
int (* lseek)( struct inode *, struct file *, off_t, int) Służy do przewinięcia urządzenia w dane miejsce. Dla większości urządzeń ta operacja nie ma większego sensu, więc nie jest dla nich zaimplementowana.
int (* read)( struct inode *, struct file *, char *, int) Funkcja do czytania z urządzenia. Jako parametry dostaje i-węzeł, file - strukturę opisującą otwarty plik, bufor i liczbę bajtów do wczytania. Funkcja ta jest wywoływana przez funkcję systemową read (sys_read).
int (* write)( struct inode *, struct file *, const char *, int) Funkcja do pisania do urządzenia. Parametry - takie jak read. Wywoływana przez funkcję systemową write.
int  (* readdir)( struct inode *, struct file *, void *, filldir_t) nieużywana dla urządzeń
int (* select)( struct inode *, struct file *, int, select_table *) Służy do odpytywania urządzenia, czy jest gotowe do pracy. Wywoływana przez funkcję systemową select, która dla danego zbioru deskryptorów otwartych plików (gniazd, łączy) usypia proces aż do chwili, kiedy jakiś deskryptor będzie gotowy , aby z niego czytać, lub do niego pisać.
int (* ioctl)( struct inode *, struct file *, unsigned int, unsigned long) Funkcja służąca do ustawiania parametrów urządzenia. Oprócz i-węzła i struktury file dostaje jako trzeci argument polecenie do wykonania (cmd), a jako ostatni argument parametr dla tego polecenia (np. dostaje polecenie ustawienia flagi, oraz wartość tej flagi)
int (* mmap)( struct inode *, struct file *, vm_area_struct *) Nie spotkałam się z tym, żeby jakieś urządzenie używało tej funkcji
int  (* open)(struct inode *, struct file *) Funkcja otwierająca urządzenie. Nie ma chyba urządzenia, które nie miałoby swojej funkcji open mimo, że bardzo proste urządzenia mogą jej nie potrzebować.
void  (* release)( struct inode *, struct file *) Funkcja zamykajaca urządzenie. Wywoływana przez funkcję systemową close wtedy, gdy liczba dowiązań do otwartego pliku (file ) osiągnie zero. Nie jest to jeszcze sytuacja, że żaden proces nie korzysta już z urządzenia, bo mogą być jeszcze inne struktury file związane z tym samym plikiem specjalnym, a więc z i-węzłem, może być też kilka plików specjalnych do tego samego urządzenia. Niektóre urządzenia, np. terminale mają własny licznik, który mówi im o liczbie otwartych dowiązań do urządzenia. Patrz: tty_struct 
int (* fsync)( struct inode *, struct file *) Funkcja używana przez urządzenia blokowe (nie spotkałam się z tym, aby jakieś urządzenie znakowe korzystało z tej funkcji). Wszystkie urządzenia blokowe korzystaja z funkcji block_fsync zdefiniowanej w pliku fs/block_dev.c.Zapisuje ona i opróżnia bufory z podręcznej pamięci buforowej związane z urządzeniem. Jest ona wywoływana przy zamykaniu urządzenia oraz przez funkcję systemową sync.Funkcja sync jest co jakiś czas wywoływana przez demona cron. (np. co minutę następuje zapisywanie buforów dysku twardego)
int (* fasync)( struct inode *, struct file *) Funkcja trochę inna od pozostałych. Nie jest wywoływana przez funkcję systemową o tej samej nazwie, ale jest wywoływana przy okazji ustawiania lub wyłączania flagi FASYNC dla pliku ( fcntl(fd, F_SETFL, FASYNC), fcntl(fd, F_SETFL, ~FASYNC)). Dla urządzeń blokowych nie jest implementowana (nie spotkałam się z tym).
int (* check_media_change)( kdev_t dev) Te dwie funkcje są zdefiniowane tylko dla urządzeń. Jako argument dostają numer urządzenia . Funkcje te zaimplementowane są tylko dla urządzeń z wymienialnym nośnikiem. Funkcja check_media_change sprawdza, czy nośnik się zmienił, jest wywoływana podczas mount i open. Funkcja revalidate uaktualnia niezbędne informacje.
int (* revalidate)( kdev_t dev)


Autorka: Anna Petryk