Podsystem Wejścia/Wyjścia w systemie Linux 2.4.7
Urządzenia znakowe i blokowe. Funkcja block_read(), block_write().
5. Funkcje struktury def_blk_fops - funkcja blkdev_open()
< Poprzednia strona Spis treści Następna strona >

5. Funkcje struktury def_blk_fops - funkcja blkdev_open()


5.1 Wstęp

Dla pełnego opisu działania odwołań do urządzeń blokowych warto opisać skrótowo funkcje dostarczone w strukturze def_blk_fops, wraz z szerszym prześledzeniem drogi od odwołań do pliku do komunikacji z urządzeniem.

Jak wiemy każdy proces posiada pewną tablicę deskryptorów. W tej tablicy znajdują się informacje o deskryptorach, które są aktualnie otwarte. Elementy tej tablicy to struktury file, które zawierają informacje o stanie danego deskryptora. Z naszego punktu widzenia istotne są pola: dentry, f_op,f_count i f_pos. Pola te odpowiadają kolejno: za pozycje w katalogu wirtualnego systemu plików, pliku jakiemu odpowiada dany deskryptor, funkcjom obsługi urządzenia, ilości odwołań do deskryptora oraz aktualnej pozycji.

struct file {
  (...)
  struct dentry *f_dentry;
  struct file_operations *f_op;
  atomic_t f_count;
  loff_t f_pos;
  (...)
};


5.2 Funkcja blkdev_open()

Funkcję tą opiszę w kontekście przepływu sterowania podczas otwierania pliku. W celu otwarcia pliku system dostarcza dobrze znaną funkcję open(). Jest ona opakowaniem dla wywołania funkcji systemowej sys_open(). Funkcja ta pobiera wolny deskryptor pliku. Następnie wywoływana jest funkcja filp_open(), która utworzy nową strukturę file odpowiadającą otwieranemu plikowi (w naszym przypadku jest to plik specjalny, a tak naprawdę urządzenie blokowe). Funkcja ta korzysta z funkcji open_namei(), która (wykorzystując algorytm namei) zwraca informacje zawarte w systemie plików o podanej jako parametr nazwie. Z punktu widzenia funkcji otwierania pliku istotna jest informacja o wpisie w katalogu odpowiadająca otwieranemu plikowi specjalnemu. Następnie wywoływana jest funkcja dentry_open(), która jako parametr otrzymuje wspomniany wcześniej wpis z katalogu. Mając dostęp do i-węzła dopowiadającego plikowi specjalnemu (utworzonemu, jak pamiętamy przy pomocy funkcji init_special_inode(), patrz rozdział 2.1) funkcja sprawdza prawa dostępu do pliku (np. prawa do zapisu jeśli jest żądane). Pobierane są również funkcje obsługi

Obrazek poglądowy
Przepływ sterowania od wywołania funkcji open() do funkcji blkdev_open()

urządzenia, które również znajdują się w i-węźle. Następnie, w przypadku urządzeń blokowych, wywoływana jest funkcja blkdev_open(). Jednym z parametrów jest i-węzeł otwieranego urządzenia. Właśnie stąd funkcja pobiera informacje z jakim urządzeniem ma do czynienia. Teraz korzystając z funkcji get_blkfops() uzyskuje funkcje obsługi urządzenia dla danego urządzenia blokowego. Następnie, jeśli w pobranych funkcjach obsługi zdefiniowano funkcję open, to zostaje ona wywołana. Warto wspomnieć, że każde z każdym urządzeniem blokowym związany jest semafor, który zapewnia, że jednocześnie odbywa się dokładnie jedna operacja otwierania/zamykania pliku. Wykluczanie jest zapewnione w funkcji blkdev_open().


Autor: Filip Łukasik