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 > |
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;
(...)
};
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
Przepływ sterowania od wywołania funkcji open() do funkcji blkdev_open() |