WYOS - Выпуск №5
Файловые системы. FAT.
Wanderer, Среда, 30 Июнь 2004, 00:21

Напиши свою ОС! #5
<p>Здравствуйте, уважаемые подписчики!</p>

<p>С вами снова Wanderer. Огромные извинения за задержку в выпуске рассылки - виновник отстранен
с поста выпускающего редактора рассылки.</p>
<p>Но давайте перейдем к выпуску. Сегодня он посвящен ФС - файловым системам. Приступим?</p>

Введение
<p>Итак, файловая система. Файловые системы присутсвуют почти на всех видах накопителей.
На дискетах, CD-ROM, жестких дисках и других, менее распространенны устройствах.
Зачем нужна файловая система? Прежде всего для того, чтобы ОС знала где что находиться.
Любой файл представляет собой цепочку кластеров. При этом, необязательно последовательну
цепочку. Файловая система лишь содержит информацию о том, что где храниться на диске,
как это "что-" называется, какого оно типа, сколько места занимает, время последней модификации и так далее.
В этом и заключается основная функция ФС - обеспечивать хранение и доступ к информации на носителе.
Некоторые файловые системы обеспечивают также функции защиты данных.
Такие как, к примеру, шифрование. На данный момент существует достаточно
большое количество файловых систем. Наиболее распространенныи из них являются:</p>
<ul>
<li>FAT12 (Дискеты)</li>
<li>FAT16 (Старые, небольшого объема жесткие диски)</li>
<li>FAT32 (Большинство компьютеров под управление Windows используют ее)</li>
<li>NTFS (Компьютеры под управлением Windows NT)</li>
<li>Ext/2 (Linux-разделы)</li>
<li>Ext/3 (Также Linux-разделы, но чаще используется предыдущая)</li>
<li>CDFS (CD-ROM'ы)</li>
</ul>

FAT

<p>FAT существует, начиная с 1977 года. С тех пор она прошла несколько реинкарнаций (FAT12 - FAT16 - FAT32).</p>
<p>Первая версия FAT ограничивала имя файла 11 символами - 8 символов для имени и 3 для расширения. Размер диска
ограничивался достаточно большой для того времени цифрой - 16 мегабайт (не смейтесь, было и такое). Максимальный
размер кластера составлял 4 кб. Различий в регистре букв в имени файлов не было. В первой
версии FAT не существовало понятие директории. Это значило, что <i></i> файлы на носители должны были иметь
уникальное имя. Это упущенияе было исправлено чуть позже. Исправленая FAT была включена в DOS версии 3.0.</p>
<p>Позже FAT12 превратилась в FAT16 c поддержкой разделов с "" максимальным размером - 2 Гб. Размер
кластера стал измерятся 32 кб (что, несомненно, создавало огромные потери дискового пространства).</p>
<p>Затем последовала версия первая версия FAT32 с поддержкой "" имен файлов - максимальный размер составлял 255 символов.
Старый формат имен оставили ради совместимости.</p>
<p>После этого мы переходим к совсем недавнему прошлому - появлению FAT32 в современном ее виде. Наверняка, многие используют эту
ФС у себя на компьютере. FAT32 поддерживает диски до 2 Терабайт, чего, скорее всего, станет скоро мало, та же,
как стало мало 2 Гб. Размер кластера в FAT32 составляет как и в FAT12 4 кб. Расширена информация о файле - добавлены
поля, содержащие время последнего доступа к файлу и его последней модификации.</p>
<p>Каждый раздел с FAT содержит "служебную ", в которой расположены:</p>
<ul>
<li>Загрузочный </li>
<li>Параметры </li>
<li>Зарезервировання </li>
<li>Таблица размещения </li>
<li>Копия таблицы размещения </li>
</ul>
<p>И область данных с корневым каталогом (отсутсвует в FAT32) и самими файлами.</p>
<p>Таким образом, ФС "оття" себе немного места на жестком диске под служебную информацию</p>
<p>Итак, о загрузочном секторе мы знаем из предыдущих выпусков. Однако, знаем мы о нем не все. В нем,
оказывается, храниться еще и блок с информацией о параметрах ФС. Блок этот расположен по смещению 0x0b.
Ниже расположена таблица, в которой содержиться полное описание cтруктуры загрузочного сектора и сектора параметров ФС (продолжение в следующем выпуске):</p>
<table class='fborder'>
<thead><th>Имя</th><th>Смещение (байт)</th> <th width="100"><br> (в байтах)</th> <th></th></thead>
<tbody>
<tr>
<td><b>BS_jmpBoot</b></td><td align="center">0</td><td align="center">3</td><td>Инструкция, отвечающая за "" на загрузочный код.
Поле может быть представлено в двух разлчиных формах:<br>
<b>jmpBoot[0] = 0xEB, jmpBoot[1] = 0x??, jmpBoot[2] = 0x90</b><br>
<br>
<b>jmpBoot[0] = 0xE9, jmpBoot[1] = 0x??, jmpBoot[2] = 0x??</b><br>
<b>0x??</b> означает любое 8-битное значение.<br>
Наиболее часто используется первый вариант.
<br><br></td>
</tr>
<tr>
<td><b>BS_OEMName</b></td><td align="center">3</td><td align="center">8</td><td>“MSWIN4.1”. Существует множество ложных предположений относительно этой строки. На самом деле Windows не обращает на эту строчку ни малейшего внимания, в отличие от некоторых драйверов FAT. Поэтому, эта строка является всего лишь рекомендуемым параметром. На самом деле вы можете написать там что угодно, однако это может привести к тому, что некоторые драйвера FAT не смогут опознать такой диск. Обычно, это своеобразный признак того, какая ОС отформатировалараздел.<br><br></td>
</tr>
<tr>
<td><b>BPB_BytsPerSec</b></td><td align="center">11</td><td align="center">2</td><td>Количество байтов в секторе. Это поле может принимать только следующие значения: 512, 1024, 2048 или 4096. Если необходима максимальная совместимость, то следует использовать только значение 512. Существует множество драйверов FAT, которые даже не проверяют это поле, поскольку жеско привязаны к значению 512. Windows правильно интерпретирует значения 1024, 2048 и 4096, но они крайне не рекомендуются к использованию.<br><br></td>
</tr>
<tr>
<td><b>BPB_SecPerClus</b></td><td align="center">13</td><td align="center">1</td><td>Количество секторов в кластере. Значение этого параметра должно быть степенью числа 2 и быть больше 0. Допустимые значения: 1, 2, 4, 8, 16, 32, 64 и 128. Учтите, что значение должно быть таковым, чтобы значение параметра "байт на "(BPB_BytsPerSec * BPB_SecPerClus) было не больше, чем 32Кб (32*1024). Существует ложное мнение о том, что значения больше этой цифры прекрасно работают. Однако это не так. Значения, при которых размер кластера становиться больше 32 Кбайт чаще всего неправильно интерпретируются. Некоторые системы позволяют работать с кластером размером в 64Кбайта, но при таком размере кластера многие установочные программы просто откажутся работать.<br><br></td>
</tr>
<tr>
<td><b>BPB_RsvdSecCnt</b></td><td align="center">14</td><td align="center">2</td><td>Количество зарезирвированнх секторов в соответсвующем регионе диска, который начинается с первого сектора раздела. Значение этого параметра не должно быть равным 0. Для разделов с FAT12 и FAT16 значение должно быть равным только 1. Для разделов с FAT32 это значение обычно составляет 32. Существует множество драйверов FAT, жестко привязанных к значению 1 этого параметра для FAT12 и FAT16 и даже не проверяют его значения.<br><br></td>
</tr>
<tr>
<td><b>BPB_NumFATs</b></td><td align="center">16</td><td align="center">1</td><td>Количество таблиц FAT на диске. Значение этого параметра всегда должно равняться 2 для любого раздела под управлением любой версии FAT. Значение больше 2 или равное 1 также является допустимым, но некоторые драйвера FAT могут не работать при этих параметрах. По этой причине крайне не рекомендуется присваивать этому параметру значения, отличные от 2.<br>
Причина, по которой раздел содержит две таблицы размещения файлов кроется в обеспечении надежности хранения данных. К примеру, если какой-либо кластер, в котором содержиться часть таблицы окажется плохим, данные легко смогут быть восстановлены из второй копии, что позволит спасти файлы, расположенные на разделе, если диск начнет "сыпаться". На некоторых носителях, к примеру на картах памяти FLASH, где такие предосторожност не имеют смысла может исползоваться 1 копия таблицы размещения файлов. Однако такие носители могут не быть распознаны некоторыми драйверами FAT.
<br><br></td>
</tr>
<tr>
<td><b>BPB_RootEntCnt</b></td><td align="center">17</td><td align="center">2</td><td>Для разделов с FAT12 и FAT16 этот параметр содержит количество 32-байтных записей директорий в корневом каталоге. Для разделов с FAT32 этот параметр должен быть установлен в 0. Для FAT12 и FAT16 его значение должно быть степенью числа 32 или даже значения BPB_BytsPerSec. Для максимальной совместимости на разделах с FAT16 этот параметр должен быть равен 512<br><br></td>
</tr>
<tr>
<td><b>BPB_TotSec16</b></td><td align="center">19</td><td align="center">2</td><td>Значение для старых 16-битных версий FAT. Оно содержит общее количество секторов на разделе (во всех его областях). Если значение этого параметра установлено, то BPB_TotSec32 должен равняться 0. И наоборот. Для разделов с FAT32 значение этого параметра должно быть равным 0. Для разделов с FAT12 и FAT16 обязательны значения больше нуля если количество секторов меньше, чем 0x10000.<br><br></td>
</tr>
<tr>
<td><b>BPB_Media</b></td><td align="center">21</td><td align="center">1</td><td>Значение 0xF8 стандартно присваивается фиксированным устройствам. Для переносимых устройств чаще всего используется значение 0xF0. Допустимыми значениями являются: 0xF0, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE и 0xFF. Еще одна вещь, на которую стоит обратить внимание это то, что значение этого параметра следует также внести в младший байт записи FAT[0]<a href="#1">*</a>. Параметр оставлен для совместимости с MS-DOS 1.x и больше не для чего не используется.<br><br></td>
</tr>
<tr>
<td>BPB_FATSz16</td><td align="center">22</td><td align="center">2</td><td>Это поле содержит количество секторов, занимаемых <i></i> таблицей размещения файлов. На разделах с FAT32 значение этого параметра должно равняться 0, а количество секторов должно быть указано в параметре BPB_FATSz32<br><br></td>
</tr>
<tr>
<td>BPB_SecPerTrk</td><td align="center">24</td><td align="center">2</td><td>Количество секторов на дорожке. Используется прерыванием 0x13. Соответсвенно, этот параметр имеет значение только для устройств, разбитых на дорожки (жесткие диски, дискеты). В остальных же случаях этот параметр не указывается.<br><br></td>
</tr>
<tr>
<td>BPB_NumHeads</td><td align="center">26</td><td align="center">2</td><td>Количество головок. Также используется прерыванием 0x13. Все замечания для предыдущего параметра имеют смысл и здесь.<br><br></td>
</tr>
<tr>
<td>BPB_HiddSec</td><td align="center">28</td><td align="center">4</td><td>Количество скрытых секторов, предшествующих разделу, содержащему FAT. Этот параметр должен быть указан только для устройств, видимых по прерыванию 0x13. Если устройство не разбито на разделы, то этот параметр равен нулю.<br><br></td>
</tr>
<tr>
<td>BPB_TotSec32</td><td align="center">32</td><td align="center">4</td><td>Тоже, что и BPB_TotSec16, только для FAT32.<br><br></td>
</tr>
</tbody>
</table>
<a name="1">Первые два кластера перед FAT зарезервированы Первый зарезервированнй кластер - FAT[0] - содержит значение BPB_Media в младших восьми битах. Все остальные биты установлены в 1. К примеру, если значение BPB_Media 0xF8, то для FAT12 FAT[0] = 0x0FF8, для FAT16 FAT[0] = 0xFFF8, а для FAT32 FAT[0] = 0x0FFFFFF8. Подробнее об этом в следующем выпуске.</a>

Заключение

<p>На сегодня все. Достаточно мало, но времени у меня тоже было мало - я работаю над сайтом 3OS в данный момент. В следующем выпуске мы продолжим тему FAT. Его так же буду готовить я. После этого, commrade познакомит нас с NTFS, а уж после этого мы будем изучать Ext/2 под предводительствм Романа Химова. Следующий выпуск ждите как обычно, в Пятницу. А я с вами прощаюсь. До следующего выпуска!</p>

Напиши свою ОС! #5a

<p>Здравствуйте, уважаемые подписчики!</p>

<p>Снова пятница и в эфире не "Поле ", как вы могли подумать, а наша рассылка.
С вами снова я, Wanderer. Сегодня мы продолжим тему, начатую в предыдущем выпуске.</p>

FAT - часть вторая

<p>Итак, продолжение той таблицы, которая была опубликована в предыдщем выпуске.</p>
<p>Прежде всего, хочу отметить, что эта ее часть отличается для FAT12/FAT16 и FAT32. Для начала
рассмотрим вариант для FAT12/FAT16:</p>
<table>
<thead><th nowrap>Имя</th><th nowrap><br>(байт)</th><th nowrap><br>(в байтах)</th><th nowrap></th></thead>
<tbody>
<tr>
<td><b>BS_DrvNum</b></td><td align="center">36</td><td align="center">1</td><td>Номер привода для Int 0x13 (к примеру, 0x80). Для флоппи-приводов значение этого параметра равно 0x00, для жестких дисков - 0x80. Учтите, что это параметр специфичен для каждой конкретной ОС.<br><br></td>
</tr>
<tr>
<td><b>BS_Reserved1</b></td><td align="center">37</td><td align="center">1</td><td>Зарезервирован для Windows NT. Код, форматирующий раздел, должен установить значение этого параметра в 0 и только в 0.<br><br></td>
</tr>
<tr>
<td><b>BS_BootSig</b></td><td align="center">38</td><td align="center">1</td><td>Расширенная загрузочная подпись. (0x29) Этот параметр подтверждает, что следующие три записи в загрузочном секторе существуют.<br><br></td>
</tr>
<tr>
<td><b>BS_VolID</b></td><td align="center">39</td><td align="center">4</td><td>Серийный номер тома. Это поле позволяет определить драйверу FAT, что вставлен неправильный диск. Значение этого поля чаще всего генерируется обычным смешеванием текущей даты и времени в 32-битное значение.<br><br></td>
</tr>
<tr>
<td><b>BS_VolLab</b></td><td align="center">43</td><td align="center">11</td><td>Метка тома. Этот параметр содержит в себе 11-байтную метку тома, записанную в корневом каталоге. Учтите, что драйвера FAT должны обновлять это поле, когда файл с меткой тома в корневой директории изменяется. Значение для тома без метки стандартно - строка <pre>“NO NAME ”</pre> (11 символов, включая пробелы, кавычки, естетсвенно, опускаются).<br><br></td>
</tr>
<tr>
<td><b>BS_FilSysType</b></td><td align="center">54</td><td align="center">8</td><td>Тип файловой системы. Значения: <pre>“FAT12 ”, “FAT16 ”, “FAT ”</pre>(8 символов, включая пробелы). Существует ошибочное мнение, что значение этого параметра используетсяд драйверами FAT для определения типа ФС. На самом деле это не так, и поле носит чисто информативный характер. Однако значение этого параметра все равно должно быть указано. Как говоится, "на всякий ".<br><br></td>
</tr>
</tbody>
</table>
<p>Итак, на этом заканчивается таблица для FAT12/FAT16. Перейдем к этой же части таблицы, но для FAT32:</p>
<table>
<thead><th nowrap>Имя</th><th nowrap><br>(байт)</th><th nowrap><br>(в байтах)</th><th nowrap></th></thead>
<tbody>
<tr>
<td><b>BPB_FATSz32</b></td><td align="center">36</td><td align="center">4</td><td>Количество секторов, которое занимает одна таблица FAT. Значение используется для разделов с FAT32. Значение BPB_FATSz16 должно быть равным 0.<br><br></td>
</tr>
<tr>
<td><b>BPB_ExtFlags</b></td><td align="center">40</td><td align="center">2</td><td>Биты 0-3 - Номер активной FAT. Устанавливается только если выключено зеркалирование.<br>
Биты 4-6 - Зарезервированы<br>
Бит 7 - 0 означает, что таблица FAT имеет копию(копии), 1 - существует всего лишь одна копия таблицы, другие (если существуют) не обновляются.<br>
Биты 8-15 - Зарезервированы<br><br>
</td>
</tr>
<tr>
<td><b>BPB_FSVer</b></td><td align="center">42</td><td align="center">2</td><td>Версия файловой системы. Старший байт - основной номер версии. Младший - дополнительный. Этот параметр позволяет совершенствоват FAT32. На данный момент номер версии FAT32 установлен в 0:0. Если этот параметр отличен от нуля, то некоторые старые версии Windows не смогут монтировать в систему такой раздел.<br><br></td>
</tr>
<tr>
<td><b>BPB_RootClus</b></td><td align="center">44</td><td align="center">4</td><td>Номер первого кластера корневого каталога. Обычно равен 2, но может иметь любое другое значение.<br><br></td>
</tr>
<tr>
<td><b>BPB_FSInfo</b></td><td align="center">48</td><td align="center">2</td><td>Номер сектора раздела с FSINFO в специальной зарезервированнй области диска. Обычно равен 1.<br><br></td>
</tr>
<tr>
<td><b>BPB_BkBootSec</b></td><td align="center">50</td><td align="center">2</td><td>Если не равен нулю, то содержит в себе номер сектора в зарезервированнй части диска, в котором храниться копия загрузочного сектора. Обычно равен 6. Не рекомендуются другие значения.<br><br></td>
</tr>
<tr>
<td><b>BPB_Reserved</b></td><td align="center">52</td><td align="center">12</td><td>Зарезервированодля будущих дополнений. Программа, форматирующая раздел FAT должна установить значение этого параметра в "000000000000".<br><br></td>
</tr>
<tr>
<td><b>BS_DrvNum</b></td><td align="center">64</td><td align="center">1</td><td>См. описание этого параметра для FAT12/FAT16<br><br></td>
</tr>
<tr>
<td><b>BS_Reserved1</b></td><td align="center">65</td><td align="center">1</td><td>См. описание этого параметра для FAT12/FAT16<br><br></td>
</tr>
<tr>
<td><b>BS_BootSig</b></td><td align="center">66</td><td align="center">1</td><td>См. описание этого параметра для FAT12/FAT16<br><br></td>
</tr>
<tr>
<td><b>BS_VolID</b></td><td align="center">67</td><td align="center">4</td><td>См. описание этого параметра для FAT12/FAT16<br><br></td>
</tr>
<tr>
<td><b>BS_VolLab</b></td><td align="center">71</td><td align="center">11</td><td>См. описание этого параметра для FAT12/FAT16<br><br></td>
</tr>
<tr>
<td><b>BS_FilSysType</b></td><td align="center">82</td><td align="center">8</td><td>См. описание этого параметра для FAT12/FAT16. Всегда установлен в <pre>”FAT32 ”</pre>(восемь символов, включая пробелы)<br><br></td>
</tr>
</tbody>
</table>
<p>Кстати, небольшое замечание. Существует некоторое заблуждение, что подпись загрузочного сектора (0xAA55) занимает его последние два байта. На самом деле это верно только если значение BPB_BytsPerSec равно 512. Иначе, местоположение подписи не меняется, но и занимает уже не "последние два ". Кстати, этой ошибки не допустил наш редактор - Химов Роман. За что ему честь и хвала </p>

Заключение

<p>"Как, уже?!" - спросите вы. Да, уже. Я дал вам общее представление о структуре FAT-раздела и некоторую полезную информацию. Тема эта весьма обширна и ее не изложить за 1-2-3-4 выпусков рассылки. К ней мы еще вернемся и рассмотрим намного глубже. Так что не отчаивайтесь. А сегодня я с вами прощаюсь. До новых встреч в эфире!</p>



это контент от Центр информации по операционным системам
( http://www.osrc.info/plugins/content/content.php?content.9 )