Об’єкт dentry

Як вже розповідалося, підсистема VFS представляє каталоги так само, як і файли В імені шляху / bin / vi, і елемент bin, і елемент vi – це файли, тільки bi n – це спеціальний файл, який є каталогом, a vi – це звичайний файл Обєкти файлових індексів служать для представлення обох цих компонентів Незважаючи на таку корисну уніфікацію, підсистемі VFS також необхідно

5 розширення е атрибут и – пов про нова я функціональність, котора я появілас ь в ядр е 26 для того, щоб створювати параметр и файло в у вигляді па р імя / значени е за аналогією з базою даних Ці параметри підтримуються й не багатьма файловим і системами, і до того ж вони ще використовуються не досить широко

виконувати операції, специфічні для каталогів, такі як пошук компонента шляху по його імені, перевірка того, що зазначений елемент шляху сущестпует, і перехід на наступний компонент шляху

Для вирішення цього завдання в підсистемі VFS реалізована концепція елемента каталогу (directory entry або dentry) Обєкт dentry – це певний компонент шляху У попередньому прикладі компоненти /, bi n і vi – це обєкти елементів каталогу Перші два-це каталоги, а останній-звичайний файл Важливим моментом є те, що всі обєкти dentry-це компоненти шляху, включаючи і звичайні файли

Елементи шляху також можуть включати в себе точки монтування В імені шляху

/ Mnt / cdrom / foo, компоненти /, mnt, cdrom і foo – це все обєкти типу dentry Підсистема VFS при виконанні операцій з каталогами по необхідності конструює обєкти елементів каталогу на льоту

Обєкти типу dentry представлені за допомогою структури struc t dentr y і визначені у файлі Ця структура з коментарями, які визначають призначення кожного поля, має наступний вигляд

struct dentry {

atomic_t

d_count

/ * Лічильник використання * /

unsigned long

d_vfs_flags / * Прапори кеша обєктів dentry * /

spinlock_t

d_lock

/ * Блокування даного обєкта dentry * /

struct inode

*d_inode

/ * Відповідний файловий індекс * /

struct list_head

d_lru

/ * Список невикористаних обєктів * /

struct list_head

d_child

/ * Список обєктів у батьківського

примірника * /

struct list_head d_subdirs / * Підкаталоги * /

struct list_head d_alias / * Список альтернативних (alias)

індексів * /

unsigned long d_time / * Час перевірки правильності * /

struct dentry_operations * d_op / * Таблиця операцій з елементом каталогу * /

struct super_block * d_sb / * Повязаний суперблок * / unsigned int d_flags / * Прапори елемента каталогу * / int d_mounted / * Чи є обєкт точкою

монтування * /

void * d_fsdata / * Специфічні дані файлової системи * / struct rcu_head d_rcu / * Блокування RCU (read-copy update) * / struct dcookie_struct * d_cookie / * Cookie-ідентифікатор */

struct dentry * d_parent / * Обєкт dentry батьківського каталогу * /

struct qstr d_name / * Імя dentry * /

struct hlist_node d_hash / * Список хеширования * /

struct hlist_head * d_bucket / * Сегмент хеш-таблиці * /

unsigned char d_iname [DNAME_INLINE_LEN_MIN] / * Коротке імя файлу * /

}

На відміну від попередніх двох обєктів, обєкт dentry не відповідає якої б то не було структурі даних на жорсткому диску Підсистема VSF створює ці обєкти на льоту на підставі строкового подання імені шляху Оскільки обєкти елементів каталогу не зберігаються фізично на дисках, то в структурі struc t dentr y немає ніяких прапорів, які вказують на те, змінений чи обєкт (тобто чи повинен він бути записаний назад на диск)

Стан елементів каталогу

Дійсний обєкт елемента каталогу, може бути в одному з трьох станів: використовуваний fused), закинутий (unused) і негативний (negative)

Використовуваний обєкт відповідає існуючому файловому індексом (тобто поле d_inode вказує на звязаний обєкт типу mode) і використовується один або більше разів (тобто значення поля d_count – позитивне число) Використовуваний елемент каталогу використовується підсистемою VFS, а також вказує на існуючі дані, тому не може бути видалений

Закинутий обєкт типу dentry відповідає існуючому обєкту inode (поле d_inode вказує на обєкт файлового індексу), але підсистема VFS в даний момент не використовує цей елемент каталогу (Поле d_count містить нульове значення) Так як елемент каталогу вказує на існуючий обєкт, то він зберігається на випадок, якщо раптом виявиться потрібним Якщо обєкт не ліквідувати передчасно, то його і не потрібно буде створювати заново, якщо раптом він знадобиться в майбутньому, і пошук по імені шляху пройде швидше Коли ж зявляється необхідність звільнити память, то такий обєкт елемента каталогу може бути видалений, тому що він ніким не використовується

Негативний обєкт dentry6 не повязаний з існуючим файловим індексом (поле d_inode дорівнює значенню NULL), тому що або файловий індекс був видалений, або відповідний елемент шляху ніколи не існував Такі обєкти елементів каталогів зберігаються, щоб у майбутньому пошук по імені шляху проходив швидше Хоча такі обєкти dentry і корисні, але вони при необхідності можуть знищуватися, оскільки ніхто їх насправді не використовує

Обєкт dentry може бути звільнений, залишаючись в слябової кеші обєктів, як обговорювалося в попередньому розділі У такому випадку на цей обєкт немає посилань ні в коді VFS, ні в коді файлових систем

Кеш обєктів dentry

Після того як підсистема VFS подолала всі труднощі, повязані з переведенням всіх елементів шляху в обєкти елементів каталогів, і був досягнутий кінець шляху, то було б достатньо марнотратним викидати на вітер всю виконану роботу Ядро кешируєт обєкти в кеші елементів каталогу, який називають dcache

Кеш обєктів dentry складається з трьох частин

• Список використовуваних обєктів dentry, які повязані з певним файловим індексом (поле i_dentr y обєкта inode) Оскільки зазначений файловий індекс може мати кілька посилань, то йому може відповідати кілька обєктів dentry, а отже використовується звязаний список

• двохзвязної список невикористовуваних і негативних обєктів dentry з найбільш пізнім використанням (Last recently used, LRU) Вставки елементів в цей список відсортовані за часом, тому елементи, які знаходяться на початку списку, – найновіші Коли ядро ​​повинно видалити елементи каталогів для звільнення памяті, то ці елементи беруться з кінця списку

6 Ця назва е кіль про збиває з пантелику У таки х обєктах не т що нічого про негатівног про мул і негативного Більш вдалим було б, напевно, назва invalid denlry або неіснуючий елемент каталогу

тому що там знаходяться елементи, які використовувалися найбільш давно і для яких менше шансів, що вони знадобляться в найближчому майбутньому

• Хеш-таблиця і хеш-функція, які дозволяють швидко перетворити заданий шлях в обєкт dentry

Зазначена хеш-таблиця представлена ​​за допомогою масиву dentry_hashtable Кожен елемент масиву – це покажчик на список тих обєктів dentry, які відповідають одному ключу Розмір цього масиву залежить від обсягу фізичної памяті в системі

Значення ключа визначається функцією d_has h (), що дозволяє для кожної файлової системи реалізувати свою хеш-функцію

Пошук в хеш-таблиці виконується за допомогою функції d_lookup () Якщо в кеші dcache знайдений відповідний обєкт, то це значення повертається У випадку помилки повертається значення NULL

Як приклад розглянемо редагування файлу вихідного коду у вашому домашньому каталозі, / home / dracula / src / fоос Кожен раз, коли проводиться доступ до цього файлу (наприклад, при першому відкритті, при подальшому запису, при компіляції і так далі), підсистема VFS повинна пройти через псу елементи каталогів відповідно до шляхом до файлу: /, home, dracula, sr e і, нарешті, fooс Для того щоб кожен раз при доступі до цього (і будь-якому іншому) імені шляху уникнути виконання даної операції, яка вимагає досить великих витрат часу, підсистема VFS спочатку може спробувати знайти це імя шляху в dentryкеше Якщо пошук проходить успішно, то необхідний кінцевий елемент каталогу потрібного шляху виходить без особливих зусиль Якщо ж даного елемента каталогу немає в dentry-кеші, то підсистема VFS повинна самостійно відстежити шлях Після завершення пошуку знайдені обєкти dentry поміщаються в кеш dcache, щоб прискорити пошук в майбутньому

Кеш dcache також є інтерфейсом до кешу файлопих індексів icache Обєкти inode повязані з обєктами dentry, оскільки обєкт dentry підтримує позитивне значення лічильника використання для повязаного з ним індексу Це в свою чергу дозволяє обєктам dentry утримувати повязані з ними обєкти mode в памяті Іншими словами, якщо закешовану елемент каталогу, то відповідно виявляється закешовану і відповідний йому файловий індекс Отже, якщо пошук в кеші для деякого імені шляху пройшов успішно, то відповідні файлові індекси вже закешовану в памяті

Операції з елементами каталогів

Структура dentry_operation s містить методи, які підсистема VFS може викликати для елементів каталогів певної файлової системи Ця структура визначена у файлі наступним чином

struct dentry_operations {

int (*d_revalidate)  (struct dentry *, int)

int (*d_hash) (struct dentry *, struct qstr *)

int (*d_corapare) (struct dentry *, struct qstr *, struct qstr *)

int (*d_delete) (struct dentry *)

void (*d_release) (struct dentry *)

void (*d_iput) (struct dentry *, struct inode *)

}

Методи служать для наступних цілей

•  in t  d_revalidate(struc t   dentr y    *dentry ,   in t  flags )

Ця функція визначає, чи є зазначений обєкт елемента каталогу дійсним Підсистема VFS викликає цю функцію, коли вона намагається використовувати обєкт dentry з кешу dcache Для більшості файлових систем цей метод встановлений в значення NULL, тому що обєкти denry, які знаходяться в кеші, завжди дійсні

• in t  d_hash(struc t  dentr y   *dentry ,  struc t  qst r  *name)

Ця функція створює значення хеш-ключа на підставі зазначеного обєкта dentry Підсистема VFS викликає цю функцію всякий раз, коли додає обєкт елемента каталогу в хеш-таблицю

• in t   d_compare(struc t  dentr y   *dentry , struc t   qst r    *narael, struc t  qst r    *name2)

Ця функція викликається підсистемою VFS для порівняння двох імен файлів namel і name2 Більшість файлових систем використовують замовчування VFS, яке відповідає простому порівнянні двох рядків Для деяких файлових систем, таких як FAT, мало простого порівняння рядків Файлова система FAT не чутлива до регістру символів в іменах файлів, тому зявляється необхідність у реалізації функції, яка при порівнянні не враховує регістр символів Ця функція викликається при захопленої блокуванні dcache_lock7

• in t  d_delet e   (struc t  dentr y   *dentry )

Ця функція викликається підсистемою VFS, коли кількість посилань d_count зазначеного обєкта dentry стає рівним кулю Функція викликається при захопленої блокуванні dcache_lock

• void  d_release(struc t   dentr y    *dentry )

Ця функція викликається підсистемою VFS, коли вона збирається звільнити зазначений обєкт dentry За замовчуванням ця функція не виконує ніяких дій

• void  d_iput(struc t  dentr y   *dentry ,  struc t  inode  *inode)

Ця функція викликається підсистемою VFS, коли елемент каталогу втрачає звязок зі своїм файловим індексом (наприклад, коли цей елемент каталогу видаляється з диска) За замовчуванням підсистема VFS просто викликає функцію ipu t (), щоб звільнити відповідний обєкт inode Якщо файлова система перевизначає цю функцію, то вона також повинна викликати функцію ipu t () на додаток до специфічною для файлової системи роботі

7 А також пр і захопленої блокуванніdentry-> d_lock – Прямуючи перев

Джерело: Лав, Роберт Розробка ядра 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>

*

*