08. Драйверы. ФС

Драйверы

Драйвер устройства – это компьютерная программа, управляющая устройством.

Задача драйвера – с одной стороны, собственно, управление устройством, с другой – предоставление программного интерфейса для работы с этим устройством.

Драйверы фактически действуют в качестве “переводчика” между устройством и ОС или программами, это устроство использующими, чем значительно упрощают работу с устройствами, позволяя программисту писать более высокоуровневый код.

Драйверы специфичны к устройству и к ОС, для которых они разработаны. Для устройств определенного класса, например, принтеров, модемов, ПЗУ, звуковых и видео устройств и т.п., ОС может определять стандартный программный интерфейс, который драйвер должен реализовывать.

Например, высокоуровневый интерфейс для взаимодействия с последовательным портом может иметь две команды: “отправить данные” и “прочитать данные”. При этом на низком уровне, способы работы с контроллерами последовательного порта различных производителей могут разительно отличаться. Однако драйверы предоставляют унифицированный высокоуровневый интерфейс.

Для облегчения написания драйверов, существуют различные API и фреймворки, предоставляемые разработчиками ОС, в частности

Windows:

  • Windows Display Driver Model (WDDM)
  • Windows Driver Foundation (WDF)
  • Windows Driver Model (WDM)
  • Network Driver Interface Specification (NDIS)
  • Installable File System (IFS)

Linux:

  • Advanced Linux Sound Architecture (ALSA)
  • Scanner Access Now Easy (SANE)

Mac OS:

  • I/O Kit – an open-source framework from Apple for developing Mac OS X device drivers

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

Файловые системы

Файловая система определяет, каким образом хранятся и читаются данные.

В общем случае, данные, скажем, на жестком диске – это набор бит, который невожможно декодировать, не имея контекста. Это может быть текстовая, числовая, или графическая информация в любых сочетаниях. Она может быть сжата различными алгоритмами и т.д.

Файловая система определяет, где заканчивается один блок данных и начинается другой. Информация, таким образом разделенная на блоки, которые могут быть к тому же названы, становится легко идентифицируема и декодируема. Индивидуальный блок данных называется “файл”, по аналогии с информационными системами, основанными на бумаге. Структура и логика управления файлами, собственно, называется файловой системой.

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

Некоторые файловые системы используются на локальных запоминающих устройствах, таких как жесткие диски или оперативная память, другие обеспечивают доступ к сетевым файловым хранилищам. Некоторые файловые системы могут рассчитывать содержимое файлов “на лету”, другие могут получать содержимое файлов с устройств. В общем, вариантов множество.

Основные задачи, выполняемые файловой системой (или точнее, драйвером ФС):

  • Управление местом (для запоминающих устройств)
  • Имена файлов
  • Директории
  • Метаданные
  • Управление правами доступа
  • Сохранение целостности
  • Обеспечение доступа к данным
Управление местом

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

Большинство файловых систем выделяют место на диске небольшими блоками фиксированного размера, обычно от нескольких сотен байт до нескольких мегабайт (вполне похоже на выделение страниц оперативной памяти). Размер блоков достаточно произволен, и в конечном итоге определяется тем, какого размера файлы будут храниться в данной ФС. Если размер файла не кратен размеру блока, то часть последнего выделенного блока остается неиспользуемой. Это “потерянное дисковое пространство” находится в прямой зависимости от размера блока. В среднем, потерянное таким образом пространство равно количеству файлов умноженному на половину размера блока. Если ФС планируется использовать для хранения большого количества небольших файлов, то в целях уменьшения потерь места, следует использовать небольшой размер блоков. Напротив, использование ФС с маленькими блоками для хранения небольшого количества больших файлов приведет к потерям производительности в связи с тем, что каждый файл будет “собираться” из большого количества кусочков, и потерям места на хранение файловой таблицы. Некоторые файловые системы, например ReiserFS, оптимизируют потери места, храня в одном блоке по несколько маленьких файлов, однако это несколько сказывается на производительности.

Блоки не обязательно выделяются последовательно: один файл может физически быть “размазан” по всему носителю. Этот эффект называется фрагментацией ФС. В случае носителей с механическим поиском, как например традиционные жесткие диски, чтение фрагментированных файлов может быть сравнительно медленным, поэтому многие ФС стараются избегать избыточной фрагментации и предоставляют утилиты для дефрагментации. Эта проблема значительно менее выражена на твердотельных накопителях, поскольку там попросту нет механических частей.

Примером возникновения фрагментации может служить следующая ситуация

  1. Допустим, имеются последовательно расположенные файлы A,B,C,D,E
  2. Файл B удаляется
  3. Создается файл F размера, меньшего, чем B. ФС находит свободное место там, где ранее располагался файл B и записывает файл F туда.
  4. Создается файл G, занимающий остальное место, оставшееся после удаления файла B.
  5. В файл F дописываются данные. ФС вынужденна выделить блоки после конца файла E.
  6. Теперь представьте, что нужно дописать в конец файла E.
Пример возникновения фрагментации
Имена файлов

Имена файлов используются для идентификации областей хранения данных. Большинство файловых систем имеет ограничения на максимальную длину имени файла. В некоторых ФС, имена файлов чувствительны к регистру (в таких случаях имена foo, Foo и FOO относятся к трем разным областям хранения данных), в некоторых – нет (тогда все три имени указывают на одну область).

Часто, использование некоторых символов в именах файлов или некоторых имен файлов запрещено на уровне ФС или ОС. В качестве примера, попробуйте создать файл/папку с именем con (без расширения) в Windows.

Директории

ФС часто реализуют так же концепцию “директорий”, или “папок”, позволяющим группировать файлы. Структура директорий может быть “плоской” (i.e. директория не может содержать директорий), либо поддерживать иерархию директорий. Детали реализации могут отличаться от системы к системе.

Большинство современных файловых систем относятся ко второй категории.

Метаданные

Кроме имени файла и его физического размещения, может храниться прочая информация, такая как время создания, изменения и последнего доступа к файлу, его размер в байтах, разрешения доступа к файлу, владелец файла и т.д.

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

Управление правами доступа

Многие ФС поддерживают разграничение прав доступа к файлам. Это может быть реализовано при помощи списков контроля доступа (NTFS), либо с помощью бит владения (ext2-4).

В некоторых случаях, в ФС встроены методы шифрования данных, дабы исключить возможность неавторизованного доступа к системе.

Сохранение целостности

В не зависимости от того, что происходит с программами, пытающимися получить доступ к данным, ФС должна оставаться последовательной.

Так же необходимы средства для исправления ошибок ФС, возникающих в случаях непредвиденных сбоев ОС или оборудования. Нередко для исправления подобных ошибок необходимо журналирование событий. Оно так же может быть полезно для диагностики проблем.

Типы файловых систем

Дисковые ФС

Название говорит само за себя. Примеры включают:

FAT (FAT12, FAT16, FAT32), exFAT, NTFS, HFS, HFS+, HPFS, UFS, ext2, ext3, ext4, XFS, btrfs, ISO 9660, Files-11, Veritas File System, VMFS, ZFS, ReiserFS, UDF. ISO 9660 и UDF – ФС специфичные к оптическим дискам.

Flash ФС
В большинстве случаев, использование дисковых ФС для флеш-памяти типа твердотельных накопителей возможно. Однако дисковые ФС общего назначения обычно строятся вокруг идеи механического жесктого диска и не слишком хорошо оптимизированы для flash-памяти. Существуют специализированные ФС, например JFFS, JFFS2, YAFFS, UBIFS, F2FS. Следует иметь ввиду, что ориентированные на массового потребителя SSD и USB-flash рассчитаны на использование с дисковыми ФС общего назначения, и не выигрывают от использования Flash FS.
Кассетные ФС
Используются для записи на магнитные кассеты. Основная трудность – время случайного доступа измеряется в секундах, если не минутах. В связи с этим файловая таблица обычно равномерно распределяется по ленте в перемежку с данными, что позволяет снизить время поиска. Примером может служить IBM LTFS в различных версиях.
Сетевые или распределенные ФС
Драйвер ФС действует как клиент и предоставляет доступ к файлам, размещенным на сервере. Примеры включают NFS, CIFS.
Кластеризованные ФС
Используются в случае, когда несколько машин имеют доступ к одной дисковой системе (обычно СХД1), примерами могут служить GFS2, GPFS, SFS, CXFS.

  1. Сеть хранения данных, или SAN, Storage Area Network. Позволяет подключить дисковое устройство по сети “на низком уровне” Пример: iSCSI.↩︎