> man operating_systems
Создание виртуальных файловых систем в Linux
на Четверг, 25 Май 2006, 00:53
добавил: Пешеходов А. П. aka fresco список авторов печатать элемент контента создать pdf-файл  элемент контента
категория Статьи > Unix
комментарии: 1
просмотров: 4145


Реализация файловых операций

До этого момента мы почти не касались работы собственно счетчиков, занимаясь реализацией внутренних VFS-механизмов, необходимых для работы любой файловой системы. Пришло время посмотреть, как будет выполняться реальная работа.

Операции над счетчиками находятся в структуре file_operations, которую мы ассоциируем с inodes файлов-счетчиков:

<div class='codec'>
static struct file_operations lfs_file_ops = {
.open =lfs_open,
.read =lfs_read_file,
.write =lfs_write_file,
};</div>

Впомним, что указатель на эту структуру помещается в inode каждого файла-счетчика функцией lfs_create_file().

Простейшей операцией является open():

<div class='codec'>
static int lfs_open(struct inode *inode, struct file *filp) {
filp->private_data = inode->u.generic_ip;
return 0;
}</div>

Все, что она делает – помещает указатель на atomic_t прямо в структуру file, что несколько упрощает доступ к нему.

Интересная работа выполняется функцией read(), которая должна инктрементроват счетчик, а затем возвращать его значение в пространство пользователя. Она начинается с чтения и инкрементированя счетчика:

<div class='codec'>
static ssize_t lfs_read_file(struct file *filp, char *buf,
size_t count, loff_t *offset) {

atomic_t *counter = (atomic_t *) filp->private_data;
int v, len;
char tmp[TMPSIZE];

v = atomic_read(counter);
if (*offset > 0)
v -= 1;
else
atomic_inc(counter);
len = snprintf(tmp, TMPSIZE, "%d\n", v);
if (*offset > len)
return 0;
if (count > len - *offset)
count = len - *offset;

if (copy_to_user(buf, tmp + *offset, count))
return -EFAULT;
*offset += count;
return count;
}</div>

Заметим ,что здесь возможны "" – 2 процесса могут прочитать счетчик до его инкрементированя, в результате чего одно и тоже значение счетчика будет возвращено дважды. Серьезный модуль, вероятно, попытался бы упорядочить доступ к счетчику путем применения блокировок (spinlocks), однако наша ФС предназначена только для демонстрационны целей и подобными сложностями не обременена.

Но в любом случае, мы имеем некоторое значение счетчика и должны вернуть его в пространство пользователя. Далее следует перекодированиеего в символьную форму и перемещение в пользовательски буфер, а также корректированиесмещения (seek) в файле.

Теперь рассмотрим функцию write, которая позволяет пользователям устанавливать значение счетчика:

<div class='codec'>
static ssize_t lfs_write_file(struct file *filp, const char *buf,
size_t count, loff_t *offset) {

atomic_t *counter = (atomic_t *) filp->private_data;
char tmp[TMPSIZE];

if (*offset != 0)
return -EINVAL;

if (count >= TMPSIZE)
return -EINVAL;
memset(tmp, 0, TMPSIZE);
if (copy_from_user(tmp, buf, count))
return -EFAULT;

atomic_set(counter, simple_strtol(tmp, NULL, 10));
return count;
}</div>

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

Завершение работы модуля

Отмонтирование ФС выполняется generic-функцией kill_little_super. При выгрузке модуля вызывается lfs_exit(), выполняющая дерегистрацию файловой системы:

<div class='codec'>
static void __exit lfs_exit() {
unregister_filesystem(&lfs_type);
}</div>

Заключение

Кода libfs полностью достаточно для реализации большинства driver-specific виртуальных файловых систем. Дополнительные примеры могут быть найдены в исходниках ядра Linux-2.6:

drivers/hotplug/pci_hotplug_core.c
drivers/usb/core/inode.c
drivers/oprofile/oprofilefs.c
fs/ramfs/inode.c


Аналогичные по тематике переводы и статьи можно найти на www.fresco.h16.ru.

индекс статьи
страница 1 : страница без заголовка
страница 2 : страница без заголовка
страница 3 - текущая : страница без заголовка

Комментарии
Roman I Khimov |25.05.2006 00:58
Комментарии: 952


Комментарии? Поправки? Дополнения? Предложения?
Добро пожаловать на форум.



Комментарии доступны только авторизованным пользователям, авторизуйтесь или зарегистрируйтесь на сайте здесь

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.