KnigaRead.com/

Роберт Лав - Разработка ядра Linux

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Роберт Лав, "Разработка ядра Linux" бесплатно, без регистрации.
Перейти на страницу:

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,

  size_t, loff_t*, int);

 unsigned long (*get_unmapped_area)(struct file*, unsigned long,

  unsigned long, unsigned long, unsigned long);

 int (*check_flags)(int flags);

 int (*dir_notify)(struct file *filp, unsigned long arg);

 int (*flock)(struct file *filp, int cmd, struct file_lock *fl);

};

Файловые системы могут реализовать уникальную функцию для каждой из этих операций или использовать общий существующий метод. Общие методы нормально работают для обычных Unix-подобных файловых систем. Разработчики файловых систем не обязаны реализовать все эти функции, хотя основные методы должны быть реализованы. Если какой-либо метод не представляет интереса, то его можно установить в значение NULL.

Рассмотрим каждую операцию подробнее.

• loff_t llseek(struct file *file, loff_t offset, int origin);

Эта функция устанавливает значения указателя текущей позиции в файле (file pointer) в заданное значение параметра offset. Функция вызывается из системного вызова lseek().

• ssize_t read(struct file *file,

  char *buf, size_t count, loff_t* offset);

Эта функция считывает count байт данных из указанного файла, начиная с позиции, заданной параметром offset, в буфер памяти, на который указывает параметр buf. После этого значение указателя текущей позиции в файле должно быть обновлено. Данная функция вызывается из системного вызова read().

• ssize_t aio_read(struct kiocb *iocb,

  char *buf, size_t count, loff_t offset);

Эта функция запускает асинхронную операцию считывания count байт данных из файла, который описывается параметром iocb, в буфер памяти, описанный параметром buf. Эта функция вызывается из системного вызова aio_read().

• ssize_t write(struct file *file,

  const char *buf, size_t count, loff_t* offset);

Эта функция записывает count байт данных в указанный файл, начиная с позиции offset. Данная функция вызывается из системного вызова write().

• ssize_t aio_write(struct kiocb *iocb,

  const char *buf, size_t count, loff_t offset);

Эта функция запускает асинхронную операцию записи count байт данных в файл, описываемый параметром iocb, из буфера памяти, на который указывает параметр buf. Данная функция вызывается из системного вызова aio_write().

• int readdir(struct file *file, void *dirent, filldir_t filldir);

Эта функция возвращает следующий элемент из списка содержимого каталога. Данная функция вызывается из системного вызова readdir().

• unsigned int poll(struct file *file,

  struct poll_table_struct *poll_table);

Эта функция переводит вызывающий процесс в состояние ожидания для ожидания действий, которые производятся с указанным файлом. Она вызывается из системного вызова poll().

• int ioctl(struct inode *inode,

  struct file *file, unsigned int cmd, signed long arg);

Эта функция используется для того, чтобы отправлять устройствам пары значений команда/аргумент. Функция используется, когда открытый файл — это специальный файл устройства. Данная функция вызывается из системного вызова ioctl().

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

Эта функция отображает указанный файл на область памяти в указанном адресном пространстве и вызывается из системного вызова mmap().

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

Эта функция создает новый файловый объект и связывает его с указанным файловым индексом. Она вызывается из системного вызова open().

• int flush(struct file *file);

Эта функция вызывается подсистемой VFS, когда уменьшается счетчик ссылок на открытый файл. Назначение данной функции зависит от файловой системы.

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

Эта функция вызывается подсистемой VFS, когда исчезает последняя ссылка на файл, например, когда последний процесс, который использовал соответствующий файловый дескриптор, вызывает функцию close() или завершается. Назначение этой функции также зависит от файловой системы.

• int fsync(struct file *file,

  struct dentry *dentry, int datasync);

Эта функция вызывается из системного вызова fsync() для записи на диск всех закэшированных данных файла.

• int aio_fsync(struct kiocb *iocb, int datasync);

Эта функция вызывается из системного вызова aio_fsync() для записи на диск всех закэшированных данных файла, связанного с параметром iocb.

• int fasync(int fd, struct file *file, int on);

Эта функция разрешает или запрещает отправку сигнала для уведомлении о событиях при асинхронном вводе-выводе.

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

Эта функция управляет файловыми блокировками для данного файла.

• ssize_t readv(struct file *file,

  const struct iovec *vector, unsigned long count, loff_t* offset);

Эта функция вызывается из системного вызова readv() для считывания данных из указанного файла в count буферов, которые описываются параметром vector. После этого указатель текущей позиции файла должен быть соответственным образом увеличен.

• ssize_t writev(struct file *file,

  const struct iovec *vector, unsigned long count, loff_t *offset);

Эта функция вызывается из системного вызова writev() для записи в указанный файл буферов, описанных параметром vector; количество буферов равно count. После этого должно быть соответственным образом увеличено значение текущей позиции в файле.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*