Сделай Сам Свою Работу на 5

Структура корневого сектора

Таблица 4. Формат корневого сектора дискеты или раздела жесткого диска

Смещ. Длина Содержимое

 

00h JMP xx xx NEAR-переход на код загрузки
03h 'I' 'B' 'M'     '4' '.' '0' OEM-имя компании и версия системы
0Bh SectSiz число байтов в секторе (всегда 512) начало BPB
0Dh ClustSiz число секторов в кластере
0Eh ResSecs число резервных секторов (секторов перед FAT #1)
10h FatCnt число таблиц FAT
11h RootSiz число 32-байтовых элементов корневого каталога (для FAT32 - 0)
13h TotSecs общее число секторов на носителе (раздел DOS)
15h Media тип носителя информации (то же, что 1-й байт FAT)
16h FatSize число секторов в одной FAT конец BPB
18h TrkSecs     число секторов на дорожке
1Ah HeadCnt   число головок
1Ch HidnSec число скрытых секторов (исп. в схемах разделения)
20h TotSecs всего секторов, если размер >32 Мб
24h     физич.номер диска
25h     резерв
26h 29h   признак расшир.структуры
27h   ID тома(серийный номер)
2Bh Bh   метка (NO NAME)
36h   ID файловой системы (FAT12)
3Eh   начало кода и данных загрузки          

Замечания:

  1. Типы носителей информации:
    • F0h - гибкий диск, 2 стороны, 18 секторов на дорожке;
    • F8h - жесткий диск;
    • F9h - гибкий диск, 2 стороны, 15 секторов на дорожке;
    • FCh - гибкий диск, 1 стороны, 9 секторов на дорожке;
    • FDh - гибкий диск, 2 стороны, 9 секторов на дорожке;
    • FEh - гибкий диск, 1 сторона, 8 секторов на дорожке;
    • FFh - гибкий диск, 2 стороны, 8 секторов на дорожке.
  2. Используйте абсолютное чтение INT 25h (DX=0) для чтения этого сектора. ИЛИ:
    • гибкие диски: корневой сектор = BIOS INT 13h головка 0, дорожка 0, сектор 1;
    • жесткие: читайте Таблицу_разделов для получения BIOS головки/дорожки/сектора.
  3. BPB (BIOS Parameter Block) - подмножество данных, содержащихся в корневом_секторе. Запрос к драйверу 'Построить BPB' требует, чтобы драйвер заполнил блок, отмеченный выше. Длина BPB = 13 байт

Таблица параметров дискеты

Эта 10-байтовая структура известна также как "Disk Base Table". Она находится по адресу вектора прерывания INT 1Eh (4-байтовый адрес в 0:0078). Эта таблица задает некоторые важные переменные для устройств дискет. Ее инициализирует ROM-BIOS, а DOS модифицирует, чтобы улучшить производительность дискет.



Таблица 5. Формат таблицы параметров дискеты

Смещение Длина Содержимое
00h Первый байт спецификации: биты 0-3 - время загрузки головок; биты 4-7 - длительность шага головок
01h Второй байт спецификации: бит 0 - флаг режима ПДП; биты 1-7 - время загрузки головок
02h Задержка перед отключением мотора (в "тиках" ситемных часов)
03h Размер сектора (байт): 0 - 128, 1 - 256, 2 - 512, 3 - 1024
04h Число секторов на дорожке
05h Длина межсекторного промежутка для операций чтения/записи
06h Длина области данных
07h Длина межсекторного промежутка для операции форматирования
08h Символ-заполнитель для форматирования (обычно 0F6h, т.е. 'Ў')
09h Время установки головок (в миллисекундах)
0Ah Время запуска мотора (в 1/8 с)

Таблица параметров жесткого диска

Эта 16-байтовая структура находится по адресу вектора прерывания INT 41h (4-байтовый адрес в 0:0104). Параметры для второго жесткого диска (если он есть) находятся по адресу вектора INT 46h. Эти таблицы задают некоторые важные переменные для операций с твердыми дисками.

Таблица 6. Формат таблицы жесткого диска

Смещение Длина Содержимое
00h Число цилиндров
02h Число головок
03h Не используется (всегда 0)
05h Номер начального цилиндра предкомпенсации
07h Максимальная длина блока коррекции ошибок ECC
08h Байт контроля: биты 0-2 - не используются (всегда 0); бит 3 - установлен, если число головок больше 8; бит 4 - не используется (всегда 0); бит 5 - установлен, если изготовитель разместил карту дефектов на цилиндре с номером "максимальный рабочий цилиндр + 1"; бит 6 - запрет повторного контроля ECC; бит 7 - запрет контроля ECC
09h Не используется (всегда 0)
0Ah Не используется (всегда 0)
0Bh Не используется (всегда 0)
0Ch Номер цилиндра зоны парковки
0Eh Число секторов на дорожке
0Fh Резерв

Таблица распределения файлов (FAT)

Размер файла может изменяться со временем. Если допустить хранение файла только в смежных секторах, то при увеличении размера файла ОС должна полностью переписать его в другую подходящего объема (свободную) область диска. Чтобы упростить и ускорить выполнение операции добавления новых данных в файл, в современных ОС применяются таблицы распределения файлов (File Allocation Table, сокращенно FAT), которые позволяют хранить файл в виде нескольких несмежных участков.

При использовании FAT область данных логического диска разделена на участки одинакового размера - кластеры. Кластер может состоять из одного или нескольких последовательно расположенных на диске секторов. Число секторов в кластере должно быть кратным 2N и может принимать значения от 1 до 64 (размер кластера зависит от типа используемой FAT и объема логического диска).

Каждому кластеру поставлен в соответствие собственный элемент таблицы FAT. Первые два элемента FAT являются резервными - если на диске имеется K кластеров данных, то число элементов FAT будет равно K+2. Тип FAT определяется значением K:

  1. если K<4085 - используется FAT12;
  2. если 4084>K<65525 - используется FAT16;
  3. если 65524>K - используется FAT32.

Название типов FAT происходят от размера элемента. Так элемент FAT12 имеет размер 12 бит, FAT16 - 16 бит, FAT32 - 32 бита. Следует учитывать, что в FAT32 четыре старших двоичных разряда зарезервированы и игнорируются в процессе работы ОС (то есть значащими являются только семь младших шестнадцатеричных разрядов элемента).

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

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

Эта диаграмма иллюстрирует основные концепции FAT. Из нее видно, что:

  1. MYFILE.TXT занимает 10 кластеров. Первый кластер - это кластер 08, последний кластер - 1Bh. Цепочка кластеров - 08h, 09h, 0Ah, 0Bh, 15h, 16h, 17h, 19h, 1Ah, 1Bh. Каждый элемент указывает на следующий элемент цепочки, а последний элемент содержит специальный код (см. табл. 7).
  2. Кластер 18h помечен как дефектный и не входит в цепочку распределения.
  3. Кластеры 06h, 07h, 0Ch-14h и 1Ch-1Fh пусты и доступны для распределения.
  4. Еще одна цепочка начинается с кластера 02h и кончается кластером 05h. Чтобы узнать имя файла, нужно отыскать элемент оглавления с начальным номером кластера 02h.

Таблица 7. Значения элементов FAT

Значение FAT12 FAT16 FAT32
Свободный кластер
Зарезервированный кластер FF0h-FF6h FFF0h-FFF6h FFFFFF0h-FFFFFF6h
Дефектный кластер FF7h FFF7h FFFFFF7h
Конец цепочки распределения FF8h-FFFh FFF8h-FFFFh FFFFFF8h-FFFFFFFh
Номер кластера следующего элемента в цепочке 002h-FEFh 0002h-FFEFh 0000002h-FFFFFEFh

FAT обычно начинается с логического сектора 1 в разделе DOS (т.е. ее можно прочитать по INT 25h с DX=1). В общем случае сначала надо прочитать корневой_сектор (DX=0) и взять смещение 0Eh. Там указано, сколько корневых и резервных секторов стоят перед FAT. Используйте затем это число (обычно 1) как содержимое DX, чтобы прочитать FAT через INT 25h.

Может существовать несколько копий FAT. Обычно поддерживаются две идентичных копии. В этих случаях все копии расположены непосредственно друг за другом.

Замечание:

  • По общему заблуждению считается, что 16-битовая FAT не позволяет DOS работать с дисками, большими 32 мегабайт. На самом деле, ограничивает то, что INT 25h/26h неспособно работать с СЕКТОРАМИ, номера которых больше 65535. Поскольку размер сектора обычно 512 байт, или половина килобайта, то это диктует 32-мегабайтовый лимит. С другой стороны, ничто не запрещает вам иметь секторы большего размера, так что теоретически DOS может работать с любыми дисками.

Чтобы прочитать любой элемент FAT (следуя по цепочке), сначала прочитайте в память всю FAT и получите из оглавления начальный номер кластера. Затем, в случае FAT12:

  1. Умножьте номер кластера на 3.
  2. Разделите результат на 2 (длина элемента - 1.5 (3/2) байт).
  3. Прочитайте из FAT 16-разрядное слово, используя в качестве адреса результат предыдущей операции.
  4. Если номер элемента четный, выполните операцию AND над считанным словом и маской 0FFFh. Если номер элемента нечетный, сдвиньте значение вправо на 4 бита. В результате получите искомое значение элемента FAT.

Теперь рассмотрим порядок действий при записи элемента в FAT12.

  1. Умножьте номер кластера на 3.
  2. Разделите результат на 2 (длина элемента - 1.5 (3/2) байт).
  3. Прочитайте из FAT 16-разрядное слово, используя в качестве адреса результат предыдущей операции.
  4. Если номер элемента четный, выполните операцию AND над считанным словом и маской 0F000h, а затем операцию OR над полученным результатом и значением записываемого элемента. Если номер элемента нечетный, выполните операцию AND над считанным словом и маской 0F000h, а затем сдвиньте значение влево на 4 бита и выполните операцию OR с результатом предыдущей операции.
  5. Запишите полученное 16-разрядное слово обратно в FAT.

Замечание:

  • 12-битовый элемент может пересекать границы двух секторов, так что будьте внимательны, если считываете по одному сектору FAT.
    16-битовые элементы проще - каждый элемент содержит 16-битовое смещение (от начала FAT) следующего элемента в цепочке.
    32-битовые элементы - каждый элемент содержит 32-битовое смещение следующего элемента в цепочке.

В программах, написанных на ассемблере, для выполнения умножения на 3 вместо команды MUL часто применяется алгоритм "сдвиг и сложение": исхродное число копируется, над копией числа выполняется сдвиг влево на один разряд (умножение на 2), а затем оба числа складываются (x + 2x = 3x). Вместо команды DIV используется сдвиг вправо на один разряд.

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

Дискета (или раздел твердого диска) структурирована следующим образом:

  1. корневой и резервные секторы;
  2. FAT #1;
  3. FAT #2;
  4. корневой каталог (не существует в FAT32);
  5. область данных.

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

Чтобы получить номер начального сектора кластера из номера кластера ClustNum (считанный из соответствующего поля в элементе каталога или в цепи FAT ), вы можете использовать недокументированную функцию ОС 32h или прочитать корневой сектор и применить следующие формулы:

корневых_секторов = (RootSiz * 32) / 512

начало_данных = ResSecs + (FatSize * FatCnt) + корневых_секторов

нач_сектор = начало_данных + ((ClustNum - 2) * ClustSiz),

где значения переменных: RootSiz, ResSecs, FatSize, FatCnt, ClustSiz извлекаются из корневого сектора или из BPB (см. табл.4).

Установите DX=нач_сектор перед операцией чтения INT 25h или записи INT 26h.

Каталоги файлов

Каталог файлов представляет собой массив 32-байтных элементов - описателей файлов. С точки зрения операционной системы все каталоги (кроме корневого каталога в системах FAT12 и FAT16) выглядят как файлы и могут содержать произвольное количество записей.

Корневой каталог (Root Directory) - это главный каталог диска, с которого начинается дерево подкаталогов. Для корневого каталога в FAT12 и FAT16 в системной области логического диска выделено специальное место фиксированного размера (16 Кбайт), рассчитанное на хранение 512 элементов. В системе FAT32 корневой каталог является файлом произвольного размера.

Таблица 8. Структура элемента каталога

Смещение Длина Содержимое
00h Короткое имя файла
0Bh Атрибуты файла
0Сh *Зарезервировано под Windows NT (должно содержать 0)
0Dh *Поле, уточняющее время создания файла (в десятках миллисекунд). Значение поля может находиться в пределах от 0 до 199
0Eh *Время создания файла
10h *Дата создания файла
12h *Дата последного обращения к файлу для записи или считывания данных
14h *Старшее слово номера первого кластера файла
16h Время выполнения последней операции записи в файл
18h Дата выполнения последней операции записи в файл
1Ah Младшее слово номера первого кластера файла
1Ch Размер файла в байтах (32-разрядное число)

Знак "*" означает, что поле обрабатывается только в файловой системе FAT32. В системах FAT12 и FAT16 поле считается зарезервированным и содержит значение 0.

Короткое имя файла состоит из двух полей: 8-байтного поля, содержащего собственно имя файла, и 3-байтного поля, содержащего расширение. Если введенное пользователем имя файла короче восьми символов, то оно дополняется пробелами (код пробела - 20h), если введенное расширение короче трех символов, то оно также дополняется пробелами.

Некоторые функции DOS требуют в качестве параметра байт атрибутов файла. Разряды байта атрибутов устанавливаются в 1 в том случае, если у файла имеется соответствующее свойство:

· бит 0 - только для чтения;

· бит 1 - скрытый;

· бит 2 - системный;

· бит 3 - идентификатор тома;

· бит 4 - каталог;

· бит 5 - архивирован;

· биты 6 и 7 - резерв (установлены в 0).

Поле времени создания файла и поле времени выполнения последней операции записи в файл имеют следующий формат:

Час Минута Секунда/2

 

"Секунда/2" означает двухсекундный отсчет (допустимо значение от 0 до 29).

Поле даты создания файла, поле даты последного обращения к файлу и поле даты последней записи в файл имеют следующий формат:

Год Месяц День

 

При создании файлов отсчет дат ведется от начала эпохи MS-DOS, т.е. от 01.01.1980. Биты 9-15 содержат номер года минус 1980 (допустимо значение от 0 до 127).

Длинные имена файлов

Начиная с Windows 95 файлу можно присвоить (в дополнение к короткому имени) так называемое длинное имя. Для хранения длинного имени используются пустые элементы каталога, смежные с основным элементом - описателем файла. Наличие единиц в разрядах 0-3 байта атрибутов является признаком того, что свободный элемент каталога используется для хранения участка длинного имени файла (для описателей файлов и каталогов такое сочетание невозможно). Короткое и длинное имена файла являются уникальными, т.е. не должны встречаться дважды в одном каталоге.

Длинное имя записывается не ASCII-символами, а в формате Unicode, где каждому национальному алфавиту соответствует набор кодов. Расплатой за универсальность Unicode является снижение плотности хранения информации - каждый символ занимает два байта (16-разрядное слово). В пустые элементы каталога длинное имя записывается в разрезанном на кусочки виде (см. табл.9).

Таблица 9. Структура элемента каталога, хранящего фрагмент длинного имени файла

Смещение Длина Содержимое
00h Номер фрагмента
01h Первый участок фрагмента имени
0Bh Атрибуты файла
0Ch Байт флагов
0Dh Контрольная сумма короткого имени
0Eh Второй участок фрагмента имени
1Ah Номер первого кластера (должен быть равен 0)
1Ch Третий участок фрагмента имени

Длинное имя записывается в каталог первым, причем фрагменты размещены в обратном порядке, начиная с последнего:

(Начало каталога)
 
 
Последний фрагмент длинного имени
***
Второй фрагмент длинного имени
Первый фрагмент длинного имени
Стандартный описатель файла
***
 
(Конец каталога)

Все каталоги, за исключением корневого, содержат в двух первых элементах вместо описателей файлов специальные ссылки. В элементе № 0 размещается указатель на сам каталог, а в поле имени находится одна точка ("."). В элементе № 1 размещается указатель на родительский каталог , а в поле имени находятся две точки (".."). Если ссылка на таблицу FAT у элемента № 1 имеет нулевое значение, то текущий каталог находится в корневом каталоге.

Блок информации диска формируется НЕДОКУМЕНТИРОВАННОЙ функцией DOS 32h.

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

Таблица 10. Схема блока информации диска

Смещение Длина Содержимое
00h Номер диска (0=A, 1=B и т.д.)
01h Номер субустройства из заголовка устройства (один драйвер может управлять несколькими дисками)
02h Размер сектора в байтах
04h Число секторов на кластер -1 (максим. сектор в кластере)
05h Сдвиг кластера в сектор (кластер = 2№ секторов) (секторов на кластер в степенях двойки: 2 для 4, 3 для 8)
06h Число резервных секторов (корневые, начало корневого огл.) (N первого сектора FAT)
08h Число таблиц FAT
09h Макс. число элементов в корневом оглавлении
0Bh Номер сектора для кластера №2 (1-й кластер данных)
0Dh Всего кластеров +2 (наивысший номер кластера)
0Fh Число секторов, занимаемое одной FAT
10h Номер сектора начала корневого оглавления
12h Адрес заголовка_устройства
16h Байт дескриптора_носителя
17h Флаг доступа: 0, если был доступ к устройству
18h Адрес следующего блока информации диска (0FFFFh, если блок - последний)

Битовые флаги режима открытия:

1. 0-2: Права доступа процесса в сети
000 - чтение; 001 - запись; 010 - чтение и запись.

2. 4-6: Режим разделения:
000 - режим совместимости
001 = монопольный захват файла
010 = отвергать запись
011 = отвергать чтение
100 = ничего не отвергать

3. 7: Наследование:
1 - файл приватный для этого процесса 0 - наследуется порожденными процессами

Если байт атрибутов файла индицирует только чтение, он перекрывает эти флаги.

Биты прав доступа в сети и режима разделения имеют эффект только в том случае, когда установлена программа SHARE.



©2015- 2017 stydopedia.ru Все материалы защищены законодательством РФ.