Данная статья, я надеюсь, поможет вам справиться со всякого рода неприятностями, связанными с хранением информации, а также послужит руководством для дальнейшего исследования работы ОС Windows. Обычно, мы не задумываемся, как хранятся на диске документы, рисунки, игровое ПО, но иногда возникают ситуации (неудачный «разгон» ЦП, вирусная атака, физическое повреждение носителя и т. п.), когда необходимо знать, где и как располагаются данные.

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

Одна из наиболее значимых информационных структур логического диска — его загрузочная запись. Она располагается в первом секторе диска (с появлением Windows 95 OSR2 при использовании FAT32 загрузочная запись размещается в нескольких секторах). Формат загрузочной записи в статье не приводится, но любой пользователь может его получить с помощью программы DiskEdit.

Назначение данной записи — загрузка ОС и организация хранения данных. Если логический диск является системным, то в его первом секторе имеется код загрузки ОС, управляющийся от MBR (Master boot record). Его задача — загрузка основных файлов ОС и передача им управления; в Windows 9х такими файлами будут io.sys и msdos.sys.

Если не существует загрузочной записи, то она создается и заполняется программой FORMAT. Но если она уже есть, то утилита FORMAT будет использовать ее информацию.

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

Еще один совет: если нужно провести полное форматирование диска, то сначала с помощью утилиты DiskEdit обнулите сектор загрузочной записи, а уже затем запускайте программу FORMAT.

Таблица размещения файлов

Следующая ступень организации хранения данных на жестком диске — FAT (File Allocation Table — таблица размещения файлов). Она, как правило, представлена в двух экземплярах, следующих друг за другом и содержащих одинаковую информацию (при условии, что все в порядке). Нужно помнить, что операционные системы DOS и Windows не различают цилиндры, головки и физические секторы диска, который для этих ОС предстает в виде непрерывной последовательности логических секторов или кластеров (группы смежных секторов). Система MS-DOS до версии 7.0 включительно и система Windows могли распознать 65 536 логических блоков на диске. Начиная с Windows 95 OSR2, появилась возможность использовать для нумерации логических элементов на диске 32-разрядные данные, а значит, число адресуемых элементов теоретически возросло до 4 294 967 295. Для DOS до версии 3.х включительно размер логического блока равнялся 512 байтам, т. е. размеру физического сектора. Видимо, поэтому появилось понятие «логический сектор», используемое и поныне. Наибольшая емкость диска, с которым могла работать DOS, составляла 32 Мбайт. Но был найден выход: объединять логические секторы в группы — так называемые кластеры. Под этим термином понимается группа таких смежных секторов, которым соответствует одно значение адреса. Если увеличить размер кластера, то можно будет работать с большими разделами, оставаясь в рамках 16-разрядной адресации. После перехода к 32-разрядной адресации стало возможным (правда, лишь теоретически) применять кластеры любого размера на любых разделах.

На рисунке представлена схема работы и организации FAT, а также фрагментация, когда части файла разбросаны по всему диску

Идея FAT очень проста. Все пространство логического диска разбивается на кластеры, размер которых зависит от емкости диска. Затем составляется таблица, каждому элементу которой соответствует элемент дискового пространства — кластер. Эта таблица линейная: индекс ячейки соответствует номеру кластера (значения ячеек приведены в табл. 1).

Если исключить резервирование кластеров, то максимальное число адресуемых кластеров в FAT16 — 65 526, в FAT32 — 4 294 377 472. FAT32 работает иначе, чем FAT16, и значения в табл. 1 обрабатываются иначе. Последние четыре разряда каждой записи FAT32 пока зарезервированы.

Расчет размера FAT

Размер FAT зависит от числа и объема кластеров. Рассчитать число секторов, занимаемых FAT, можно преобразовав формулу

N=[(Q - 2хN)/k]х(s/512),

где N — размер FAT в секторах в первом приближении; Q — общее число секторов на логическом диске (можно взять из загрузочной записи или таблицы разделов); k — размер кластера в секторах (для FAT32 мы сами задаем размер кластера, выбирая его кратным степени числа 2; по умолчанию он составляет 8 секторов, или 4 Кбайт); s — размер записи FAT в байтах (для FAT16 s=2, а для FAT32 s=4).

Итак, округлив до ближайшего целого числа

N=[Q/(kх128+2)] - R

рассчитывается размер для FAT32, а по

N=[Q/(kх256+2)] - R

— для FAT16. В этих формулах параметр R — число зарезервированных секторов между началом логического диска и FAT, оно берется из загрузочной записи.

Размер кластера в FAT32 можно задать с помощью команды FORMAT /z:n, где n=kх512 — размер кластера в байтах. (Допустимо с помощью утилиты DiskEdit внести изменения в поле «Размер кластера» загрузочной записи, а затем запустить команду FORMAT уже без параметров.) Кроме того, размер кластера изменяется с помощью программы Partition Magic (причем трансформацию можно произвести и на логическом диске с данными).

В FAT16 для определения размера кластера нужно сделать следующее. Выяснить число секторов, приходящихся на один адресуемый элемент (FAT16 может адресовать 65 526 элементов) Q/65526. Полученное значение нужно привести к виду 512х2t байт (округлив в большую сторону).

В заключение разговора о FAT нужно отметить, что первые два кластера резервируются. Что же касается скорости работы и «потерь» дискового пространства на незаполненных кластерах, то здесь действует принцип: выигрываешь в скорости — проигрываешь на неполностью занятых кластерах, т. е. чем больше размер кластера, тем меньше величина FAT и выше скорость работы с ней.

Корневой каталог

Логически корневой каталог служит оглавлением — это следующая за второй FAT область на логическом диске, являющаяся последовательностью 32-байтовых записей. Каждая из последних может быть каталогом, именем файла (в том числе и длинным), а также меткой тома. Нужно сразу отметить, что, в отличие от FAT32, в FAT16 размер корневого каталога зафиксирован.

В FAT16 таких записей 512. Легко подсчитать: 512х32 = 16 384 байта, или 32 сектора. При использовании FAT32 корневой каталог рассматривается как обычный каталог и его размер растет по мере необходимости.

Прежде чем идти дальше, нужно условиться, что под файлом данных понимается поименованная последовательность байтов. Причем ИМЯ хранится отдельно от этой последовательности. Теперь обратимся вместе с операционной системой к данным и будем работать с ними через ИМЯ, которое и есть 32-байтовая запись, упоминавшаяся выше. Но обычно при словосочетании «имя файла» нам представляется что-то вроде Program Files, io.sys и т. д. В чем же дело? Да в том, что привычные имя, размер, дата, время, атрибуты и номер первого кластера закодированы в 32-байтовой записи, а программы, работающие с файлом, раскодируют и показывают имя, дату и т. д. Формат записи каталога приведен в табл. 2.

«Время изменения» и «Дата изменения» кодируются по следующим формулам1

Время=(часых2048)+(минутых32)+(секунды+2);
Дата=((год-1980)х512)+(месяц х 32)+день.

Несколько слов об атрибутах файлов. Вот основные из них: «только чтение», «скрытый», «системный», «метка тома», «подкаталог», «архивный». Атрибут «подкаталог» сообщает ОС, что данная запись относится к подкаталогу, атрибут «метка тома» — к метке тома. Остальные атрибуты относятся к файлам данных и указывают, как система должна с ними работать.

Здесь есть один нюанс. Если указать недопустимую комбинацию атрибутов, например «метка тома»+«каталог»+«скрытый», то DOS перестанет видеть данную запись, а вместе с ней и тот объект, на который она указывала. Это свойство и используется в Windows 9x для хранения длинных имен файлов.

Длинное имя (ДИФ)

Все встречались, наверное, с сообщением об ошибке «Обнаружено длинное имя, не связанное больше с файлом». Подобное положение возникает тогда, когда файл удален, а длинное имя осталось. Интересная ситуация имеет место и в случае, если присвоить недопустимую комбинацию атрибутов файлу. Тогда этот файл исчезает из поля зрения системы, а дисковые утилиты Scandisk и NDD сообщают об обнаружении длинного имени, не связанного более с файлом. Если мы ответим согласием на предложение удалить его, то появится сообщение о наличии потерянных кластеров. Удаление этой цепочки приведет к безвозвратной потере файла, а сохранение ее в виде файла в корневом каталоге ставит вопрос о распознавании характера данных. И только Disk Minder из Nuts&Bolts смог корректно справиться с поставленной задачей. Он сообщил о неверной комбинации атрибутов файла и устранил ошибку. Так что будьте внимательны при работе с дисковыми утилитами, попытайтесь выявить причину каждой конкретной погрешности.

В заключение разговора о длинных именах остановлюсь на моментах, касающихся природы и способов хранения длинных имен на диске — в табл. 3 приводится формат записи длинного имени. Первый момент — особая комбинация атрибутов, прячущая запись ДИФ от DOS, второй — длинное имя файла, хранится в кодировке Unicode, третий — одно ДИФ разбивается на несколько мелких элементов (максимум до 20), длина каждого с учетом ряда характеристик, равна по-прежнему 32 байт.

Табл. 4 иллюстрирует вышесказанное.

Алексей Егоров,
homos7@bk.ru

Окончание в следующем номере


Идея исследования и некоторые материалы с http://stein.nm.ru.

1 Нортон П., Уилтон Р. IBM PC и PS/2 Руководство по программированию. М: Радио и связь, 1994.