Краткие теоретические сведения. Файловая система (ФС) FAT отличается простотой, что позволяет относи­тельно несложно запрограммировать низкоуровневый доступ к ней

Файловая система (ФС) FAT отличается простотой, что позволяет относи­тельно несложно запрограммировать низкоуровневый доступ к ней. По этой причине она до сих пор применяется для сменных носителей (флэш-накопи­телей, флэш-карт) и специализированных устройств с ограниченными ресур­сами, а ее поддержка присутствует практически во всех современных ОС.

Файлы в ФС FAT хранятся в виде связных списков блоков – кластеров. Кластер пред­ставляет собой объединение от 1 до 64 целых секторов и, следовательно, имеют размер от 512 байт до 32 Кбайт. Таким образом, каждый файл, в зависимости от размера, представляется одним или несколькими кластерами, образующими цепочку (chain).

Ссылки, обеспечивающие связность списка, хранятся отдельно от дан­ных, в специальной структуре – таблице размещения файлов (File Alloca­tion Table – FAT), размещение которой на диске фикси­ровано и заранее известно. Каждая ячейка таблицы позиционно соответствует одному кластеру и содержит номер следующего кластера в цепочке. Кроме того, следующие значения ячеек зарезервированы для специальных случаев: 0 – пустой кластер, FFFh – послед­ний кластер в цепочке, FF7h – кластер помечен как дефектный и не исполь­зуется (здесь приведены значения для FAT12, для прочих они аналогичны). Первые две ячейки таблицы объединены и содержат код типа носителя.

Наибольшее количество кластеров, представимых таблицей, зависит от разрядности ее ячеек. На практике встречаются 12‑, 16‑ и 32‑разрядные версии FAT – соответственно FAT12, FAT16 и FAT32 (в FAT32 реально используются лишь 28-разрядные значения, но хранятся они в 4‑байтовых ячейках). Малое число кластеров на разделах большого объема приводит к слишком большому размеру каждого кластера и, как следствие, непроизводительному расходу дис­кового пространства. Для сравнения: у фай­ловых систем, свободных от ограни­чений FAT, характерный размер распреде­ляемых блоков составляет несколько килобайт.

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

Сканирование цепочки кластеров требует знания ее начала – номера первого кластера. Он содержится в записи директория, описывающего файл. Записи директориев – 32-байтовые, содержат имя файла, его атрибуты и некоторую служебную информацию, в том числе и номер первого кластера файла (часть записей может быть занято «длинными» именами файлов – они хранятся разбитыми на фрагменты в нескольких соседних записях). Поэтому первоначально нужно считать содержимое директория, найти в нем нужное имя файла и взять из этой записи номер первого кластера.

Сведения о размещении таблицы FAT, ее размере, размере кластера и другая служебная информация о разделе могут быть получены из блока параметров BIOS (BIOS Parameters Block – BPB). Он содержится вместе с кодом загрузчика раздела (Boot Record) в первом его логическом секторе. Если носитель не предполагает наличия разделов (например дискета), то этот же сектор является и первым физическим, и других загрузчиков носитель не имеет.

При наличии разделов (логических дисков) потребуется также обраба­тывать таблицы разделов – Partition Tables, описывающие их размещение, тип и размеры. Первая таблица разделов содержится в «главной» загрузочной записи (MBR – Master Boot Record), в первом физическом секторе диска. Если среди разделов есть расширенные, то они сами включают вложенные разделы и поэтому в первом своем секторе также содержат таблицу разделов.

Работа с FAT требует организовать низкоуровневый доступ к диску, который осуществляется на уровне секторов. Сектор имеет фиксированный в пределах одного диска размер, стандартно 512 байт, и является минимальной одновременно передаваемой порцией данных при обмене с блочным устрой­ством. Логическими или относительными называют секторы в пределах одного логического диска (раздела), они адресуются линейно, т.е. фактически поряд­ковыми номерами или индексами. Нумерация начинается с 1 (в случае MS-DOS). Физические или абсолютные секторы отсчитываются в рамках всего диска, и для них действуют два основных подхода к адресации. Традиционная адресация CHS (Cylinder-Head-Sector) предполагает три компонента идентифи­кации сектора: цилиндр (номер дорожки), головка (поверхность) и номер сек­тора в дорожке. Для современных дисков компоненты CHS-адреса уже не соответствуют их реальной физической конфигурации и автоматически транслируются контроллером, поэтому их правильнее воспринимать как «логические» цилин­дры и поверхности. Поддержка больших объемов дисков для CHS-адресации ограничена разрядностью компонентов адреса: 1024 «цилиндра», 256 «поверхностей», 63 «сектора». Линейная адресация (LBA – Linear Block Addressing) гибче, проще в использовании и более масштабируема в сторону увеличения числа секторов.

Логические секторы в MS-DOS читаются и пишутся прерываниями int 25h и 26h соответственно, при этом передаются параметры: AL – номер устройства; DX – номер первого обрабатываемого сектора; CX – количество секторов; ES:BX – адрес буфера в памяти. Признаком ошибки служит нену­левое значение флага CF. Кроме того, после возврата из прерываний стек всегда остается невыровненным: на его верхушке находится слово с кодом результата, которое необходимо извлечь.

Так как доступ по абсолютным адресам потребуется, скорее всего, только для секторов в начале диска, то достаточно будет традиционных функций BIOS. Сервис BIOS доступа к дискам представлен прерыванием int 13h, имеющим ряд функций, в том числе чтение и запись группы секторов. Код функции всегда передается в AH (02h – чтение, 03h – запись); DL – номер устройства; CH – младшие 8 бит номера цилиндра; DH – номер поверхности; CL – номер начального сектора (биты 5..0) и два старших бита номера цилиндра (биты 7..6); AL – счетчик секторов (не более чем на одной дорожке); ES:BX – адрес буфера в памяти. Признаком ошибки выполнения служит единичное значение флага CF, в этом случае код ошибки возвращается в AH.

Операции над внутренними структурами файловой системы потенци­ально опасны, поэтому рекомендуется ограничиваться, хотя бы на этапе отладки, съемными носителями, не содержащими уникальных данных. При выполнении большинства заданий для данной лабораторной работы потре­буется дискета, отформатированная под FAT. Все задания, если не огово­рено иное, выполняются для корневого каталога этой дискеты. Вместо реаль­ной (физической) дискеты можно использовать виртуальный диск A:, создан­ный, например, программой vfd. Также может использоваться и флэш-накопителях, отформатированный в FAT.

Контрольные вопросы

1. Понятие файловой системы.

2. Структура файловой системы FAT.

3. Разновидности FAT.

4. Загрузочная запись.

5. Организация каталога.

6. Организация FAT-таблицы.

7. Организация покластерного доступа к файлу.

Варианты заданий

2.3.1. С клавиатуры вводится имя файла. Необходимо найти запись для данного файла в корневом каталоге; составить список кластеров, в которых записано содержимое этого файла; покластерно прочитать его. Содержимое файла вы­вести на экран или (по выбору) сохранить в файл result.txt при помощи функций MS-DOS из первой лабораторной работы.

 

2.3.2. При помощи анализа цепочек выяснить, какой из файлов корневого каталога занимает наибольшее число кластеров. Имя этого файла показать на экране.

 

2.3.3. С клавиатуры вводится номер кластера. Необходимо выяснить, какому из файлов выделен данный кластер, и вывести имя этого файла.

 

2.3.4.Восстановление удаленного файла (повышенной сложности).

Файл при удалении его средствами MS-DOS не уничтожается полностью. Соответствующая ему запись в каталоге помечается как «удаленная» (символ E5h в начале имени файла), и все принадлежавшие файлу кластеры помечаются в таблице FAT как свободные. Ссылка на первый кластер и содержимое этих кластеров не затрагивается, поэтому сохраняется теоретическая возможность восстановления файла. Однако успешность восстановления не гарантируется, так как информация о порядке следования кластеров теряется, а сами они могут быть присоединены к другим файлам.

 

Лабораторная работа №3
Работа с памятью

Цели работы:

1) изучить организацию памяти и механизмы ее распределения в DOS;

2) научиться работать с динамической памятью в DOS;

3) научиться создавать сложные динамические структуры.