Блок управления файлом (>lkt rhjgflyunx sgwlkb)
Эта страница требует существенной переработки. |
В статье не хватает ссылок на источники (см. рекомендации по поиску). |
Блок управления файлом (FCB) — структура файловой системы, в которой поддерживается состояние открытого файла. FCB управляется операционной системой, но он находится в памяти программы, которая использует файл, а не в памяти операционной системы. Это позволяет процессу иметь одновременно столько файлов, сколько он хочет, при условии, что он может выделить достаточно памяти для FCB на каждый файл.
FCB берет свое начало в CP/M и присутствует в большинстве версий DOS, но только в качестве меры обратной совместимости в MS-DOS версий 2.0 и более поздних. Полный FCB имеет длину 36 байт; в ранних версиях CP/M он составлял 33 байта. Этот фиксированный размер, который нельзя было увеличить без нарушения совместимости приложений, привел к тому, что FCB в конечном итоге перестал быть стандартным методом доступа к файлам
Значения некоторых полей в FCB различаются между CP/M и DOS, а также в зависимости от выполняемой операции. Следующие поля имеют одинаковые значения[1].
Смещение | Байт
размер |
Содержание |
---|---|---|
0x00 | 1 | Номер диска — 0 по умолчанию, 1 для A:, 2 для B |
0x01 | 8 | Имя и расширение файла — вместе они образуют имя файла 8.3. |
0x09 | 3 | |
0x0C | 20 | Зависит от реализации — должен быть инициализирован нулем перед открытием FCB. |
0x20 | 1 | Номер записи в текущем разделе файла — используется при последовательном доступе. |
0x21 | 3 | Номер записи, используемый при случайном доступе. |
Поле длиной 20 байт, начинающееся со смещения 0x0C, содержало поля, которые (среди прочего) предоставляли дополнительную информацию о файле[1].
Смещение | Байт
размер |
Содержание |
---|---|---|
0x0E | 2 | Длина записи файла в байтах. |
0x10 | 4 | Общий размер файла в байтах. |
0x14 | 2 | Дата последней модификации содержимого файла. |
0x16 | 2 | Время последней модификации. |
Дальнейшие значения использовались в новых версиях DOS до тех пор, пока новая информация не переставала помещаться в эти 20 байт. Некоторые предшествующие байты «отрицательного смещения» были вытеснены из зарезервированных мест в нулевой странице CP/M и префиксе программного сегмента DOS для хранения атрибутов файлов[1].
Применение
[править | править код]В CP/M, 86-DOS и PC DOS 1.x/MS-DOS 1.xx FCB был единственным методом доступа к файлам. В DOS несколько подфункций INT 21h обеспечивали интерфейс для работы с файлами с помощью FCB[2]. Когда в MS-DOS 2 началась подготовка к поддержке нескольких процессов или пользователей, использованию других файловых систем, кроме FAT, или к обмену файлами по сети в будущем, считалось, что FCB слишком малы для обработки дополнительных данных, необходимых для таких функций, и поэтому FCB считались неадекватными для различных будущих путей расширения. Кроме того, они не предоставляли поля для указания подкаталогов. Выдача данных, связанных с файловой системой, в пользовательское пространство также рассматривалась как риск для безопасности. Таким образом, на смену FCB пришли файловые дескрипторы, используемые в Unix и её производных. Файловые дескрипторы — это просто последовательные целые числа, связанные с определёнными открытыми файлами.
Если программа использует более новый API файловых дескрипторов для открытия файла, операционная система будет управлять своей внутренней структурой данных, связанной с этим файлом, в своей собственной области памяти. Преимущество этого способа заключается в том, что в последующих версиях операционной системы эти структуры могут увеличиваться в размерах, не нарушая совместимости с прикладными программами; недостаток — в том, что, учитывая довольно упрощенное управление памятью в DOS, место для такого количества этих структур, которое может использовать самая «жадная до файлов» программа, должно быть зарезервировано во время загрузки и не может быть использовано для каких-либо других целей во время работы компьютера. Такое резервирование памяти осуществляется с помощью директивы FILES= в файле CONFIG.SYS. Эта проблема не возникает при использовании FCB в DOS 1 или CP/M, так как операционная система хранит все, что ей нужно знать об открытом файле, внутри FCB и, таким образом, не нуждается в использовании памяти для файлов в пространстве памяти операционной системы. При использовании FCB в MS-DOS 3 и более поздних версиях формат FCB зависит от того, загружен ли SHARE.EXE и ссылается ли FCB на локальный или удаленный файл, а также часто ссылается на запись SFT. Из-за этого количество FCB, которые могут быть открыты одновременно в DOS 3 и выше, также ограничено, обычно до 4; с помощью директивы FCBS= в файле CONFIG.SYS оно может быть увеличено сверх этого числа, если это необходимо. В DR-DOS и FILES, и FCBS берутся из одного и того же внутреннего пула доступных структур дескрипторов и назначаются динамически по мере необходимости[3].
FCB поддерживались во всех версиях MS-DOS и Windows до появления файловой системы FAT32. Windows 95, Windows 98 и Windows Me не поддерживают использование FCB на дисках FAT32 из-за их 32-битных кластерных номеров, за исключением чтения метки тома. Это привело к тому, что некоторые старые DOS-приложения, включая WordStar, не работают под этими версиями Windows.
Интерфейс FCB также не работает должным образом в Windows NT, 2000 и т. д. — WordStar не функционирует должным образом в этих операционных системах. Эмуляторы DOS DOSEMU и DOSBox реализуют интерфейс FCB должным образом, поэтому они позволяют запускать старые DOS-программы, которым нужен FCB, на современных операционных системах.
Область передачи данных на диск
[править | править код]Сопутствующей структурой данных, используемой вместе с FCB, была Disk Transfer Area (DTA). Так назывался буфер, в который считывалось/записывалось содержимое файла (записи). Функции доступа к файлам в DOS, использующие FCB, предполагали фиксированное местоположение DTA, изначально указывающее на часть PSP это местоположение можно было изменить, вызвав функцию DOS, при этом последующие обращения к файлам неявно использовали новое местоположение.
После отказа от метода FCB новые функции доступа к файлам, использующие дескрипторы файлов, также предоставили возможность указывать буфер памяти для содержимого файла при каждом вызове функции, так что ведение параллельных, независимых буферов (для разных файлов или для одного и того же файла) стало гораздо более практичным
Префикс сегмента программы и инициализация программы
[править | править код]Каждый исполняемый файл DOS, запускаемый из оболочки (COMMAND.COM), снабжался предварительно заполненной структурой данных длиной 256 байт, называемой префиксом сегмента программы (PSP). Соответствующие поля в этой структуре включают
Смещение | Байт
размер |
Содержание |
---|---|---|
0x02 | 2 | Доступная память для программы в 16-байтовых чанках. |
0x2C | 2 | Адрес сегмента, содержащего переменные окружения программы. |
0x5C | 16 | Подготовил FCB для первого аргумента командной строки (не открыт). |
0x6C | 20 | Подготовил FCB для второго аргумента командной строки (не открыт). |
0x80 | 1 | Длина командной строки. |
0x81 | 127 | Содержание командной строки. |
Эта структура данных находилась в начале сегмента данных, адрес которого DOS указывала при старте программы в сегментных регистрах DS и ES. Помимо предоставления командной строки программы дословно по адресу 0x81, DOS также попыталась построить два FCB, соответствующих первым двум словам в командной строке, с целью сэкономить работу программиста в распространенном случае, когда эти слова были именами файлов, с которыми нужно было работать. Поскольку эти FCB оставались не открываемыми, никаких проблем не возникло бы, даже если бы эти слова командной строки не относились к файлам.
Начальный адрес DTA был установлен так, чтобы перекрывать область в PSP (по адресу 0x80), где хранились аргументы командной строки, так что программа должна была анализировать эту область на предмет аргументов командной строки перед вызовом функций DOS, использующих DTA (например, чтение записи файла), если только программа не позаботилась о том, чтобы изменить адрес DTA на какую-то другую область памяти (или вообще не использовать функции DTA/FCB, которые вскоре были упразднены в пользу файловых дескрипторов)
Примечания
[править | править код]Ссылки
[править | править код]- FCB . stanislavs.org. Дата обращения: 15 июня 2024.
- NWDOSTIP . www.antonis.de. Дата обращения: 15 июня 2024.
- CPM Operating System Internals (англ.). obsolescence. Дата обращения: 15 июня 2024.
- lorihollasch Структура FCB - Windows drivers (рус.). learn.microsoft.com (14 июня 2023). Дата обращения: 15 июня 2024.