Файловая система MS-DOS
19.02.2005 г.
При создании этой статьи использованы материалы из книги:
В.К. Волк. Исследование функциональной структуры памяти персонального
компьютера. Лабораторный практикум. Курган 2004 г. (DJVU, 3,3 МБ)
Файловая система
- Структура дискового пространства
- Информационная структура
- Физическая структура
- Логическая структура
- Рабочая область
- Системная область
- Особенности структуры жесткого диска
- Алгоритмы выполнения типовых файловых операций
- Чтение файла
- Запись файла
- Удаление файла
- Копирование, переименование и перемещение файла
Некоторые особенности FAT-12
Параметры стандартной дискеты
Читаем файл с дискеты
Вычисление номеров дорожки/поверхности/сектора
Соглашение об именах
Файловая система
При наличии большого числа программ и данных необходим строгий их учёт
и систематизация. Операционным системам приходится работать с
различными потоками данных, разными аппаратными и периферийными
устройствами компьютера. Организовать упорядоченное управление всеми
этими объектами позволяет
файловая система. Под
файлом при этом
понимают набор данных на диске, терминале или каком-либо другом
устройстве. Таким образом,
файловая система - это система управления
данными - часть операционной системы, обеспечивающая работу прикладных
программ с внешними запоминающими устройствами.
Для обеспечения доступа к файлам файловая система MS-DOS организует
и поддерживает на логическом диске определенную
файловую структуру.
Структура дискового пространства
Файловая система использует несколько уровней представлений о структуре
дискового пространства, каждый из которых ориентирован на определенную
группу потребителей и позволяет решать определенный круг задач доступа
к файлам. С этой точки зрения различают информационную, логическую и
физическую структуры, для которых существует определенный набор
структурных элементов и используется соответствующая терминология.
Информационная структура
Информационная структура дискового пространства - это внешнее
представление дискового пространства, ориентированное на пользователя
и определяемое такими элементами, как
том (логический диск),
каталог
(папка, директория) и
файл. Эти элементы используются при общении
пользователя с операционной системой. Общение осуществляется с помощью
команд, выполняющих операции доступа к файлам и каталогам.
Дисковое пространство представляется пользователю, как множество
логических дисков, для обозначения которых используются буквы
латинского алфавита от
А до
Z. При этом имена
А и
В зарезервированы
для гибких дисков.
С каждым из логических дисков связано
дерево каталогов. Дерево
каталогов ОБЯЗАТЕЛЬНО содержит один
корневой каталог (root directory)
и множество иерархически подчиненных каталогов. Корневой каталог
ВСЕГДА существует на отформатированном диске! Размер корневого
каталога для данного диска - величина фиксированная, поэтому
максимальное количество "привязанных" к нему файлов и других (дочерних)
каталогов (подкаталогов) - строго определенное. Корневой каталог не
имеет имени. Можно считать, что имя корневого каталога совпадает с
именем соответствующего логического диска.
Подчиненные каталоги - это (по существу) файлы определенной структуры,
аналогичной структуре корневого каталога. Размер подчиненного каталога
не фиксирован - он динамически изменяется при добавлении и удалении
регистрируемых в нем объектов (файлов или дочерних подкаталогов).
Размер подчиненного каталога ограничивается только размером логического диска.
Рис. 1
MS-DOS поддерживает иерархическую (древовидную) структуру каталогов
(рис.1). В отличие от корневого каталога, остальные каталоги
(подкаталоги) создаются с помощью специальных
внутренних команд
MS-DOS. Основная цель такой структуры каталогов - организация
эффективного хранения большого количества файлов на диске. КАЖДЫЙ
каталог (кроме корневого) имеет "родителя". Т.е. КАЖДЫЙ каталог
(кроме корневого) имеет другой каталог, к которому данный каталог
"привязан". MS-DOS рассматривает каждый каталог (кроме корневого),
как файл. Термин "привязан" иногда заменяется термином
"зарегистрирован". На рис.1 каталог 2.1 привязан к каталогу 1.1, т.е.
является дочерним по отношению к каталогу 1.1, и родительским по
отношению к каталогам 3.1 и 3.2.
Физическая структура
Технические средства (аппаратная часть) чтения-записи информации имеют
дело с
физической структурой дискового пространства. Физическая
структура описывается такими терминами, как диск (или пакет дисков),
рабочая поверхность диска, головка чтения-записи, магнитная дорожка и сектор.
Диск (пакет дисков) - физическое устройство для чтения-записи информации с автономным приводом.
Рабочая поверхность диска (Side) - магнитная поверхность диска, на которой хранятся данные.
Она связана с
магнитной головкой чтения-записи (Head).
Магнитная дорожка (Track) - дорожка на рабочей поверхности. Каждая дорожка поделена на секторы.
Сектор (Sector) - это минимальная единица дискового пространства, к которой можно обратиться для записи
или чтения информации. Обычно сектор составляет 512 байтов.
Цилиндр (Cylinder) - множество дорожек одинакового радиуса, расположенных
на всех рабочих поверхностях пакета дисков. Доступ ко всем дорожкам одного
цилиндра может быть обеспечен при однократном радиальном позиционировании блока магнитных головок.
Рис. 2
На рис.2 показана физическая структура дискеты. Не следует путать
термины "дорожка" и "цилиндр". Хотя на данном рисунке может показаться,
что цилиндр и дорожка - это одно и то же. Дискета на 1,4 МБ -
двусторонняя (т.е. имеет две рабочие поверхности), поэтому на одном
цилиндре расположены две дорожки.
Все рабочие поверхности, дорожки и секторы последовательно
пронумерованы. Поэтому номер поверхности, номер дорожки на этой
поверхности и номер сектора на этой дорожке однозначно определяют
иерархический адрес сектора. Используют также
абсолютную нумерацию
секторов - начиная с нулевого сектора нулевой дорожки нулевой
поверхности диска. Для однозначного определения места расположения
какого-либо файла на диске необходимо связать с этим файлом
упорядоченную последовательность пронумерованных секторов.
Сектор - это весьма малая единица емкости дискового пространства.
Поэтому использование дискового пространства в качестве логического
адреса файла на диске может создавать технические проблемы и снижает
эффективность использования дисков большой емкости. Для устранения
этих недостатков используется более крупная единица, называемая
кластером. Кластер является основным элементом логической структуры
диска и содержит несколько секторов. Количество секторов в кластере
зависит от емкости диска и некоторых других параметров.
Логическая структура
Логическая структура реализует линейную ("ленточную") модель дискового
пространства тома. Согласно этой модели том разделен на две
расположенные последовательно области - системную и рабочую.
Рабочая область, расположенная непосредственно после системной,
разделена на последовательно пронумерованные
кластеры и предназначена
для хранения файлов и подкаталогов. Кластер используется в качестве
минимальной единицы, выделяемой операционной системой одному файлу или
подкаталогу. Например, кластер Windows (FAT32) имеет размер 32 КБ. И
если даже файл имеет размер 1 КБ, то для него все равно будет выделено
на диске 32 КБ. В Windows все это можно увидеть, щелкнув по файлу
правой кнопкой и выбрав пункт "Свойства".
Каждый кластер имеет уникальный номер и содержит несколько
расположенных подряд секторов (1 или 2 сектора в кластере для гибких
дисков, 4 и более - для жестких). Между номером кластера и списком
абсолютных номеров секторов, которые в него входят, существует
взаимно-однозначное соответствие.
Системная область занимает несколько начальных (в абсолютной нумерации)
секторов, начиная с нулевого, и содержит блоки служебной информации.
Эти блоки используются для организации доступа к файлам и загрузки
операционной системы:
Блок загрузки (Boot-Sector)
Блок загрузки всегда занимает нулевой сектор и содержит таблицу
параметров формата диска и короткую программу загрузки DOS. Структура
блока загрузки показана в таблице 1.
Таблица 1. Структура блока загрузки.
Смещение | Длина, байт | Содержимое |
+00 | 3 | Команда перехода на программу загрузки (JMP) |
+03 | 8 | Служебная информация программы форматирования |
+0Bh | 2 | Размер сектора в байтах |
+0Dh | 1 | Количество секторов в кластере |
+0Eh | 2 | Количество секторов перед первой FAT (кол-во резервных секторов в начале диска) |
+10h | 1 | Количество копий FAT (стандарт - две) |
+11h | 2 | Максимальное число элементов корневого каталога |
+13h | 2 | Общее число секторов на логическом диске |
+15h | 1 | Дескриптор носителя - тип формата диска (то же, что и 1-й байт FAT) |
+16h | 2 | Количество секторов в одной FAT |
+18h | 2 | Количество секторов на дорожке |
+1Ah | 2 | Количество головок чтения-записи (поверхностей) |
+1Ch | 2 | Количество скрытых секторов |
+1Eh | | Размер форматированной порции корневого сектора |
| | Начало кода и данных загрузки |
Корневой каталог (Root Directory)
Корневой каталог состоит из набора регистрационных записей (32-байтных
элементов). Каждая регистрационная запись содержит информацию об одном
файле или подкаталоге и имеет следующую структуру:
Таблица 2. Структура корневого каталога (одной записи).
Смещение | Длина, байт | Содержимое |
+00 | 8 | Имя файла или каталога |
+08 | 3 | Расширение |
+0Bh | 1 | Атрибуты файла |
+0Ch | 0Ah | Резерв |
+16h | 2 | Время создания/модификации (в специальном формате) |
+18h | 2 | Дата создания/модификации (в специальном формате) |
+1Ah | 2 | Номер начального кластера |
+1Ch | 4 | Размер файла в байтах |
+20h | | Размер элемента оглавления |
Байт атрибутов файла. Шесть младших битов байта атрибутов
используются как битовые флаги.
Единичное значение каждого бита задает
определенное свойство соответствующего объекта:
Таблица 3. Байт атрибутов файла
Бит | Значение | Свойство |
0 | 1 | Только чтение (R/O - Read Only) |
1 | 1 | Скрытый (Hid - Hidden) |
2 | 1 | Системный (Sys - System) |
3 | 1 | Метка тома (Vol - Volume) |
4 | 1 | Элемент подкаталога (Dir - Directory) |
5 | 1 | Архивная копия файла НЕ создавалась (Arc) |
Информация, хранимая в атрибутах, используется операционной системой
при выполнении файловых операций. Например, значение атрибута
Dir
позволяет отличать файл от подчиненного каталога, а по значению
атрибута
Arc отбираются файлы для резервного копирования. Атрибут
R/O
запрещает изменять и удалять файл, а атрибут
Hid делает файл
"невидимым" (команда DIR не выводит его имя в списке). Если в записи
корневого каталога установлено единичное значение атрибута
Vol, то
поля "Имя" и "Расширение" этой записи (всего 11 байтов) будут
трактоваться как метка тома, а остальные данные этой записи будут
игнорироваться.
Время и дата создания файла (подкаталога) описываются двухбайтовыми
блоками данных в следующих форматах:
Время
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Часы (0-23) |
Минуты (0-59) |
2-секундные единицы (0-30) |
Дата
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Год (0-119)+1980 |
Месяц (1-12) |
День (0-31) |
Подчиненные каталоги по своей структуре подобны корневому
каталогу - то есть содержат множество 32-байтовых регистрационных
записей. В отличие от корневого, каждый подчиненный каталог имеет две
служебные записи:
- Запись подкаталога в поле "Имя" содержит символ "." (точка), а в поле "номер начального кластера" ссылку "на самого себя".
- Запись подкаталога с символами ".." (две точки) в поле "Имя" - это ссылка на родительский каталог (если родительским является корневой каталог, то в качестве номера кластера указывается "0").
Все подчиненные каталоги хранятся в рабочей области диска подобно
файлам. При создании подкаталога ему выделяется один кластер (из числа
свободных), в котором создаются две служебных записи. После заполнения
этого кластера регистрационными записями (
см. табл.2) этому подкаталогу
выделяется еще один свободный кластер и т.д.
Таблица распределения файлов (FAT)
Таблица распределения файлов (FAT) - это связанный список, который
обеспечивает возможность фрагментарного расположения файлов на диске
(т.е. расположения файлов по частям в разных местах диска). Этот
список используется файловой системой для определения последовательности
кластеров, выделенных файлу или подкаталогу, а также для поиска
свободного пространства, необходимого для записи новых файлов и
подкаталогов. Число элементов этого списка равно числу кластеров в
рабочей области диска. Каждому кластеру соответствует один "одноименный"
(т.е. имеющий такой же номер) элемент FAT.
Каждому файлу или подкаталогу, записанному (хранящемуся) в рабочей
области диска, соответствует
цепочка элементов FAT. Номер начального
элемента этой цепочки (совпадающий с номером начального кластера)
указывается в соответствующей регистрационной записи каталога. Первый
элемент цепочки указывает (содержит номер) на следующий элемент
(кластер) и т.д. до конечного элемента, в котором указывается
специальный код - признак конца файла.
Для гибких дисков используются 12-битовые элементы FAT, а для
жестких - 16-ти и 32-битовые. Длина элемента FAT определяет
разрядность хранимого в нем двоичного числа. Поэтому длина элемента
FAT ограничивает максимальное количество кластеров, которые могут быть
сформированы в рабочей области тома (для FAT-12: 2
12 = 4096; для
FAT-16: 2
16 = 65535; для FAT-32: 2
32 = 4294967296).
Каждый из
элементов FAT представляет один кластер и может содержать следующие коды:
(0)000h | Доступный (свободный) кластер |
(0)002h до (F)FEFh | Номер следующего кластера |
(F)FF0h до (F)FF7h | Зарезервированный кластер |
(F)FF7h | Плохой кластер (BAD) |
(F)FF8h до (F)FFFh | Конец цепочки (EOF) |
Первый байт FAT имеет особый статус и содержит так называемый
"дескриптор носителя" (FAT ID-байт), в котором закодирована информация
о типе и формате диска. Следующие 5 байтов (FAT-12) или 7 байтов
(FAT-16) содержат код 0FFh. (На стандартной дискете элементы FAT начинаются с 3-го байта). Далее следуют собственно элементы FAT.
Пример:
Пусть элемент некоторого каталога содержит регистрационную запись о
файле, в которой содержится ссылка на начальный кластер (кластер № 18)
из цепочки кластеров, выделенных этому файлу.
На рисунке обычным шрифтом обозначены номера элементов FAT (номера
элементов FAT соответствуют номерам кластеров), а жирным шрифтом
обозначены числовые значения, записанные в этих элементах. Все числа
представлены в шестнадцатиричной системе счисления.
10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 |
18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
00 | 00 | 13 |
14 | 15 | FF8 | 00 | 00 |
19 | 1A | 1B | 25 | 00 |
00 | 00 | 00 |
20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 |
28 | 29 | 2A | 2B | 2C | 2D | 2E | 2F |
00 | 00 | 00 |
00 | 00 | 26 | 27 | 29 |
FF7 | 2A | 2B | FF8 | 00 |
00 | 00 | 00 |
Рис. 3
Из приведенного на рис.3 фрагмента FAT следует:
- Файл занимает цепочку из десяти кластеров: 18h-19h-1Аh-1Bh-25h-26h-27h-29h-2Ah-2Bh. Каждый элемент указывает на следующий элемент цепочки - значение элемента № 18h равно 19h, значение элемента 19h равно 1Аh и т.д. Последний элемент содержит специальный код EOF (FF8h) - конец файла.
- Еще одна цепочка начинается с кластера № 12h и кончается кластером № 15h. Чтобы узнать, какому файлу (или подкаталогу) распределены эти кластеры, нужно отыскать в каком-либо каталоге тома регистрационную запись, содержащую ссылку на начальный кластер № 12h.
- Кластер № 28h помечен, как BAD (FF7) и не входит ни в одну из цепочек. При поиске свободных кластеров для записи нового файла этот кластер будет игнорироваться.
- Кластеры № 10h, 11h, 16h, 17h, 1Ch…24h и 2Ch…2Fh пусты (точнее - объявлены таковыми). Они доступны для распределения под вновь записываемые файлы.
- Каждая цепочка кластеров, выделенных системой для одного файла (подкаталога), упорядочена в порядке возрастания их номеров.
Особенности структуры жесткого диска
Жесткий диск может быть разделен на несколько логических дисков
(разделов, томов). Каждый из них рассматривается как автономный диск.
Каждый логический диск имеет собственную системную и рабочую области.
Любой логический диск может выступать в качестве загрузочного
(системного) диска.
Для обеспечения процесса начальной загрузки операционной системы, а
также для хранения данных о физическом расположении логических дисков,
в первом секторе жесткого диска (0-й цилиндр, 0-я сторона, 1-й сектор)
создается специальная информационная структура -
главная загрузочная
запись (Master Boot Record, сокращенно MBR). MBR содержит
код
программы начальной загрузки и
таблицу разделов диска (Partition Table).
Каждый раздел в таблице представлен одним 16-байтовым элементом,
содержимое которого формируется программой форматирования жесткого
диска (например, FDISK). Для просмотра разделов можно использовать
утилиту DiskEdit. Хотя работать с ней нужно очень осторожно. Здесь
как у сапера - ошибаться нельзя - можно потерять всю информацию.
Таблица 4. Структура таблицы разделов диска.
Смещение | Длина, байт | Содержимое |
1-й элемент (для первого раздела диска) |
+00 | 1 | Флаг загрузки: 0 - не загружаемый 80h - загружаемый (BootAble) |
+01 | 1 | Начало раздела: Hds (№ головки) |
+02 | 2 | Начало раздела: Sec (№ сектора - 6 младших битов) Cyl (№ цилиндра - 10 старших битов) |
+04 | 1 | Код системы: 0 - неизвестна 1 - DOS (FAT-12) 4 - DOS (FAT-16) |
+05 | 1 | Конец раздела: HdE (№ головки) |
+06 | 2 | Конец раздела: Sec (№ сектора - 6 младших битов) Cyl (№ цилиндра - 10 старших битов) |
+08 | 4 | Абсолютный номер начального сектора раздела (соответствует номерам сектора, головки и цилиндра начала раздела):
Cyl*сект./дор.*дор./цил.+Hds*сект./дор.+(Sec-1) |
+0Ch | 4 | Число секторов раздела |
2-й элемент (для второго раздела диска) |
+10h | 1 | Флаг загрузки |
... | ... | ... |
... | ... | ... |
Последний элемент (после описания последнего раздела диска) |
| | 0AA55h |
Процесс загрузки системы с жесткого диска начинается со считывания
MBR в ОЗУ и передачи управления на код находящейся в MBR программы.
Эта программа читает таблицу разделов диска и определяет первый из
разделов, помеченный как BootAble. Затем в память считывается
boot-сектор этого раздела и ему передается управление. Далее работает
программа начальной загрузки, находящаяся в boot-секторе раздела,
которая загружает все необходимые системные файлы.
Алгоритмы выполнения типовых файловых операций
Чтение файла
Чтение файла с диска (например, при выполнении команды TYPE D:\TEXT\name.txt) реализуется следующей процедурой:
- В корневом каталоге логического диска D находится регистрационная запись, у которой:
- поле "Имя" = ТЕХТ
- поле "Расширение" = пусто
- атрибут Dir = 1
В этой записи читается значение поля "Номер начального кластера" (N)
- Читается первая копия FAT логического диска D и определяется
цепочка номеров кластеров (которая начинается с N и оканчивается EOF), выделенных каталогу ТЕХТ.
- Читается каталог ТЕХТ:
- последовательно считываются все кластеры этой цепочки, начиная с N-го
- находится регистрационная запись, у которой:
- поле "Имя" = name
- поле "Расширение" = txt
- атрибут Dir = 0
В этой записи читается значение поля "Номер начального кластера" (N1).
- Читается первая копия FAT диска D и определяется цепочка номеров кластеров (которая начинается с N1 и оканчивается EOF), выделенных файлу name.
- Читается файл name: последовательно считываются все кластеры этой "цепочки", начиная с N1-го.
Запись файла
При записи на диск нового файла выполняется следующая процедура (приводится с упрощениями):
- По результатам анализа FAT определяется первый свободный ее элемент, номер которого записывается в очередную запись соответствующего каталога в качестве номера начального кластера.
- По данным таблицы формата диска, расположенной в его boot-секторе, и известному размеру файла в байтах вычисляется количество кластеров, необходимых для размещения файла.
- Начиная с начального элемента FAT, определяется цепочка свободных элементов (содержащих "0"), расположенных в порядке возрастания их номеров. При этом в каждый элемент записывается номер следующего элемента цепочки, а в последний элемент записывается код (F)FF9h (EOF).
- Файл последовательно записывается в кластеры рабочей области диска, номера которых соответствуют номерам элементов FAT, включенных в цепочку.
Например (
см. рис.3), при записи файла размером 1234 байта на дискету стандартного формата (512 байтов в секторе, 1 сектор в кластере), этому файлу будет выделено три кластера с номерами 10, 11 и 16. При этом последний (16-й) кластер будет занят лишь частично.
Удаление файла
При удалении файла стандартными средствами (командой DEL):
- Рабочая область диска не модифицируется, то есть файл физически сохраняется в кластерах, выделенных ему при записи.
- Сохраняется также и регистрационная запись об этом файле в соответствующем каталоге, в том числе длина файла и ссылка на номер его начального кластера.
- Первый символ имени удаляемого файла в его регистрационной записи заменяется на код E5h (этот код соответствует строчной русской букве "х", недопустимой с точки зрения соглашения об именах MS DOS) - наличие такого символа в начале имени файла является признаком того, что файл логически удален.
- Обнуляется вся цепочка элементов FAT удаляемого файла, что делает соответствующие кластеры доступными для последующей записи.
Анализ рассмотренных выше процедур записи и удаления файлов показывает,
что в ряде случаев сохраняется возможность восстановления удаленного
файла (до тех пор, пока на его место физически не записан другой файл).
Для восстановления логически удаленного файла достаточно изменить в
регистрационной записи соответствующего каталога первый символ имени
файла на любой из допустимых и восстановить в FAT цепочку номеров
кластеров, занятых этим файлом.
Копирование, переименование и перемещение файла
При
переименовании файла изменяются только значения полей "Имя" и
"Расширение" соответствующей регистрационной записи каталога.
Процедура
копирования файла реализуется последовательным выполнением
рассмотренных выше процедур чтения, записи и переименования.
Процедура
перемещения файла между двумя каталогами одного
логического диска сводится к перемещению соответствующей
регистрационной записи. Если же файл перемещается на другой
логический диск, то он "удаляется" с одного диска и "копируется" на другой.
Некоторые особенности FAT-12
Программа DiskEdit нами уже упоминалась. Также упоминалось, что
пользоваться ею нужно очень осторожно. По умолчанию обычно установлен
режим "Только чтение". Если вы не вполне уверены, что правильно
понимаете и представляете себе структуру диска, лучше этот режим не
отключайте. Далее мы разберем пример использования этой программы для
чтения дискеты (1,4 МБ), потому как начинать эксперименты лучше с
дискетой. Дискета имеет файловую систему FAT-12.
Для начала несколько самых основных понятий для тех, кто впервые сталкивается с двоичной системой счисления:
Бит - это один разряд в двоичном числе. Например, двоичное
число 1001 содержит 4 бита (четырехразрядное двоичное число).
Байт - это восемь битов (байт: 10100010 - двоичное число или А2 - шестнадцатиричное число или 162 - десятичное)
Слово - это два байта (1010001010100010b = A2A2h = 41636)
Смещение - это смещение от относительного адреса. Например, запустив программу DiskEdit, вы увидели следующее:
00000000: 11 12 34 А8 00 12 67 00 - 00 00 00 00 00 00 00 ВВ
00000010: 10 02 3В А0 05 33 77 00 - 00 00 00 00 00 00 00 00
Относительный адрес в первой строке равен 0 (00000000). Следующая за
ним шестнадцатиричная цифра 11 находится по смещению +00 (0+00=0),
цифра 12 - по смещению +01 (0+01=1) и т.д. Последняя цифра в этой
строке (BB) находится по смещению +0F (0+0F = Fh = 15). Во второй
строке по смещению +06 находится число 77. ОБРАТИТЕ ВНИМАНИЕ: число
77 находится по смещению +06 относительно второй строки, и по смещению
+16h относительно первой строки. С этими нюансами вам придется
постоянно сталкиваться - привыкайте.
Самое интересное здесь для нас - это представление слова данных в
памяти компьютера и чтение этих данных. Например, при просмотре диска
программой DiskEdit, мы увидели такое слово данных (два смежных байта):
12 А3
Если просто перевести его в десятичный формат, то получим:
12А3 = 4771
это правильный перевод. Однако нам так делать нельзя. Из-за некоторых
особенностей компьютера перед тем как перевести шестнадцатиричное
число в десятичное, нам нужно поменять байты местами. Тогда получим:
А3
12 = 41746
А это уже правильное число. Причин этих премудростей я объяснять не буду - уж поверьте на слово, что так оно все и есть.
Но еще смешнее будет разбираться (с учетом вышесказанного) с файловой
системой FAT-12. Потому как здесь мы будем иметь дело с 12-битными
блоками данных. Т.е. каждый такой блок больше одного байта, но меньше
слова. При такой системе очень легко запутаться и разобраться где там
какой кластер/сектор и т.д. Предлагаю следующий метод (я его сам
придумал, поэтому, быть может, он не является самым простым). Не
забываете, что в каждом слове данных нам нужно менять местами байты.
Допустим, что мы имеем следующий участок FAT:
слово | 0 | 1 | 2 | 3 |
смещение | +00 | +01 | +02 | +03 | +04 | +05 | +06 | +07 |
значение | F0 | FF |
FF | 03 |
40 | 00 |
FF | 0F |
Рисунок 4.
Меняем местами байты нулевого слова (
F0FF -> FF
F0) и записываем результат в самой правой части страницы:
FF F0
Меняем местами байты первого слова (
FF03 -> 03
FF) и записываем результат слева от сделанной нами записи:
03 FF FF F0
Меняем местами байты второго слова (
4000 -> 00
40) и записываем результат слева от сделанной нами записи:
00 40 03 FF FF F0
Меняем местами байты третьего слова (
FF0F -> 0F
FF) и записываем результат слева от сделанной нами записи:
0F FF 00 40 03 FF FF F0
Теперь разделяем полученную нами цепочку на трехразрядные числа, начиная с правой части:
Элемент FAT -> |
4 | 3 | 2 | 1 | 0 |
Значение -> |
FFF | 004 | 003 | FFF | FF0 |
Читаем
справа налево. Номер элемента FAT соответствует номеру
кластера. На дискете первые два элемента FAT (первые три байта)
занимает служебная информация. Ссылки на кластеры, которые содержат
файлы и каталоги, начинаются со второго элемента FAT (с 3-го байта -
и не забудьте, что отсчет ведется с нуля). В нашем примере файл
занимает 3 кластера. Второй элемент FAT содержит число 3. Это значит,
что продолжение цепочки нужно искать в 3-м элементе. 3-й элемент
содержит число 4, т.е. цепочка продолжается. В 4-м элементе содержится
признак конца файла - число FFF. Так как число FFF означает конец
файла, то ноль, который "затесался" к нам из последнего слова, нас
уже не интересует. Если мы запишем на дискету еще один файл, то вместо
нуля может появиться какое-нибудь другое число.
Параметры стандартной дискеты
Дискета стандартного формата (1,4 МБ) имеет следующие параметры:
Таблица 5. Параметры стандартной дискеты.
Параметр | Значение |
Размер сектора | 512 Б |
Секторов в кластере | 1 |
Количество секторов перед первой FAT | 1 |
Количество FAT | 2 |
Максимальное число элементов корневого каталога | 224 |
Общее число секторов | 2880 |
Количество секторов в одной FAT | 9 |
Количество секторов на дорожке | 18 |
Количество поверхностей | 2 |
Количество спрятанных секторов | 0 |
Емкость | 1457664 Б |
Самый простой способ определения максимально возможного количества
файлов, размещенных на дискете стандартного формата - это разделить
емкость дискеты на размер кластера:
1457664/512 = 2847
Но мы не ищем простых путей! Поэтому, используя вышеприведенные
параметры, которые можно просмотреть с помощь программы DiskEdit (не
забывайте "переворачивать" байты, если данные имеют размер слова),
попробуем получить тот же результат. Итак,
- У нас есть один загрузочный сектор, а параметр "Количество секторов перед первой FAT" равен 1. Это значит, что перед FAT только этот один загрузочный сектор и расположен.
- Параметр "Количество секторов в одной FAT" равен 9 и параметр "Количество FAT" равен 2. То есть две копии FAT занимают на дискете 18 секторов (9*2 = 18).
- Параметр "Максимальное число элементов корневого каталога" равен 224. Каждый элемент корневого каталога занимает 32 Б. Умножаем 224 на 32: 224*32 = 7168. Делим это число на 512 (размер сектора) и получаем число 14. То есть корневой каталог занимает 14 секторов.
- Подсчитываем количество секторов, занимаемых служебной информацией:
1(загрузочный) + 18(FAT) + 14(корень) = 33.
- Осталось отнять от общего количества секторов (2880) полученное нами число: 2880 - 33 = 2847. То есть 2847 - это количество секторов, доступных для хранения пользовательских файлов.
Получили тот же результат. Т.к. любой файл занимает на диске не менее
одного кластера, а на дискете стандартного формата в кластере
содержится один сектор, то получается, что максимально возможное
количество файлов на такой дискете равно 2847.
Логично? Да! Но не правильно. Я и сам на этом в контрольной
"прокололся". Здесь есть несколько нюансов. Как говорит наш
преподаватель по информатике: "Дискета - это не просто мешок с
файлами". Дело в том, что мало просто заполнить файлами эти 2847
секторов. Надо ведь к этим файлам еще как-то обращаться. А для этого
в корневом каталоге имеется набор регистрационных записей
(см.
Корневой каталог (Root Directory)).
А максимальное число элементов корневого каталога, как сказано выше,
равно 224. Вот и получается, что на дискету (в корень) можно записать
не более 224 файлов. Ну а если есть необходимость записать большее
количество файлов, то в "корень" записывают, например, 223 файла.
А вместо 224-го записывают подчиненный каталог, который будет иметь
уже свою структуру регистрационных записей. В него можно будет
записать новые файлы (см.
Подчиненные каталоги).
Читаем файл с дискеты
Ну а теперь попробуем пройти всю процедуру чтения файла (см.
"Алгоритмы выполнения типовых файловых операций"). Только чуть-чуть ее упростим - пусть на нашей дискете будет только один файл с именем NAME.TXT.
В корневом каталоге дискеты (физический диск А) нам нужно найти
соответствующую запись. Однако где ж его этот корневой каталог искать?
А корневой каталог следует сразу за областью FAT. На стандартной
дискете FAT занимает 18 секторов (две копии FAT по 9 секторов каждая)
и еще 1 сектор занимает загрузочная область (см. табл.5). Следовательно,
корневой каталог начинается с 20-го сектора. Но как нам найти этот
20-й сектор? Дискета читается следующим образом: сначала читается 0-я
дорожка, 0-я сторона, 1-й сектор (нумерация секторов начинается с
единицы). Затем 0-я дорожка, 0-я сторона, 2-й сектор и т.д. до 18-го
сектора. Затем читается 0-я дорожка, 1-я сторона, 1-й сектор, 2-й
сектор и т.д. до 18-го. Затем читается 1-я дорожка, 0-я сторона, 1-й
сектор, 2-й сектор и т.д. до 18-го и т.д. и т.п. Т.е. 20-й сектор у
нас будет на 0-й дорожке, 1-й стороне во втором секторе. Чтобы сразу
перейти к этому сектору в меню "Object" программы DiskEdit выберите
пункт "Phisical Sector" и укажите в поле "Cylinder" значение "0", в
поле "Side" значение 1, а в поле "Sector" значение 2 и нажмите Enter.
Вот вы и перешли в корневой сектор дискеты. Можете "декодировать"
находящуюся там информацию, используя
таблицу 2. Не забывайте
"переворачивать" байты, если данные занимают слово.
Теперь находим в корневом каталоге наш файл (NAME.TXT) и смотрим номер
начального кластера. Чтобы посмотреть сам файл, нужно посмотреть
цепочку FAT, которая начинается с этого кластера, т.е. перейти
непосредственно к этому кластеру, а затем посмотреть остальные
кластеры в цепочке. Обычно (хотя и не всегда) они следуют друг за
другом. Кластеры начинаются сразу за корневым каталогом. Корневой
каталог стандартной дискеты (1,4 МБ) занимает 14 секторов. 14+19=33.
Т.е. с 34 сектора у нас начинается область пользовательских данных
(подробности см. в "Вычисление номеров дорожки/поверхности/сектора").
Если нужный нам файл находится не в корневом каталоге, то сначала
находим номер начального кластера каталога, в котором находится файл.
Затем переходим в этот кластер и ищем там имя нужного файла. Смотрим
номер начального кластера для этого файла и т.д.
Вычисление номеров дорожки/поверхности/сектора
Этот метод я тоже придумал сам. Возможно, что где-нибудь в нем кроется
какая-нибудь ошибка. Если вы заметите какие-нибудь несоответствия -
большая просьба - сообщите
мне об этом.
Вычисление номеров дорожки/поверхности/сектора для дискеты по номеру начального кластера, который записан в элементах корневого каталога:
Номер дорожки (цилиндра):
где
целая часть числа
Т - номер дорожки;
N -
номер начального кластера, который лежит по смещению +1Аh (
см. табл.2);
С - количество секторов перед областью данных (для стандартной
дискеты С = 33);
S - количество секторов на дорожке;
Р - количество
рабочих поверхностей (для стандартной дискеты Р = 2). Единицу
вычитаем, потому что кластеры нумеруются с 0, а секторы - с 1.
Номер поверхности (стороны):
Если дробная часть числа Т меньше или равна 0,5, то кластер находится
на 0-й стороне, иначе кластер находится на первой стороне.
Номер сектора на дорожке:
Для 0-й стороны
X = (N + C - 1) - SPT
1
Для 1-й стороны
X = (N + C - 1) - SPT
1 - S
где
Х - номер сектора на дорожке
T1 (от 1 до S);
T1 - целая часть числа Т.
Пример:
N = 76Bh = 1899; C = 33; S = 18; P = 2. Тогда:
Номер дорожки (цилиндра):
Номер поверхности:
0,64 > 0,5, следовательно, данный кластер находится на 1-й стороне.
Номер сектора на дорожке:
X = (1899 + 33 - 1) - 18*2*53 - 18 = 1931 - 1926 = 5
Т.е. кластер номер 1899 начинается на 1-й стороне, 53-й дорожке, в 5-м секторе.
Соглашение об именах
Файлы и подчиненные каталоги в MS-DOS должны иметь имена, содержащие
не более 8 символов (английских букв, цифр и некоторых других символов),
и могут иметь расширение (а могут и не иметь), содержащее не более 3-х символов.
В ПОЛНОМ имени файла разрешается использовать только следующие символы:
A-Z 0-9 $ & # ~ ( ) - % ! _ ^
В ПОЛНОМ имени файла запрещается использовать все остальные символы!
ЗАПРЕЩАЕТСЯ В ПОЛНОМ имени файла использовать ПРОБЕЛ!
Примеры допустимых имен файлов:
Format.com, Read.me, MyFyle.txt, 28-03-96.doc, 123.45
Примеры НЕ допустимых имен файлов:
123456789.txt, aa?.doc, 35*.? It.F.doc, .txt