Об’єкт file

Останнім з основних обєктів підсистеми VFS розглянемо обєкт файлу Обєкт File використовується для представлення файлів, які відкриті процесом Коли ми думаємо про підсистему VFS з точки зору простору користувача, то обєкт файлу – це те, що перше приходить в голову Процеси безпосередньо працюють з файлами, а не з суперблоками, індексами або елементами каталогів Не дивно, що інформація, яка міститься в обєкті file, найбільш звична (такі дані, як режим доступу або поточне зміщення), а файлові операції дуже схожі на знайомі системні виклики, такі як rea d () і writ e ()

Обєкт файлу – це подання відкритого файлу, яке зберігається в оперативній памяті Обєкт (а не сам файл) створюється у відповідь на системний виклик open () і знищується в результаті системного виклику clos e () Всі виклики, повязані з файлом, насправді є методами, які визначені у таблиці операцій з файлом Так як кілька процесів можуть одночасно відкрити і використовувати один і той же файл, то для одного файлу може існувати кілька обєктів file Файловий обєкт просто представляє відкритий файл з точки зору процесу Цей обєкт містить покажчик на відповідний елемент каталогу (який, в свою чергу, вказує на файловий індекс), що представляє відкритий файл Відповідні обєкти inode і dentry, звичайно, є унікальними

Файловий обєкт представляється за допомогою структури struc t file, яка визначена у файлі Розглянемо поля цієї структури з коментарями, які описують призначення кожного поля

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, таблиця файлових операцій є важливою структурою Операції, повязані зі структурою struc t file, – це знайомі системні виклики, що становлять основу системних викликів ОС Unix

Методи роботи з файловим обєктом зберігаються в структурі file_operation s і визначені у файлі таким чином

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(struc t  fil e   *file ,

char  *buf,  size_ t  count, loff_t   *offset)

Ця функція зчитує count байт даних з вказаного файлу, починаючи з позиції, заданої параметром offset, в буфер памяті, на який вказує параметр buf Після цього значення покажчика поточної позиції у файлі має бути оновлено Дана функція викликається з системного виклику read ()

• ssize_ t  aio_read(struc t   kiocb  *iocb, char  *buf,   size_ t  count, loff_t   offset)

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

• ssize_ t write(struc t  fil e   *file ,

const  char  *buf,   size_ t  count, loff_t    *offset)

Ця функція записує count байт даних у вказаний файл, починаючи з позиції offset Дана функція викликається з системного виклику writ e ()

• ssize_ t   aio_write(struc t  kiocb   *iocb, const  char  *buf,

size_ t  count,   loff_t offset)

Ця функція запускає асинхронну операцію запису count байт даних у файл, описуваний параметром iocb, з буфера памяті, на який вказує параметр buf Дана функція викликається з системного виклику aio_write

• in t readdir (struc t fil e * file, void * dirent, filldir_ t filldir) Ця функція повертає наступний елемент зі списку вмісту каталогу Дана функція викликається з системного виклику readdi r ()

• unsigned  in t  poll(struc t  fil e   *file ,

struc t   poll_table_struc t   *poll_table )

Ця функція переводить викликає процес в стан очікування для очікування дій, які виробляються із зазначеним файлом Вона викликається з системного виклику poll ()

• int ioctl(struct inode *inode, struct file *file, unsigned int cmd, signed long arg)

Ця функція використовується для того, щоб відправляти пристроям пари значень команда / аргумент Функція використовується, коли відкритий файл-це спеціальний файл пристрою Дана функція викликається з системного виклику ioctl ()

• in t  mmap(struct fil e  *file ,  struc t  vra_area_struct *vma)

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

• in t  open(struc t  inode  *inode,  struc t  fil e  *file )

Ця функція створює новий файловий обєкт і повязує його з вказаним файловим індексом Вона викликається з системного виклику open ()

• in t flush(struc t fil e  *file)

Ця функція викликається підсистемою VFS, коли зменшується лічильник посилань на відкритий файл Призначення цієї функції залежить від файлової системи

• in t release(struc t  inode *inode,  struc t  fil e  *file )

Ця функція викликається підсистемою VFS, коли зникає остання посилання на файл, наприклад, коли останній процес, який використовував відповідний файловий дескриптор, викликає функцію clos e () або завершується Призначення цієї функції також залежить від файлової системи

• in t  fsync(struc t  fil e  *file , struc t  dentr y    *dentry , in t  datasync)

Ця функція викликається з системного виклику fsync () для запису на диск всіх закешовану даних файлу

• in t  aio_fsync(struc t  kiocb  *iocb ,  in t  datasync)

Ця функція викликається з системного виклику aio f sync () для запису на диск всіх закешовану даних файлу, повязаного з параметром iocb

• in t  fasyn (fin t  fd,  struc t  fil e  *file ,  in t  on)

Ця функція дозволяє або забороняє відправку сигналу для повідомленні про події при асинхронному введенні-виведенні

• in t lock (struc t fil e * file, in t cmd, struc t file_loc k * lock) Ця функція управляє файловими блокуваннями для даного файлу

• ssize_ t  readv(struc t  fil e   *file , const struc t  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)

Ця функція викликається з системного виклику write v () для запису у вказаний файл буферів, описаних параметром vector кількість буферів одно count Після цього має бути відповідним чином збільшено значення поточної позиції у файлі

• ssize_ t   sendfile(struc t  fil e   *file , loff_t *offset, size_t size, read_actor_t actor, void *target)

Ця функція викликається з системного виклику sendfil e () для копіювання

даних з одного файлу в іншій Вона виконує операцію копіювання виключно в режимі ядра і дозволяє уникнути додаткового копіювання даних в простір користувача

• ssize_ t   sendpage(struc t  fil e   *file , struc t  page    *page,

in t  offset ,  size_ t  size , loff_ t  *pos,  in t  more)

Ця функція використовується для відправки даних з одного файлу в іншій

•  unsigned  long    get_unmapped_area(struct   file*file , unsigned  long  addr,

unsigned  long  len , unsigned  long  offset , unsigned  long  flags)

Ця функція отримує незайнятого простору адрес для відображення даного файлу

• in t check_flags(in t flags)

Ця функція використовується для перевірки коректності прапорів, які передаються в системний виклик fcnt l (), при використанні команди SETFL Як і у випадку багатьох операцій підсистеми VFS, для файлової системи немає необхідності реалізувати функцію check_flags () Зараз це зроблено тільки для файлової системи NFS Ця функція дозволяє файлової системі обмежити некоректні значення прапорів команди SETFL в узагальненому системному виклику fcntl () Для файлової системи NFS не дозволено використовувати комбінацію прапорів O_APPEND і O_DIRECT

• in t  flock(struc t  fil e  *filp ,  in t cmd,  struc t  file_lock *fl)

Ця функція використовується для реалізації системного виклику flock (), який служить для виконання рекомендованих блокувань

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*