Linux Kernel (Ядро линукса) (часть 2)


Файловые объекты

Файловый объект описывает работу процесса с файлом, который он открыл. Этот объект создается в момент открытия файла и представлен структурой file, Обратите внимание, что файловые объекты не имеют образа на диске и, следовательно, структура file не имеет поля, которое указывало бы, что объект грязный”, т. е. был модифицирован.

Самой важной информацией, хранящейся в объекте, является файловый указатель, текущая позиция в файле, с которой начнется следующая операция чтения/записи. Поскольку к одному файлу одновременно могут обратиться несколько процессов, указатель файла необходимо хранить в файловом объекте, а не в объекте индексный дескриптор”.

Файловые объекты выделяются через slab-кэш, называемый flip. Адрес дескриптора кэша хранится в переменной fiip cachep. Поскольку существует ограничение на количество выделяемых файловых объектов, переменная fiies stat хранит в поле max fiies максимальное количество файловых объектов, которые могут быть выделены, т. е. максимальное количество файлов, к которым можно обратиться в данной системе одновременно.

Функция files init , выполняемая во время инициализации ядра, устанавливает значение поля max fiies равным одной десятой объема доступного ОЗУ (в килобайтах), но системный администратор может изменить этот параметр, отредактировав файл /proc/sys/file-max. Более того, суперпользователь всегда может получить файловый объект, даже если уже выделено столько файлов, сколько указано в поле max f iles.

Используемые” файловые объекты собраны в нескольких списках, размещенных в суперблоках файловой системы. Каждый суперблок содержит в поле s_f iles голову списка файловых объектов. Таким образом, объекты для файлов, принадлежащих разным файловым системам, включены в разные списки. Указатели на предыдущий и следующий элементы списка хранятся в поле f iist файлового объекта. Спин-блокировка fiies iock защищает списки s fiies от попыток одновременного обращения к ним в многопроцессорных системах.

Поле f count файлового объекта является счетчиком ссылок, который указывает количество процессов, использующих файловый объект (однако не следует забывать, что легковесные” процессы с флагом clone files используют одну таблицу, в которой перечислены открытые файлы, т. е. они обращаются к одним и тем же файловым объектам). Счетчик также увеличивается, когда файловые объекты используются самим ядром, например, когда объект заносится В СПИСОК, ИЛИ КОГДа ПРОИЗВОДИТСЯ СИСТеМНЫЙ ВЫЗОВ dup .

Когда система VFS должна открыть файл от имени какого-то процесса, она вызывает функцию get empty fiipO для выделения нового файлового объекта. Функция, В СВОЮ очередь, вызывает kmem_cache_alloc , чтобы получить свободный файловый объект из кэша flip, а затем инициализирует поля объекта следующим образом:
memset(f, 0, sizeof(f));
INIT LIST HEAD(&f->f ep links);
spin_lock_init(&f->f_ep_lock); atomic_set(&f->f_count, 1); f->f_uid = current->fsuid; f->f_gid = current->fguid; f->f_owner.lock = RW_LOCK_UNLOCK;
INIT_LIST_HEAD(&f->f_list); f->f_maxcount = INT_MAX;
Как было сказано ранее, каждая файловая система имеет собственный набор файловых операций, выполняющих такие действия, как чтение и запись файла. Когда ядро загружает индексный дескриптор с диска в память, оно сохраняет указатель на эти файловые операции в структуре fiie operations, адрес которой хранится в поле i fop объекта индексный дескриптор”. Когда некоторый процесс открывает файл, VFS инициализирует поле f op нового файлового объекта адресом, хранящимся в индексном дескрипторе, чтобы в последующих обращениях к файловым операциям могли быть использованы эти функции. Если возникнет необходимость, VFS сможет впоследствии модифицировать список файловых операций, сохранив в поле f op новое значение.
Далее перечисляются файловые операции в том порядке, в каком они появляются В таблице fiie operations:
- liseek (fiie, offset, origin)—обновляет позицию файлового указателя;
- read (file, buf, count, offset) — читает count байтов файла, начиная с позиции offset. После этого значение offset (которое обычно соответствует файловому указателю) увеличивается;
- aio_read(req, buf, len, pos) — запускает асинхронную операцию ввода/вывода, чтобы прочитать len байтов в буфер buf, начиная с позиции pos в файле. Эта операция введена для поддержки системного вызова
io_submit();
- write (file, buf, count, offset) — записывает count байтов в файл, начиная с позиции offset. После этого значение offset (которое обычно соответствует файловому указателю) увеличивается;
- aio_write(req, buf, len, pos) — запускает асинхронную операцию ввода/вывода, чтобы записать len байтов из буфера в файл, в позицию pos;
- readdir (dir, dirent, fiiidir)—возвращает следующий элемент каталога в dirent. Параметр fiiidir содержит адрес служебной функции, которая извлекает поля элемента каталога;
- poll (file, poii tabie) — проверяет файловую активность и переходит в режим ожидания, пока не произойдет какое-либо соответствующее событие;
- iocti (inode, file, cmd, arg) — отправляет команду соответствующему аппаратному устройству. Этот метод относится только к файлам устройств;
- unlocked_ioctl (file, cmd, arg) —аналогичен методу iocti, НО не ИСПОЛЬ- зует глобальную блокировку ядра Ожидается, что этот новый метод будет реализован во всех драйверах устройств и во всех файловых системах вместо метода iocti;
- compat iocti (file, cmd, arg)— метод, применяемый для реализации 32-битового системного вызова iocti в 64-разрядном ядре;
- mmap(file, vma) — выполняет отображение файла в адресное пространство процесса
- open (inode, file) — открывает файл, создавая новый файловый объект и связывая его с соответствующим объектом индексный дескриптор”
- flush (file) — вызывается после закрытия ссылки на открытый файл. Реальные действия этого метода зависят от файловой системы;
- release (inode, file) — освобождает объект. Вызывается, когда закрывается последняя ссылка на открытый объект, т. е. когда поле f count файлового объекта становится равным нулю;
- fsync (file, dentry, flag) — принудительно записывает файл, т. е. записывает все кэшированные данные на диск;
- aio_fsync (req, flag) — запускает асинхронную операцию сброса кэшированных данных на диск;
- fasync (fd, file, on) — включает или выключает сигнальное оповещение
о вводе/выводе;
- lock (file, cmd, fiie iock) — блокирует указанный файл
- readv(file, vector, count, offset)—выполняет побайтовое чтение файла и помещает результат в буферы, описанные параметром vector; количество буферов указано в параметре count;
- writev (file, vector, count, offset) — ВЫПОЛНЯет побайтовую Запись в файл из буферов, описанных параметром vector; количество буферов указано в параметре count;
- sendfile(in_file, offset, count, file_send_actor, out_file)—пересы- лает данные из in fiie в out fiie (введен для поддержки системного вызова sendfile ());
- sendpage (file, page, offset, size, pointer, fill) —пересылает данные из file в кэш страницы page. Это низкоуровневый, используемый в sendf iie () и в коде поддержки сокетов;
- get_unmapped_area (file, addr, len, offset, flags) — получает неиспользуемый диапазон адресов для отображения файла в память;
- check fiags (flags) — метод, вызываемый служебной процедурой системного вызова fcnti для выполнения дополнительных проверок при установке флагов состояния файла (команда f setfl). В настоящее время используется только в сетевых файловых системах;
- dir_notifу(file, arg) — метод, вызываемый служебной процедурой системного вызова fcnti при включении оповещения об изменениях в каталоге (команда f notify). В настоящее время используется только в сетевой файловой системе CIFS (Common Internet File System, Общая файловая система Интернета);
- flock (file, flag, lock) — используется для настройки системного вызова flock. Ни одна из официальных файловых систем Linux этим методом не пользуется.

Эти методы доступны для всех допустимых типов файлов. Однако только определенное их подмножество относится к конкретному типу файла; поля, соответствующие нереализованным методам, устанавливаются в null.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...