F1-фрейм.
Структура F1-фреймов чрезвычайно проста: каждый фрейм состоит из 24 байтов (12 слов), пронумерованных от 0 до 23, последовательно отображаемых на соответствующие ячейки сектора (рис. 1.18,0x042 а). Причем, границы фреймов и секторов не обязаны совпадать и сектор может начинаться с любой из следующих позицией первого фрейма: 0, 4, 8, 12, 16 или 20 (см. рис. 1.18,0x042 бснизу). Стартовая позиция сектора в F1-фрейме нигде не храниться (да и где ее здесь хранить-то?), вместо этого начало сектора опознается по синхрогруппе, которую трудно не заметить!
Рис. 1.18. Схема отображения секторов на фреймы
Стандарт довольно туманно описывает процесс отображения секторов на фреймы, но дает понять, что за концом одного сектора непосредственно следует начало другого (Byte 2.351 of a Sector is immediately followed by byte 0 of the next Sector), следовательно изменение стартовой позиции сектора не "заворачивает" хвост сектора в начало первого фрейма, а переносит его на следующий фрейм. Короче говоря, стартовая позиция сектора не равна нулю, то каждый 49-й фрейм содержит байты сразу двух секторов (как нетрудно сообразить это будут первый и последний фреймы сектора, а, поскольку, в одном секторе содержится 98 фреймов, то 98/2 == 49)!
Изменение стартовой позиции начального байта сектора во фрейме приводит к значительным изменениям его DSV (см. разд. "Синхрогруппы, объединяющие биты и DSV???DSV" этой главы), в результате чего у записывающей аппаратуры появляется возможность "нормализации" секторов с неприлично высоким значением DSV. Микропрограмма привода должна выбирать стартовую позицию с наименьшим возможным DSV или, по крайней мере, следить за тем, чтобы величина DSV не выходила за рамки предельно допустимых значений. К сожалению, подавляющее большинство пишущих приводов CD-R'ов "писцов" бытового класса слишком тупы для подобной задачи и всегда начинают фрейм с нулевого байта сектора.
Как следствие, —– копия диска на фреймовом уровне может очень значительно отличаться от своего оригинала. Несмотря на то, что программно определить стартовую позицию невозможно (штатные приводы CD-ROM отказываются "разглашать" эту информацию), разработчикам защитного механизма ничего не стоит сформировать "слабый" (weak) сектор, имеющий крайне высокое DSV при стартовой позиции 0, но вполне нормальное —– при всех остальных (см. разд. "Защиты, основанные на «слабых» секторах???weak" главы 9). Скопировать такой сектор обычным пишущим приводом"писцом" практически невозможно, —– лишь немногие модели приводов CD-ROM приводов окажутся способными прочесть сектор с высоким DSV. Мой ASUS-50x как будто бы читает такие сектора, но нестабильно и не на всех дисках. Причем, возможности "ручного" выбора стартовой позиции у известных мне пишущих приводовписцов нет (во всяком случае, в стандарте она отсутствует, да и не спустились еще такие записывающие приводыписцы на такой низкий уровень). Можно, конечно, схитрить и умышленно исказить несколько байт сектора, не трогая при этом корректирующие коды (даже незначительная модификация исходных данных ведет к чудовищному изменению DSV), так что микропроцессорная начинка привода самостоятельно восстановит первоначальное содержимое искаженных данных "налету". Однако защита (если она, конечно, не совсем дура) может запросто разоблачить такую грубую подделку от оригинала, —– ведь при чтении сектора в "сыром" виде все махинации с корректирующими кодами сразу же становятся видны!
В тоже время большинство пишущих приводов CD-RW писцов (если не все они) тщательно следят за значением DSV и корректно выбирают стартовую позицию. Что ж! Все логично, —– контрастность CD-RW носителей и так до безобразия низка, а потому и требования к величине DSV здесь значительно жестче, чем у CD-R дисков. Отсюда: если защищенный диск не копируется на CD-R, попробуйте скопировать его на CD-RW… нет, не на CD-RW приводе, но на приводе CD-RW приводе на одноименнуюCD-RW болванку, ибо ряд пишущих приводов CD-RW писцов (Plextor, PHILIPS) при записи CD-R болванок всегда начинают фрейм с нулевого байта сектора, но вместе с этим грамотно определяют стартовую позицию сектора при записи на болванку типа CD-RW! (маразм, конечно, но против него не попрешь).
Рисунок 18 0х047 Схема отображения секторов на фреймы
Порядок следования байт в секторе отличеный от порядка следования байт в F1-фрейме. То есть, попросту говоря, при отображении содержимого сектора на фрейм, четные и нечетные байты меняются местами (см. рис. 1.190x048). Такое перемешивание призвано уменьшить пагубное влияние дефектов диска, затрагивающих оба соседних байта сразу.
Рис. 1.19.унок 19 0х048 Схема перемешивания байтов в F1- фрейме
Программная реализация разбиения сектора на фреймы приведена в следующем листинге 1.8 (здесь: sector —– указатель на исходный сектор, F1_frames —– массив из 98 фреймов по 24 байта каждый).:
Листинг 1.8. Пример, демонстрирующий технику формирования F1-фреймов (рассмотрен случай, когда границы фреймов и секторов совпадают)
/* generate F1 frames */
for (a = 0; a < 98; a++)
{
for (b = 0; b < 24; b++)
{
F1_frame[a][b]=((*sector&0xff00ff00UL)>>8)|((*sector&0x00ff00ffUL)<<8);
}
}