[ Pobierz całość w formacie PDF ]
.Struktura file_operationsDo tematu: Podsystemwejścia-wyjściaDo tematu: Struktury danychstruct device_structStruktura zdefiniowana w pliku fs/devices.c.W tym samym pliku zdefiniowane są tablicerozdzielcze urządzeń:static struct device_struct chrdevs [MAX_CHRDEV]static struct device_struct blkdevs [MAX_BLKDEV]Tablice te indeksowane są numerami głównymi urządzeń, więc można łatwodotrzeć do operacji na urządzeniach o tym samym numerze głównym. const char namenazwa urządzeniastruct file_operations *fopswskaźnik do struktury z funkcjami charakterystycznymi dla tego urządzenia struct file_operationsStruktura file_operations jest częścią systemu plików.Zawierawskaź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 dourządzeń odbywa się przez pliki specjalne, więc zbiór operacji file_operationsdla takiego pliku jest zbiorem operacji na urządzeniu.Każde urządzeniema przypisany jakiś zbiór operacji na nim.Dla większości urządzeń dużaczęść wartości pól w file_operations ma wartość NULL.Oznaczato, ż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ływanaprzez 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ływanaprzez funkcję systemową select, która dla danego zbioru deskryptorówotwartych 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łai struktury file dostaje jako trzeci argument polecenie do wykonania (cmd),a jako ostatni argument parametr dla tego polecenia (np.dostaje polecenieustawienia 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 funkcjiint (* open)(struct inode *, struct file *)Funkcja otwierająca urządzenie.Nie ma chyba urządzenia, które niemiałoby swojej funkcji open mimo, że bardzo proste urządzeniamogą jej nie potrzebować.void (* release)( struct inode *, struct file *)Funkcja zamykajaca urządzenie.Wywoływana przez funkcję systemową closewtedy, gdy liczba dowiązań do otwartego pliku (file ) osiągniezero.Nie jest to jeszcze sytuacja, że żaden proces nie korzysta już zurządzenia, bo mogą być jeszcze inne struktury file związane z tym samymplikiem specjalnym, a więc z i-węzłem, może być też kilka plików specjalnychdo tego samego urządzenia.Niektóre urządzenia, np.terminale mają własnylicznik, 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ądzeniablokowe korzystaja z funkcji block_fsync zdefiniowanej w plikufs/block_dev.c.Zapisuje ona i opróżnia bufory z podręcznej pamięcibuforowej związane z urządzeniem.Jest ona wywoływana przy zamykaniu urządzeniaoraz przez funkcję systemową sync.Funkcja sync jest cojakiś czas wywoływana przez demona cron.(np.co minutę następuje zapisywaniebuforó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 ustawianialub wyłączania flagi FASYNC dla pliku ( fcntl(fd, F_SETFL, FASYNC), fcntl(fd,F_SETFL, ~FASYNC)).Dla urządzeń blokowych nie jest implementowana (niespotkałam się z tym).int(* check_media_change)( kdev_t dev)Te dwie funkcje są zdefiniowane tylko dla urządzeń.Jakoargument 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ł, jestwywoływana podczas mount i open.Funkcja revalidate uaktualnianiezbędne informacje.int(* revalidate)( kdev_t dev)Autorka: Anna Petryk
[ Pobierz całość w formacie PDF ]