Чтение онлайн

ЖАНРЫ

Разработка ядра Linux (Второе издание)
Шрифт:

Последним из основных объектов подсистемы VFS рассмотрим объект файла. Объект File используется для представления файлов, которые открыты процессом. Когда мы думаем о подсистеме VFS с точки зрения пространства пользователя, то объект файла — это то, что первое приходит в голову. Процессы непосредственно работают с файлами, а не с суперблоками, индексами или элементами каталогов. Не удивительно, что информация, которая содержится в объекте file, наиболее привычна (такие данные, как режим доступа или текущее смещение), а файловые операции очень похожи на знакомые системные вызовы, такие как

read
и
write
.

Объект

файла — это представление открытого файла, которое хранится в оперативной памяти. Объект (а не сам файл) создается в ответ на системный вызов
open
и уничтожается в результате системного вызова
close
. Все вызовы, связанные с файлом, на самом деле являются методами, которые определены в таблице операций с файлом. Так как несколько процессов могут одновременно открыть и использовать один и тот же файл, то для одного файла может существовать несколько объектов file. Файловый объект просто представляет открытый файл с точки зрения процесса. Этот объект содержит указатель на соответствующий элемент каталога (который, в свою очередь, указывает на файловый индекс), представляющий открытый файл. Соответствующие объекты inode и dentry, конечно, являются уникальными.

Файловый объект представляется с помощью структуры

struct file
, которая определена в файле
<linux/fs.h>
. Рассмотрим поля этой структуры с комментариями, которые описывают назначение каждого поля.

struct file {

 struct list_head f_list; /* список объектов file */

 struct dentry *f_dentry; /* связанный объект dentry */

 struct vfsmount *f_vfsmnt; /* связанная смонтированная

файловая система */

 struct file_operations *f_op; /* таблица файловых операций */

 atomic_t f_count; /* счетчик ссылок на этот объект */

 unsigned int f_flags; /* флаги, указанные

при вызове функции open */

 mode_t f_mode; /* режим доступа к файлу */

 loff_t f_pos; /* смещение в файле

(file pointer, offset) */

 struct fown_struct f_owner; /* информация о владельце для обработки

сигналов */

 unsigned int f_uid; /* идентификатор пользователя владельца, UID */

 unsigned int f_gid; /* идентификатор группы владельца, GID */

 int f_error; /* код ошибки */

 struct file_ra_state f_ra; /* состояние предварительного считывания */

 unsigned long f_version; /* номер версии */

 void *f_security; /* модуль безопасности */

 void *private_data; /* привязка для

драйвера терминала */

 struct list_head f_ep_links; /* список ссылок eventpoll

(опрос событий) */

 spinlock_t f_ep_lock; /*
блокировка eventpoll */

 struct address_space *f_mapping; /* отображение в страничном кэше */

};

По аналогии с объектом элемента каталога объект файла на самом деле не соответствует никакой структуре, которая хранится на жестком диске. Поэтому в этой структуре нет никакого флага, который бы указывал, что объект изменен (dirty) и требует обратной записи на диск. Объект file указывает на связанный с ним объект dentry с помощью указателя

f_dentry
. Объект dentry в свою очередь содержит указатель на связанный с ним индекс файла, который содержит информацию о том, изменен ли файл.

Файловые операции

Как и для других объектов подсистемы VFS, таблица файловых операций является важной структурой. Операции, связанные со структурой

struct file
, — это знакомые системные вызовы, составляющие основу системных вызовов ОС Unix.

Методы работы с файловым объектом хранятся в структуре

file_operations
и определены в файле
<linux/fs.h>
следующим образом.

struct file_operations {

 struct module *owner;

 loff_t (*llseek)(struct file*, loff_t, int);

 ssize_t (*read)(struct file*, char*, size_t, loff_t*);

 ssize_t (*aio_read)(struct kiocb*, char*, size_t, loff_t);

 ssize_t (*write)(struct file*, const char*, size_t, loff_t*);

 ssize_t (*aio_write)(struct kiocb*, const char*, size_t, loff_t);

 int (*readdir)(struct file*, void*, filldir_t);

 unsigned int (*poll)(struct file*, struct poll_table_struct*);

 int (*ioctl)(struct inode*, struct file*, unsigned int, unsigned long);

 int (*mmap)(struct file*, struct vm_area_struct*);

 int (*open)(struct inode*, struct file*);

 int (*flush)(struct file*);

 int (*release)(struct inode*, struct file*);

 int (*fsync)(struct file*, struct dentry*, int);

 int (*aio_fsync)(struct kiocb*, int);

 int (*fasync)(int, struct file*, int);

 int (*lock)(struct file*, int, struct file_lock*);

 ssize_t (*readv)(struct file*, const struct iovec*,

unsigned long, loff_t*);

 ssize_t (*writev)(struct file*, const struct iovec*,

unsigned long, loff_t*);

 ssize_t (*sendfile)(struct file*, loff_t*, size_t,

read_actor_t, void*);

 ssize_t (*sendpage)(struct file*, struct page*, int,

Поделиться с друзьями: