Списки отрезков (data runs)
Тела нерезидентных атрибутов хранятся на диске в одной или нескольких кластерных цепочках, называемых отрезками
(runs). Отрезком называется последовательность смежных кластеров, характеризующаяся номером начального кластера и длинной. Совокупность отрезков называется списком, run-list'ом или data run'ом.
Внутренний формат представления списков не то, чтобы сложен, но явно не прост, за что получил прозвище brain damage format'а (формата, срывающего крышу и обламывающего кайф). Для экономии места длина отрезка и номер начального кластера хранятся в полях переменной длины. То есть, если размер отрезка умещается в байт (т.е. его значение не прерывает 255), он и хранится в байте. Соответственно, если размер отрезка требует для своего представления двойного слова, он и хранится в двойном слове.
Сами же поля размеров хранятся в 4-байтовых ячейках, называемых нибблами (nibble) или полубайтами. Шестнадцатеричная система исчисления позволяет легко переводить байты в нибблы и наоборот. Младший ниббл равен (X & 15), а старший – (X / 16). Легко видеть, что младший ниббл соответствует младшему шестнадцатеричному разряду байта, а старший – старшему. Например, 69h состоит из двух нибблов – младший равен 9h, а старший – 6h.
Список отрезков представляет собой массив структур, каждая из которых описывает характеристики "своего" отрезка, а в конце списка находится завершающий нуль. Первый байт структуры состоит из двух полубайт: младший задает длину поля начального кластера отрезка (условно обозначаемого буквой F), старший – количество кластеров в отрезке (L). Поле длины отрезка идет следом. В зависимости от значения L оно может занимать от одного до восьми байт (более длинные поля недопустимы). Первый байт поля стартового кластера файла расположен по смещению 1 + L байт от начала структуры (что соответствует 2+2*L нибблам). Кстати говоря, в документации Linux-NTFS Project (версия 0.4) поля размеров начального кластера и количества кластеров в отрезке перепутаны местами.
смещение в нибблах |
размер в нибблах |
описание |
0 |
1 |
размер поля длины (L) |
1 |
1 |
размер поля начального кластера (S) |
2 |
2*L |
количество кластеров в отрезке |
2+2*L |
2*S |
номер начального кластера отрезка |