Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие - Файловые системы FAT

.pdf
Скачиваний:
94
Добавлен:
02.05.2014
Размер:
440.35 Кб
Скачать

МИНИСТЕРСТВО ПУТЕЙ СООБЩЕНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

Департамент кадров и учебных заведений

САМАРСКИЙ ИНСТИТУТ ИНЖЕНЕРОВ ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА ИМ. М.Т.ЕЛИЗАРОВА

Кафедра ИИС

Технологии доступа к данным в информационных системах

Часть I

Файловые системы FAT

САМАРА 2002

УДК 681.3

Методические указания Технологии доступа к данным в информационных сис-

темах: Файловые системы FAT. Часть I. — Самара: СамИИТ, 2002. – 26 с.

Утверждено на заседании кафедры ИСС 31.01.02 протокол № 6. Печатается по решению редакционно-издательского совета института.

Материал данной работы составляет цикл работ по технологиям доступа к данным. Описываются основные файловые системы, используемые семейством операционных систем Windows. Излагаются логические структуры файловых систем и методы работы с ними.

Материал предназначен для студентов, изучающих информатику и решающих задачи доступа к данным. Рекомендуется студентам специальностей “Информационные технологии” и “Микроинформационные управляющие системы”.

Составитель: Павлов Андрей Юрьевич, доцент кафедры ИСС, к.т.н.

Рецензенты: Тихомиров А.А. – доцент кафедры ВТ СамГТУ, к.т.н., доцент.

Чертыковцев В.К. — проректор по информатизации СамИИТа, д.т.н., профессор.

Редактор:

Шимина И.А.

Подписано в печать 19.03.02 Тираж 100 Заказ № 31

©СамИИТ, 2002

Введение

Информация в информационных системах (ИС) возникает в процессе обработки хранящихся данных. На компьютерах, используемых для создания ИС, данные хранятся на постоянном запоминающем устройстве (ПЗУ) в виде именованных последовательностей, называемых файлами. Хранение файлов подобно хранению книг в библиотеке, и для организации доступа к ним требуется специальная система, обеспечивающая минимизацию времени доступа и удобство работы.

Файловая система представляет совокупность служебных структур на носителе

исредств операционной системы, обеспечивающих манипуляцию файлами. (Исторически сложилось, что операционные системы семейства Windows развиваются в двух направлениях (Windows 95, Windows 98 и Windows Ме составляют одно направление, а Windows NT и Windows 2000 второе направление), предоставляющих различные средства для работы со служебными структурами и файлами).

Файловая система FAT (File Allocation Table) была разработана Биллом Гейтсом

иМарком МакДональдом в 1977 году и первоначально использовалась в операционной системе 86-DOS. Чтобы добиться переносимости программ из операционной системы CP/M в 86-DOS, в ней были сохранены ранее принятые ограничения на имена файлов. В дальнейшем 86-DOS была приобретена Microsoft и стала основой для ОС MS-DOS 1.0, выпущенной в августе 1981 года. Эта файловая система была изначально создана для обеспечения произвольного доступа к файлам на гибких дисках относительно небольшого размера.

Увеличение объема жестких магнитных дисков потребовало дополнения в служебных структурах файловой системы, и на смену FAT16 пришла FAT32. Эта файловая система позволила снять ограничения на объём доступного дискового пространства. Но, к сожалению, и FAT32 страдает от ограничений, которые делают её ненадежной и неспособной поддерживать диски и файлы большого объёма.

Физическая структура диска

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

Рис. 1. Дорожки (цилиндры)

Жесткие диски состоят из одной или более дисковых пластин, у которых для хранения используется одна или обе стороны. Данные записываются на магнитной поверхности стороны диска в виде концентрических окружностей, называемых дорожками (рис.1). Каждая дорожка состоит из нескольких секторов (рис.2). Размер сектора и их количество на дорожке задается при форматировании. Именно сектор является единицей разбиения дискового пространства.

Для доступа к сектору необходимо указать его местоположение на диске, т.е. его адрес. Это может делаться двумя способами. Первый из способов заключается в указании номера дорожки (иногда называемого номером цилиндра), номера стороны (головки), и номера сектора. Второй способ состоит в сквозной последовательной нумерации секторов от края диска к центру. Эта нумерация начинается с самой внешней дорожки 0, стороны 0, сектора 1 (нумерация дорожек и сторон начинается с 0, а секторов с 1), затем продолжается вдоль дорожки по нарастанию номеров секторов. После прохождения на дорожке сектора с наибольшим номером, следующим становится сектор с номером дорожки 0, номером стороны 1 и номером сектора 1, т.е. счет секторов продолжается по возрастанию сторон. Переход на следующую дорожку осуществляется не раньше, чем пронумерованы все сектора на всех сторонах текущей дорожки.

Рис. 2. Секторы и стороны (головки)

Чтобы уменьшить общее количество единиц хранения, за которыми должна следить файловая система, FAT и NTFS используют для выделения места под файлы объединение смежных секторов, называемое кластером (cluster) (Рис.2). Размер кластера является степенью двойки (1,2,4,8,16 и т.д.) и определяется размером тома при форматировании диска. Кластер представляет собой минимальное пространство, которое может занимать файл. Это приводит к тому, что часть пространства диска расходуется впустую. В состав операционной системы входят различные утилиты (DoubleSpace, DriveSpace), предназначенные для уплотнения данных на диске.

Логическая структура диска

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

Самый первый сектор жесткого диска (сектор 1, дорожка 0, головка 0) содержит так называемую главную загрузочную запись (Master Boot Record). Эта запись занимает не весь сектор, а только его начальную часть. Сама по себе главная загрузочная запись является программой. Эта программа во время начальной загрузки операционной системы с жесткого диска помещается в оперативную память по ад-

ресу 7C00:0000, после чего ей передается управление. Загрузочная запись продолжает процесс загрузки операционной системы.

Физический диск может быть разбит на части, которые рассматриваются как отдельные “логические” диски, иначе называемые разделами или томами. Достоинства разбиения диска заключаются в следующем:

В случае повреждения логического диска пропадает только та информация, которая находилась на этом логическом диске.

Реорганизация и выгрузка диска маленького размера проще

ибыстрее, чем большого.

Возможно разделение дискового пространства между отдельными пользователями персонального компьютера. Такая практика "коллективной" работы на персональном компьютере очень распространена.

При использовании специальных утилит для разбиения диска на части возможна установка для отдельных логических дисков защиты от записи. Вы можете записывать на такие диски неизменяющуюся информацию. Вред от программ-вирусов также будет меньше - вирус не сможет записать себя на защищенный диск.

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

Таблица разделов диска (Partition Table) располагается в конце самого первого сектора жесткого диска. Эта таблица содержит четыре элемента, описывающих максимально четыре раздела диска. В последних двух байтах сектора находится число 55AA. Это признак таблицы разделов.

Для просмотра и изменения содержимого таблицы разделов жесткого диска может использоваться специальная утилита, например, FDISK.

 

 

Первый сектор жесткого диска

Таблица 1

Смещение

Размер

Содержимое

 

(+0)

1BEh

Загрузочная запись - программа, которая загружается и

выполняется во время начальной загрузки операционной

 

 

системы

 

(+1Beh)

10H

Элемент таблицы разделов диска

 

(+1Ceh)

10H

Элемент таблицы разделов диска

 

(+1Deh)

10H

Элемент таблицы разделов диска

 

(+1Eeh)

10H

Элемент таблицы разделов диска

 

(+1Feh)

2

Признак таблицы разделов - 55AAh

 

Таблица разделов диска содержит записи размером 16 байтов, описывающих части диска, называемых разделами (логическими дисками или томами). В записи описаны границы раздела в терминах номеров сектора, дорожки и головки, там располагается информация о размере раздела в секторах и о назначении раздела.

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

Первый сектор диска имеет формат, представленный в таблице 1.

Все элементы таблицы разделов диска имеют одинаковый формат (таблица 2).

 

 

Формат элемента таблицы разделов

Таблица 2

Смещение

Размер

Содержимое

 

(+0)

1

Признак активного раздела:

 

0 – раздел не активный;

 

 

 

80h - раздел активный.

 

(+1)

1

Номер стороны для начального сектора раздела.

 

(+2)

2

Номер сектора и дорожки для начального сектора раздела в

формате функции чтения сектора INT 13h.

 

(+4)

1

Код системы (таблица 3).

 

(+5)

1

Номер стороны для последнего сектора раздела.

 

(+6)

2

Номер сектора и дорожки для последнего сектора раздела в

формате функции чтения сектора INT 13h.

 

(+8)

4

Относительный номер сектора начала раздела.

 

(+12)

4

Размер раздела в секторах.

 

Список возможных значений поля “Код системы” в элементе таблицы разделов диска на сегодняшний день может иметь значения, указанные в таблице 3. Кроме того, если раздел является отказоустойчивым (Fault Tolerant, FT), то Windows NT устанавливает старший бит этого поля в 1. Например, 87h для NTFS, или 86h для BIGDOS FAT формата. LBA является методом доступа к жесткому диску, базирующемся на расширенном прерывании INT13.

Возможные значения поля “Код системы” в элементе таблицы разделов Таблица 3

Значение

Смысл

 

 

0h

Неизвестная система.

01h

12-битовая FAT.

04h

16-битовая FAT.

05h

Расширенный раздел DOS

06h

32-битовая FAT (BIGDOS FAT).

07h

Разрешенные к установке файловые системы (Installable File System,

IFS), например: HPFS и NTFS.

 

0Bh

Первичный раздел Fat32 до 2047 GB.

0Ch

То же самое, что 0Bh, но c использованием LBA.

0Eh

То же самое, что 06h, но c использованием LBA.

0Fh

То же самое, что 05h, но c использованием LBA.

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

RelSect = (Cyl * Sect * Head) + (Head * Sect) + (Sect

-1)

В этой формуле:

Cyl - номер дорожки;

Sect - номер сектора на дорожке; Head - номер головки.

В самом первом секторе активного раздела расположена загрузочная запись (Boot Record), которую не следует путать с главной загрузочной записью (Master Boot Record). Загрузочная запись считывается в оперативную память главной загрузочной записью, после чего ей передается управление. Загрузочная запись выполняет загрузку операционной системы.

Таким образом, загрузка операционной системы с жесткого диска - двухступенчатый процесс. Вначале модули инициализации BIOS считывают главную загрузочную запись в память, и ей передается управление. Главная загрузочная запись просматривает таблицу разделов и находит активный раздел. Если активных разделов несколько, на консоль выводится сообщение о необходимости выбора активного раздела для продолжения загрузки.

После того как активный раздел найден, главная загрузочная запись считывает самый первый сектор раздела в оперативную память. Этот сектор содержит загрузочную запись, которой главная загрузочная запись и передает управление.

Загрузочная запись активного раздела выполняет загрузку операционной системы, находящейся в активном разделе.

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

Обычно разделы начинаются с четных номеров дорожек, за исключением самого первого раздела. Этот раздел может начинаться с сектора 2 нулевой дорожки (головка 0), так как самый первый сектор диска занят главной загрузочной записью.

Если в элементе таблицы разделов байт кода системы имеет значение 5, то в начале раздела, указанном в этом элементе, располагается сектор, содержащий таблицу логических дисков. Фактически эта таблица является расширением таблицы разделов диска, расположенной в самом первом секторе физического диска. Таблица логических дисков имеет формат, аналогичный таблице разделов диска, но имеет только два элемента. Один из них указывает на первый сектор логического диска DOS, он имеет код системы 1 или 4. Второй элемент может иметь код системы, равный 5 или 0. Если этот код равен 5, то элемент указывает на следующую таблицу логических дисков. Если код системы равен 0, то соответствующий элемент не используется.

Например, если диск разбит на три логических диска C, D и E, то таблицы могут выглядеть так, как показано на рис.3.

Таблица разделов диска

80h

01h

0100h

0Bh

FEh

BF7Dh

3F000000h

9C64BFh

00h

00h

817Eh

0Fh

FEh

7FBAh

FE649C00h

A0910100h

 

 

 

 

Таблица логического диска D

 

 

 

 

 

 

 

 

 

 

 

00h

01h

0100h

0Bh

0Fh

7F96h

3F000000h

51420600h

00h

00h

5846h

0Fh

0Fh

FF92h

30810C00h

A0910100h

 

 

 

 

Таблица логических дисков E

 

00h

01h

0100h

0Bh

0Fh

7F96h

3F000000h

51420600h

00h

00h

0000h

00h

00h

0000h

00000000h

00000000h

Рис.3. Таблицы разбиения диска

Из сказанного выше следует, что таблицы логических дисков связаны в список, на начало этого списка указывает элемент таблицы разделов диска с кодом системы, равным 5.

Для таблицы логических дисков имеется отличие в использовании полей границ логических дисков: если код системы равен 1 или 4, эти границы вычисляются относительно начала расширенного раздела; для элемента с кодом системы 5 используется абсолютная адресация (относительно физического начала диска).

Средства работы с MBR

Windows Me. В операционных системах (ОС) этого направления не существует простого способа доступа к MBR (для получения доступа нужно писать VXD-

драйвер или воспользоваться thunk). Чтобы все же получить доступ к MBR в этих ОС можно воспользоваться режимом эмуляции DOS, в котором выполняются прерывания. В этом случае можно использовать функции базовой структуры ввода/вывода (BIOS), например, Int 13 функцую 2 (абсолютное чтение секторов диска). Для этого случая, функция чтения таблицы разделов, описанная на языке Паскаль, может выглядит следующим образом:

procedure Partition_Table(var d:byte);

var

 

 

index:byte;

 

 

r:registers;

{структура регистров}

buffer:array[1..512] of byte;

{буфер}

offs:word;

{смещение}

 

boot:array[1..4] of byte; {смещ +0; длина 1 ;Флаг загрузки 0-неактивен, 80h-активен}

Hd_begin:array[1..4] of byte;

{смещ +1;длина 1 ;Начало раздела:номер головки }

Sec_Cyl_begin:array[1..4] of word;

{смещ +2;длина 2 ;Начало раздела:сектор/цилиндр корне-

вого сектора }

 

 

Sys_Indicator:array[1..4] of byte;

{смещ +4;длина 1 ;Код системы 4-FAT16}

Hd_end:array[1..4] of byte;

{смещ +5;длина 1 ;Конец раздела:номер головки}

Sec_Cyl_end:array[1..4] of word;

{смещ +6;длина 2 ;Конец раздела:сектор/цилиндр последне-

го сектора}

 

 

begin

 

 

r.ah:=$02;

{номер функции}

 

r.dl:=$80;

{1-й жесткий диск}

 

r.dh:=0;

{номер стороны}

 

r.ch:=0;

{номер дорожки}

 

r.cl:=1;

{номер сектора}

 

r.al:=1;

{количество секторов}

r.es:=seg(buffer);

r.bx:=ofs(buffer); intr($13,r);

if r.flags and 1 = 1 then begin halt(1);{Ошибка} end;

{Элементы раздела} Case index of 1:offs:=$1BE; 2:offs:=$1CE; 3:offs:=$1DE; 4:offs:=$1EE;

end;

writeln('Структура элементов раздела диска:'); writeln('Раздел № ',index); boot[index]:=buffer[offs+1];

write(' Флаг загрузки {0-неактивен, (128) 80h-активен}.....'); writeln(boot[index]);

write(' Начало раздела:номер головки:.....................'); Hd_begin[index]:=buffer[offs+2]; writeln(Hd_begin[index]);

write(' Начало раздела:сектор/цилиндр корневого сектора:..'); Sec_Cyl_begin[index]:=buffer[offs+3]; writeln(Sec_Cyl_begin[index]);

write(' Код системы:......................................'); Sys_Indicator[index]:=buffer[offs+5]; writeln(Sys_Indicator[index]);