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

AOM / Tannenbaum

.pdf
Скачиваний:
93
Добавлен:
17.05.2015
Размер:
5.64 Mб
Скачать

Примеры операционных систем

493

ны. («Сборка мусора» — это автоматическое удаление неиспользуемых структур данных.) «Куча» в NT сходна с функцией malloc в системах UNIX, но в NT, в отличие от UNIX, может быть несколько независимых «куч».

Примеры виртуального ввода-вывода

Основной задачей любой операционной системы является предоставление служб для пользовательских программ. Главным образом, это службы ввода-вывода для чтения и записи файлов. И UNIX, и NT предлагают широкий спектр служб вводавывода. Для большинства системных вызовов UNIX в NT имеется эквивалентный вызов, но обратное не верно, поскольку NT содержит гораздо больше вызовов и каждый из них гораздо сложнее соответствующего вызова в UNIX.

Виртуальный ввод-вывод в системе UNIX

Система UNIX пользовалась большой популярностью во многом благодаря своей простоте, которая, в свою очередь, является прямым результатом организации системы файлов. Обычный файл представляет собой линейную последовательность 8-битных байтов1 от 0 до максимум 232-1 байтов. Сама операционная система не сообщает структуру записей в файлах, хотя многие пользовательские программы рассматривают текстовые файлы в коде ASCII как последовательности строк, каждая из которых завершается переводом строки.

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

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

Основные системные вызовы для файлов в UNIX приведены в табл. 6.9. Вызов creat (без е на конце) используется для создания нового файла. В настоящее время он не является обязательным, поскольку вызов open тоже может создавать новый файл. Вызов unlink удаляет файл (предполагается, что файл находится только в однойдиректории).

Вызов open используется для открытия существующих файлов, а также для создания новых. Флаг mode сообщает, как его открыть (для чтения, для записи и т. д.). Вызов возвращает небольшое целое число, которое называется дескриптором файла. Дескриптор файла определяет файл в последующих вызовах. Сам про-

1Для многих сейчас слова про 8-битные байты могут показаться странными, однако на самом деле раньше байт мог быть и 5-битным, и 7-битным, и 8-битным. Теперь мы по умолчанию считаем байт состоящим из 8 битов. — Примеч. научн. ред.

4 9 4 Глава 6. Уровень операционной системы

цесс ввода-вывода осуществляется с помощью процедур read и write, каждая из которых содержит дескриптор файла (он указывает, какой файл использовать), буфер для данных и число байтов, которое сообщает, какое количество данных нужно передать. Вызов Iseek используется для перемещения указателя файла, что делает возможным случайный доступ к файлам.

Stat выдает информацию о файле (размер, время последнего доступа, имя владельца и т. п.). Chmod изменяет режим защиты файла (например, разрешает или, наоборот, запрещает каким-нибудь пользователям читать его). Наконец,fcntl выполняет различные действия над файлами, например блокирование и разблокирование.

Таблица 6.9. Основные системные вызовы UNIX

Системный вызов Значение

creat(name, mode)

 

Создает файл; mode определяет тип защиты

unlink(name)

Удаляет файл (предполагается, что есть только 1 связь)

open(name, mode)

 

Открывает или создает файл и возвращает дескриптор файла

close(fd)

 

Закрывает файл

read (fd, buffer, count)

Считывает байты в количестве count в buffer

write(fd, buffer, count)

Записывает в файл count байтов из buffer

lseek(fd, offset, w)

 

Перемещает указатель файла на offset и w

stat(name, buffer)

 

Возвращает информацию о файле

chmod(name, mode)

 

Изменяет тип защиты файла

fcntl(fd,cmd,j)

 

Производит различные операции управления (например, блокирует

 

 

файл или его часть)

В листинге 6.3 показано, как происходит процесс ввода-вывода. Эта программа минимальна и не включает в себя проверку ошибок. Перед тем как войти в цикл, программа открывает существующий файл data и создает новый файл newf. Каждый вызов возвращает дескриптор файла infd и outfd соответственно. Следующий параметр в обоих вызовах — биты защиты, которые определяют, что файлы нужно считать и записать соответственно. Оба вызова возвращают дескриптор файла. Если неудалосьпроизвестиopenилиcreat,товозвращаетсяотрицательныйдескриптор файла, который сообщает, что вызов не удался.

Листинг 6.3. Фрагмент программы для копирования файла с использованием системных вызовов UNIX. Этот фрагмент написан на языке С, поскольку в языке Java не показываются системные вызовы низкого уровня, а нам нужно их показать

/* Открытие дескрипторов файла. */ infd = openC'data", 0);

outfd = creat("newf", ProtectionBits); /* Цикл копирования. */

do{

count = readCinfd. buffer, bytes);

if (count > 0) write(outfd, buffer, count): } while (count > 0):

/* Закрытие файлов.*/ close(infd): ciose(outfd);

Примеры операционных систем

495

Вызов read имеет три параметра: дескриптор файла, буфер и число байтов. Данный вызов должен считать нужное число байтов из указанного файла в буфер. Число считанных байтов помещается в count. Count может быть меньше, чем bytes, если файл был слишком коротким. Вызов write копирует считанные байты в выходной файл. Цикл продолжается до тех пор, пока входной файл не будет прочитан полностью. Тогда цикл завершается, а оба файла закрываются.

Дескрипторы файлов в системе UNIX представляют собой небольшие целые числа (обычно до 20). Дескрипторы файлов 0, 1 и 2 соответствуют стандартному

вводу, стандартномувыводуи стандартнойошибке соответственно. Обычно первый из них обращается к клавиатуре, а второй и третий — к дисплею, но пользователь может перенаправить их к файлам. Многие программы UNIX получают входные данные из стандартного устройства ввода и записывают выходные данные в стандартное устройство вывода. Такие программы называются фильтрами.

С системой файлов тесно связана система директорий. Каждый пользователь может иметь несколько директорий, а каждая директория может содержать файлы и поддиректории. Система UNIX обычно конфигурируется с главной директорией, так называемым корневым каталогом, который содержит поддиректории bin (для часто используемых программ), dev (для специальных файлов устройств вво- да-вывода), lib (для библиотек) и usr (для пользовательских директорий, как показано на рис. 6.27). В нашем примере директория usrсодержит поддиректории ast и jim. Директория ast включает в себя два файла (data и/оо.с) и поддиректорию bin, в которую входят 4 игры.

Чтобы назвать файл, нужно указать его путь из корневого каталога. Путь содержит список всех директорий от корневого каталога к файлу, для разделения директорий используется слэш. Например, путь к файлу game2 будет таким: /usr/ ast/bin/game2. Путь, который начинается с корневого каталога, называется абсо-

лютным путем.

В каждый момент времени каждая работающая программа имеет текущий каталог. Путь может быть связан с текущим каталогом. В этом случае в начале пути слэш не ставится (чтобы отличить такой путь от абсолютного пути). Такой путь называется относительным путем. Если /usr/ast — текущий каталог, то можно получить доступ к файлу game3, используя путь bin/game3. Пользователь может создать связь с чужим файлом, используя для этого системный вызов link. В нашем примере пути /usr/ast/bin/game3 и /usr/jim/jotto приводят к одному и тому же файлу. Не разрешается применять связи к директориям, чтобы предотвратить циклы в системе директорий. Вызовы open и creat используют и абсолютные, и относительные пути.

Основные вызовы для оперирования с директориями в системе UNIX приведены в табл. 6.10. Mkdir создает новую директорию, a rmdir удаляет существующую пустую директорию. Следующие три вызова применяются для чтения элементов директорий. Первый открывает директорию, второй считывает элементы из нее, а третий закрывает директорию. Chdir изменяет текущую директорию.

Link создает элемент директории, который указывает на уже существующий файл. Например, элемент /usr/jim/jotto можно создать с помощью вызова

Iink("/usr/ast/bin/game3", "/usr/jim/jotto")

или с помощью эквивалентного вызова, используя относительные пути, которые зависят от текущей директории. Unlink удаляет элемент директории. Если файл

496 Глава 6. Урсень операционной системы

имеет только одну связь, он удаляется. Если он имеет две и более связей, то он не удаляется. Не имеет никакого значения, была ли удаленная связь изначально созданной, или это копия. Вызов

unlink("/usr/ast/bin/game3")

делает файл game3 доступным только через путь /usr/jim/jotto. Вызовы link и unlink могут использоваться для перемещения файлов из одной директории в другую.

Корневой

каталог

Файлы данных

Рис. 6.27. Часть системы директорий в операционной системе UNIX

Примеры операционных систем

497

С каждым файлом (а также с каждой директорией, поскольку директория — это тоже файл) связано битовое отображение, которое сообщает, кому разрешен доступ к этому файлу. Отображение содержит три поля RWX (Read, Write, eXecute — чтение, запись, выполнение). Первое из них контролирует разрешение на чтение, запись и выполнение файлов для их владельца, второе — для других пользователей из группы владельца, а третье — для любых пользователей. Поля RWX R-X —X означают, что владелец файла может читать этот файл, записывать что-либо в него ивыполнятьего (очевидно, файлявляетсявыполняемойпрограммой, иначенебыло бы разрешения на его выполнение), другие члены группы могут читать и выполнять его, а посторонние люди — только выполнять. Таким образом, посторонние люди могут использовать эту программу, но не могут ее украсть (скопировать), поскольку им запрещено чтение. Отнесение пользователей к тем или иным группам осуществляется системным администратором, которого обычно называют привилегированнымпользователем. Привилегированныйпользовательимеетправодействовать вопреки механизмузащиты и считывать, записывать и выполнять любой файл.

Таблица6.10.Основныевызовыдляработысдиректориями всистемеUNIX

Системный вызов

Значение

mkdir(name, mode)

Создает новую директорию

rmdir(name)

Удаляет пустую директорию

Opendir(name)

Открывает директорию для чтения

readdir(dirpointer)

Читает следующий элемент директории

Closedir(dirpointer)

Закрывает директорию

chdir(dirname)

Изменяет текущий каталог на dirname

Iink(name1, name2)

Создает элемент директории пате2, указывающий на пате 1

unlink(name)

Удаляет пате из директории

Теперь рассмотрим, как файлы и директории реализованы в системе UNIX. Более детальное описание см. в [152]. С каждым файлом (и с каждой директорией, поскольку директория — это тоже файл) связан блок информации в 64 байта, который называется индексным дескриптором (i-node). I-node сообщает, кто владеет файлом, что разрешено делать с файлом, где найти данные и т. п. Индексные дескрипторы для файлов расположены или последовательно в начале диска, или, если диск разделен на группы цилиндров, — в начале цилиндра. Индексные дескрипторы снабжены последовательными номерами. Таким образом, система UNIX может обнаружить i-node просто путем вычисления его адреса на диске.

Элемент директории состоит из двух частей: имени файла и номера индексного дескриптора. Когда программа выполняет команду

openC'foo.c", 0),

система ищет текущий каталог для файла «foo.c», чтобы найти номер индексного дескрипторадля этого файла. Обнаружив номер индексногодескриптора, программа может считать его и узнать всю информацию об этом файле.

При большей длине пути файла основные шаги, изложенные выше, повторяются несколько раз, пока не будет пройден весь путь. Например, чтобы найти номер индексного дескриптора для пути /usr/ast/data, система сначала ищет корне-

498 Глава 6. Уровень операционной системы

вой каталог для элемента usr. Обнаружив индексный дескриптор для usr, она может прочитать этот файл (директория в системе UNIX — это тоже файл). В этом файле она ищет элемент ast и находит номер индексного дескриптора для файла /usr/ast. Считав информацию о местонахождении директории /usr/ast, система может обнаружить элемент для data и, следовательно, номер индексного дескриптора для /usr/ast/data. Найдя номер индексного дескриптора для этого файла, система может узнать все об этом файле.

Формат, содержание и размещение индексных дескрипторов несколько различаются в разных системах (особенно когда идет речь о сети), но следующие характеристики присущи практически каждому дескриптору:

1.Тип файла, 9 битов защиты RWX и некоторые другие биты.

2.Число связей с файлом (число элементов директорий).

3.Идентификатор владельца.

4.Группа владельца.

5.Длина файла в байтах.

6.Тринадцать адресов на диске.

7.Время, когда файл читали в последний раз.

8.Время, когда последний раз производилась запись в файл.

9.Время, когда в последний раз менялся индексный дескриптор.

Типы файлов бывают следующие: обычные файл, директории и два вида особых файлов для устройств ввода-вывода с блочной структурой и неструктурированных устройств ввода-вывода соответственно. Число связей и идентификатор владельца мы уже обсуждали. Длина файла выражается 32-битным целым числом, которое показывает самый старший байт файла. Вполне возможно создать файл, перенести указатель на позицию 1 000 000 и записать 1 байт. В результате получится файл длиной 1 000 001. Тем не менее этот файл не требует сохранения всех отсутствующих байтов.

Первые 10 адресов на диске указывают на блоки данных. Если размер блока — 1024 байта, то можно работать с файлами размером до 10 240 байтов. Адрес 11 указывает на блок косвенной адресации, который содержит 256 адресов диска. Здесь можно работать с файлами размером до 10 240+256x1024=272 384 байта. Для файлов еще большего размера существует адрес 12, который указывает на 256 блоков косвенной адресации. Здесь допустимый размер файлов составляет 272384+256x256x1024=67 381 248 байтов. Если и эта схема блока двойной кос- - венной адресации слишком мала, то используется адрес 13. Он указывает на блок тройной косвенной адресации, который содержит адреса 256 блоков двойной косвенной адресации. Используя прямую, косвенную, двойную косвенную и тройную косвенную адресацию, можно обращаться к 16 843 018 блокам. Это значит, что максимально возможный размер файла составляет 17 247 250 432 байта. Поскольку размер указателей файлов ограничен до 32 битов, реальный верхний предел на размер файла составляет 4 294 967 295 байтов. Свободные блоки диска хранятся в связном списке. Если нужен новый блок, он берется из списка. В результате получается, что блоки каждого файла беспорядочно раскиданы по всему диску.

Примеры операционных систем

499

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

Зная все это, мы теперь можем рассмотреть, как происходит процесс ввода-вы- вода. Open заставляет систему искать директории по определенному пути. Если поиск успешен, то индексный дескриптор считывается во внутреннюю таблицу. Вызовы read и write требуют, чтобы система вычислила номер блока из текущей позиции файла. Адреса первых 10 блоков диска всегда находятся в основной памяти (в индексном дескрипторе); для остальных блоков сначала требуется считать один или несколько блоков косвенной адресации. Lseek просто меняет текущую позицию указателя и не производит никакого ввода-вывода.

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

Виртуальныйввод-выводвWindowsNT

NT поддерживает несколько файловых систем, самые важные из которых — NTFS (NTFileSysytem —файловаясистемаWindows NT)иFAT(FileAllocationTable — таблица размещения файлов). Первая была разработана специально для NT. Вторая является старой файловой системой для MS-DOS, которая также используется в Windows 95/98 (хотя и с длинными именами файлов). Поскольку система FAT устарела, ниже мы рассмотрим только файловую систему NTFS. FAT32 начала использоваться с NT 5.O. Она подерживалась и в более позних версиях Windows 95

иWindows 98.

Вфайловой системе NT длина имени файла может быть до 255 символов. Имена файлов написаны в коде Unicode, благодаря чему люди в разных странах, где не используется латинский алфавит, могут писать имена файлов на их родном языке. В файловой системе NT заглавные и строчные буквы в именах файлов считаются разными (то есть foo отличается от FOO). К сожалению, в системе Win32 API заглавные и строчные буквы в именах файлов и директорий не различаются, поэтому это преимущество теряется для программ, которые используют Win32.

Как и в системе UNIX, файл представляет собой линейную последовательность байтов, максимальная длина 2м -1. Указатели тоже существуют, но их длина не 32, а 64 бита, чтобы можно было поддерживать максимальную длину файла. Вызовы функций в Win32 API для манипуляций с директориями и файлами в целом схожи с вызовами функций в системе UNIX, но большинство из них имеют больше

500 Глава 6. Уровень операционной системы

параметров, и модель защиты другая. При открытии файла возвращается идентификатор (handle), который затем используется для чтения и записи файла. В отличие от системы UNIX, идентификаторы не являются маленькими целыми числами, а стандартный ввод, стандартный вывод и стандартная ошибка не определяются заранее как 0,1 и 2 (исключение составляет пультовый режим работы). Основные функции Win32 API для управления файлами приведены в табл. 6.11.

Таблица 6 . 11 . Основные функции Win32 API для ввода-вывода файлов. Во второй колонке дается эквивалент из UNIX

Функция API

UNIX

Значение

CreateFile

open

Создает файл или открывает существующий файл; возвращает

 

 

идентификатор

DeleteFile

unlink

Удаляет существующий файл

CloseHandle

close

Закрывает файл

ReadFile

read

Считывает данные из файла

WriteFile

write

Записывает данные в файл

SetFilePointer

Iseek

Устанавливает указатель файла на определенное место в файле

SetFileAttributes

stat

Возвращает свойства файла

LockFile

Fcntl

Блокирует область файла, чтобы обеспечить взаимное исключение

 

 

доступа

UnlockFile

Fcntl

Снимает блокировку с ранее заблокированной области файла

Рассмотрим эти вызовы. CreateFile используется для создания нового файла и возвращает идентификатор (handle) для него. Эта функция применяется и для открытия уже существующего файла, поскольку в системе API нет функции open. Мы не будем приводить параметры функций API, поскольку их очень много. Например, CreateFile имеет семь параметров:

1.Указатель на имя файла, который нужно создать или открыть.

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

3.Флаги, которые сообщают, могут ли несколько процессов открывать файл одновременно.

4.Указатель на дескриптор безопасности, который сообщает, кто имеет доступ к файлу.

5.Флаги, которые сообщают, что нужно делать, если файл существует или не существует.

6.Флаги, связанные с атрибутами архивации, компрессии и т. д.

7.Идентификатор файла (handle), атрибуты которого нужно клонировать для нового файла.

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

Используя эти функции API, можно написать процедуру для копирования файла, аналогичную процедуре в листинге 6.3. Такая процедура (без проверки оши-

Примеры операционных систем

50 1

бок) приведена в листинге 6.4. На практике программу для копирования файла писать не нужно, поскольку существует функция CopyFile.

Листинг 6.4. Фрагмент программы для копирования файла с применением функции API из системы Windows NT. Фрагмент написан на языке С, язык Java не показывает системные вызовы низкого уровня,

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

/* Открытие файлов для ввода и вывода. */

 

 

inhandle - CreateFileCdata". GENERIC_READ. 0,

NULL.

OPENJXISTING, 0. NULL);

outhandle = CreateFileC'newF. GENERIC.WRITE. 0.

NULL. CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL.

NULL);

 

 

/* Копирование файла. */ do{

s = ReadFiIe(inhandle. buffer. BUF_SIZE. «count. NULL);

if (s > 0 && count > 0) WriteFile(outhandle, buffer, count. Socnt. NULL); while (s > 0 && count > 0);

/* Закрытие файлов. */ CloseHandle(inhandle); CloseHandle(outhandle);

NT поддерживает иерархическую систему файлов, сходную с системой файлов UNIX. Однако в качестве разделителя здесь используется не /, а \ (заимствовано из MS-DOS). Здесь тоже существует понятие текущего каталога, а пути могут быть абсолютными и относительными. Однако между NT и UNIX есть одно существенноеразличие. UNIX позволяетмонтировать в однодерево системы файлов сразных дисков и машин, скрывая таким образом структуру диска от программного обеспечения. NT 4.0 не имеет этого качества, поэтому абсолютные имена файлов должны начинаться с буквы, которая указывает на диск (например, C:\windows\system\ foo.dll). Свойство монтирования систем файлов появилось с NT 5.O.

Основные функции для работы с директориями приведены в табл. 6.12 (также вместе с эквивалентами из UNIX). Думаем, что раскрывать ихзначение не требуется.

Отметим, что NT 4.0 не поддерживает связи файлов. На уровне графического рабочего стола поддерживаются клавишные комбинации быстрого вызова, но эти структуры не имели соответствий в самой системе файлов. Прикладная программа не могла войти в файл во второй директории, не скопировав весь файл. Начиная с NT 5.0 к системе файлов были добавлены файловые связи.

Таблица 6.12. Основные функции Min32 API для работы с директориями. Во втором столбце даны эквиваленты из UNIX, если они существуют

Функция API

UNIX

Значение

CreateDirectiry

mkdir

Создает новую директорию

RemoveDirectory

rmdir

Удаляет пустую директорию

FindFirstFile

opendir

Инициализирует чтение элементов директории

FindNextFile

readdir

Читает следующий элемент директории

MoveFile

 

Перемещает файл из одной директории в другую

SetCurrentDirectory

chdir

Меняет текущую директорию

NT имеет более сложный механизм защиты, чем в UNIX. Когда пользователь входитв систему, его процесс получаетмаркердоступа отоперационнойсистемы.

5 0 2 Глава 6. Уровень операционной системы

Маркер доступа содержит идентификатор безопасности (SID — Security ID),

список групп, к которым принадлежит пользователь, имеющиеся привилегии и некоторую другую информацию. Маркер доступа концентрирует всю информацию о защите в одном легко доступном месте. Все процессы, созданные этим процессом, наследуют этот же маркер доступа.

Дескриптор защиты — это один из параметров, который дается при создании любого объекта. Дескриптор защиты содержит список элементов, который назы- ваетсяспискомконтролядоступа(ACL—AccessControlList).Каждыйэлемент разрешает или запрещает совершать определенный набор операций над объектом какому-либо отдельному человеку или группе. Например, файл может содержать дескриптор защиты, который определяет, что Иванов не имеет доступа к файлу вообще, Петров может читать файл, Сидоров может читать и записывать файл, а все члены группы XYZ могут прочитать только размер файла.

Если процесс пытается выполнить какую-либо операцию над объектом с использованием идентификатора (handle), который он получил при открытии объекта, диспетчер безопасности получает маркер доступа данного процесса и начинает перебирать элементы списка контроля доступа по порядку. Как только он находит элемент, который соответствует нужному пользователю или одной из групп, информация о разрешении или запрещении доступа, найденная там, принимается в качестве заданной. По этой причине элементы, запрещающие доступ, обычно помещаются в список контроля доступа перед элементами, разрешающими доступ (чтобы пользователь, у которого нет доступа, не смог получить его незаконно, будучи членом одной из групп, которой доступ разрешен). Дескриптор защиты также содержит информацию, используемую для аудита доступов к объекту.

А теперь рассмотрим, как файлы и директории реализуются в NT. Каждый диск разделен на тома, такие же как разделы диска в UNIX. Каждый том содержит файлы, битовые отображения директорий и другие структуры данных. Каждый том организован в виде линейной последовательности кластеров. Размер кластера фиксирован для каждого тома. Он может быть от 512 байтов до 64 Кбайт, в зависимости от размера тома. Обращение к кластеру осуществляется по смещению от начала тома. При этом используются 64-битные числа.

Основнойструктуройданныхв каждомтомеявляется MFT(MasterFileTable — главная файловая таблица), в которой содержится элемент для каждого файла и директории в томе. Эти элементы аналогичны элементам индексного дескриптора (i-node) в системе UNIX. Главная файловая таблица является файлом и может быть помещена в любое место в пределах тома. Это устраняет проблему, возникающую при наличии испорченных блоков на диске в середине индексных дескрипторов.

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

Соседние файлы в папке AOM