|
(DZ FAQ) Black Hacker, 2:5030/16.32
Многие спорят об достоинствах HPFS и недостатках FAT, однако не все пони-
мают ее устройство. Учитывая многочисленные просьбы рассказать что либо об
устройстве HPFS я на основе 5 источников и небольшого своего опыта разработ-
ки и эксплуатации различных FS решил написать это письмо. Если найдете ошиб-
ки пишите мылом. адеюсь что после прочтения этого текста даже самые злобные
сторонники FAT пересмотрят свое отношение к этой устаревшей FS.
Кое-что об HPFS.
- HPFS разработана специалистами MS и IBM на основе опыта IBM по созданию
файловых систем MVS, VM/CMS и виртуального метода доступа. Мне известно
что со стороны MS проектом руководил крутой системщик Gordon Letwin.
- Диск в HPFS делится на сектора фиксированного размера (512 байт в текущей
реализации, при этом номер сектора или их количество кодируются во внут-
ренних структурах как 4-байтовое беззнаковое целое что позволяет адресо-
вать диски размером до (2**32 - 1) * 512 = 2 терабайта.
- В начале диска расположены несколько управляющих блоков:
- Загрузочный сектор DOS-овского вида.
- SuperBlock. Содержит информацию о геометрии диска, указатели на бит-
мапы свободного пространства, указатель на корневой каталог, размер
дисковой полосы, номер полосы с каталогами, указатель на список сбой-
ных блоков и.т.п
Еще SuperBlock содержит дату последнего запуска CHKDSK, и обычно
изменяют SuperBlock только CHKDSK и FORMAT.
- SpareBlock. Содержит указатели на пул HOTFIX-areas, пул Fault-Tole-
rance areas (только HPFS386 использует Fault-Tolerance), пул блоков
для операций на почти переполненном диске и другие указатели, флаги и
дескрипторы.
- Область начальной загрузки.
- Область секторов используемых (временно) для выполнения операций тре-
бующих дополнительную дисковую память. Эта область например, иногда
задействуется при переименовании файла на заполненном диске.
- Другие области.
- Для определения свободен сектор или занят HPFS использует битмапы в кото-
рых каждый бит соответствует одному сектору. Если бит содержит 1 то это
означает что сектор занят, иначе он свободен. Если бы на весь диск был бы
только один битмап то для его подкачки приходилось бы перемещать головки
чтения/записи в среднем через половину диска. Чтобы избежать этого HPFS
разбивает диск на "полосы" (Bands) длиной по 8 мегабайт и хранит битмапы
свободных секторов в начале или конце каждой полосы. При этом битмапы со-
седних полос располагаются рядом:
+--------- 16MB --------+ *** - Use/Free sector bitmap.
! !
+--!-----------+-----------!--+--------------+--------------+
!*** Полоса 0 ! Полоса 1 ***!*** Полоса 2 ! Полоса 3 ***!
+--------------+--------------+--------------+--------------+
0MB 8MB 16MB 24MB 32MB
Из этого следует что расстояние между двумя битмапами равно 16MB. Размер
полосы (8MB) может быть изменен в следующих версиях HPFS т.к. на него нет
прямых завязок. HPFS определяет размер полосы при чтении управляющих блоков
с диска во время выполнения операции FSHelperAttach.
Сейчас размер битмапа равен 2K. (8MB/512/8 = 2K).
Полоса находящаяся в центре диска используется для хранения каталогов.
Эта полоса называется Directory Band. Однако если она будет полностью запол-
нена HPFS начнет располагать каталоги файлов в других полосах.
- Файлы и каталоги в HPFS базируются на фундаментальном объекте называемом
F-Node. Каждая FNode занимает один сектор и всегда располагается HPFS-ом
поблизости от своего файла или каталога. (Обычно непосредственно перед
файлом или каталогом). FNode содержит длину и первые 15 символов имени
файла, статистику по доступу к файлу, внутри-HPFS-сную информацию, расши-
ренные атрибуты и ACL (или только часть, если они очень большие), ассоци-
ативную информацию о расположении и подчинении файла и т.д.
Имена файлов и каталогов при полной подстановке (от корня) не должны
превышать 260 символов, при этом каждая компонента пути не должна быть
длиннее 255 символов. В именах файлов не допустимы символы: 0h-31h, 7Fh,
"/", "|", "\", "*", "?", '"', "<", ">". Последовательности конечных про-
белов игнорируются, если на конце файла стоит точка то она тоже игнориру-
ется (для совместимости Soft-а). Внутри имени файла точка такой же символ
как и остальные. Русские буквы работают нормально. При создании файла
HPFS запоминает написание его имени, хотя и не различает регистров в
дальнейших операциях, кроме тех, что возвращают информацию о файле.
Примеры имен:
1. "FILE.ASM"
2. "Злобный Файл.ASM.OBJ.EXE"
3 "Еще более злобный файл . TXT"
- С точки зрения размещения файлы, каталоги и их расширенные атрибуты (если
они не помещаются во FNode) рассматриваются HPFS как наборы экстентов.
Для людей не знакомых с MVS и CMS поясню: экстент это кусок файла лежащий
в последовательных секторах. Каждый экстент описывается двумя числами:
номером первого сектора и длиной (в секторах). Два последовательных экс-
тента всегда объединяются HPFS в один. Минимальный размер экстента один
сектор. Так как расстояние между соседними битмапами свободных секторов
равно 16MB то и размер максимального экстента равен 16MB. Если файл сос-
тоит из восьми или менее экстентов, то его описание целиком хранится в
FNode.
- Если файл состоит более чем из восьми экстентов то его описание может за-
нимать несколько секторов расположенных поближе к файлу, при этом эти
сектора содержат не список, а прошитое сбалансированное дерево экстентов.
(B+-Tree). Дерево построено так, что его разбалансировка никогда не пре-
вышает 1/3 по объему, и оно не отличается от оптимального более чем на
один уровень. (О B*/B+-деревьях читайте у Кнута или еще где-нибудь). Ко-
рень дерева находится в FNode, причем может содержать до 12 элементов.
Каждый дополнительный сектор представляющий собой ветку дерева содержит
до 60 элементов а лист - 40 элементов. Таким образом если файл состоит из
экстентов по одному сектору (этого никогда не будет !) и имеет размер 2GB
для его описания потребуется дерево следующей структуры: 12*60*60*60*40
т.е. 53MB листьев и 1.7MB веток. Для случайном доступа к любой части фай-
ла при этом потребуется (в худшем случае) 5 операций чтения управляющих
структур.
Реальные файлы состоят из одного-трех экстентов.
- Максимальный размер файла в HPFS сейчас 4GB (или 2GB ???), однако он
обусловлен только размером поля под размер файла и файловый указатель (4
байта, регистр) в самоЙ OS/2 и ее API. Это не предел самой HPFS. Следует
помнить что в HPFS отсутствует понятие кластера, файл может занимать 1,
2, 3, 4 или любое другое количество секторов.
- При создании/расширении файлов HPFS пытается минимизировать количество
экстентов, используя для этого статистику, битмапы свободных секторов и
еще 100 методов. апример, HPFS старается условно резервировать хотя бы 4
килобайта места в конце файлов которые растут. Другой прием: расположение
конкурентно растущих файлов или файлов открытых разными цепочками или
процессами в разных полосах диска.
- Каталоги в HPFS как и в FAT образуют древовидную структуру. о при этом
внутри каталога HPFS строит сбалансированное дерево (B*-Tree) на основе
имен файлов для быстрого поиска файла по имени внутри каталога. Так если
каталог содержит 4096 файлов FAT будет читать в среднем 64 сектора для
поиска файла внутри каталога, HPFS считает 2-4 сектора и найдет файл.
Размер блока в терминах которых выделяются каталоги равен 2KB в текущей
версии HPFS. Размер записи описывающей файл зависит от размера имени фай-
ла. Если имя занимает 13 байтов (8.3<0h>) то 2-килобайтовый блок вмещает
41 описатель файлов. Блоки прошиты списком (как и описатели экстентов)
для облегчения последовательного обхода.
HPFS не имеет FAT-овских проблем "утекания" дискового пространства при
удалении большого количества файлов в каталоге.
При переименовании файла может возникнуть перебалансировка дерева. Эта
операция может потребовать выделения дополнительных блоков на заполненном
диске. В этом случае блоки берутся из специального пула указатель на ко-
торый лежит в SpareBlock.
- Расширенные атрибуты и их разновидность ACL (Access Control Lists) HPFS
хранит в FNode. Если они не влезают в FNode HPFS хранит из почти как файл
построив для этого B+-Tree. Имена расширенных атрибутов насколько мне из-
вестно (до HPFS386 ил LS 4.0 ???) не выстраивались в B-Tree.
Горявский Юлий Анатольевич.
|