Итак, с физической стороной записи информации на компакт-диск мы разобрались (см. КВ №27). Но если вы думаете, что на этом все сложности заканчиватся, то глубоко ошибаетесь. Логическая сторона записи, то есть подготовка и кодирование данных, здесь даже важнее, чем физическая основа. Ведь если просто записать данные на компакт, а затем считать, то ничего не выйдет. При всей помехоустойчивости приводов CD-ROM ошибки все равно будут присутствовать. Так что логическая сторона записи данных занимает в стандартах намного более важное место, чем физическая.
Начнем мы с аудио-компактов, поскольку спецификация на них (IEC 908 - "красная книга") появилась раньше и поэтому поддерживается всеми остальными стандартами. Данные на диске разбиты на так называемые фреймы - блоки по 24 байта (шесть 16-битных выборок для каждого стереоканала). Однако здесь имеются в виду только информационные байты, на самом же деле состав фрейма следующий:
синхронизирующее слово | 24 бита |
служебные данные | 14 бит |
данные | 336 бит |
данные паритета | 112 бит |
разделители | 102 бита |
Итого | 588 бит |
Многовато, скажете вы. И будете совершенно правы. Умножим 24 байта на 8 бит - получим 192 (а совсем не 336). Все дело в том, что данные на компакт записываются не как обычно (то есть байту соответствует 8 бит), а в кодировке EFC (Eight to Fourteen Code - восемь к четырнадцати), где байт кодируется четырнадцатью битами. Это делается по следующим причинам. Во-первых, как вы помните, единица на компакте кодируется переходом от горки к ямке или наоборот (то есть краем ямки). Два края подряд считать с диска нельзя - значит в записываемом байте не должны идти подряд две единицы (на самом деле, по стандарту "красной книги" они должны быть разделены не менее, чем тремя, и не более, чем десятью нулями). Во-вторых (это тесно связано с "во-первых"), минимальная длина ямки соответствует трем последовательным нулям. В EFC число 128 (двоичное 10000000) будет записано как 01001000100001, а 57 (00111001) как 10000000001000. Теперь посмотрите на них внимательнее. Если на диске за 128 сразу будет идти 57, то снова получатся две последовательные единицы. Значит нужно писать между отдельными байтами разделители, причем, поскольку меньше трех нулей подряд записать нельзя, разделитель должен быть длиной три бита. Таким образом, байт информации занимает на компакте 17 бит.
Ну вот, с составом фрейма мы частично разобрались. Осталось только выяснить, для чего нужны биты паритета. А нужны они для поиска и коррекции ошибок. Ошибки считывания присутствуют всегда. Единственный способ борьбы с ними - применение специальных способов кодирования. Без них вы не смогли бы запустить с компакта даже самую простенькую программу, а музыка бы скрипела и шипела. В CD-ROM применяется так называемый CIRC - Cross Interleave Reed Solomon Code (распределенный код Рида-Соломона). Можно сказать, что он состоит из двух частей. Во-первых, распределенный: то есть данные на диск записываются не в том порядке, в каком расположены на самом деле. Информация на диске таким образом "размазывается" по дорожке. В результате царапина или пятно на диске помешают считать не 24 идущих подряд байта, а 24 байта, взятых из разных участков данных. Дальше в дело включается собственно алгоритм коррекции ошибок, исправляющий произошедшие ошибки считывания. В каждом фрейме содержится 8 байтов для коррекции ошибок. Из них четыре служат для обработки фреймов, считанных с диска (то есть с распределенными, "перемешанными", байтами), остальные четыре - для коррекции ошибок в уже собранных в первоначальном порядке данных.
Такая методика позволяет приводу CD-ROM правильно считывать диски, на которых встречается до 300 ошибок в секунду. Благодаря "размазыванию" данных по диску код Рида-Соломона может правильно восстановить информацию, если на диске отсутствует до 2.5 миллиметров дорожки подряд. Однако все это относится к аудио-компактам. Для цифровых такой защиты недостаточно.
Собственно говоря, для записи на цифровые диски структура данных, применяющаяся на аудио-CD, тоже не подходит. Блок в 24 байта слишком мал, поэтому в стандарте для цифровых компактов - "желтой книге" - вводится понятие сектора. Сектор объединяет 98 фреймов, что соответствует 2352 байтам информации (учтите, что понятие сектора - чисто логическое, сама запись на диск производится теми же самыми фреймами, что и раньше). Структура сектора следующая:
Номер байта | Содержимое |
0 | 0000 0000 |
1 - 10 | 11111111 |
11 | 0000 0000 |
12 | минуты - максимум 74 (+шестнадцатиричное A) |
13 | секунды - максимум 59 |
14 | номер блока в секунде (один из 75) |
15 | тип сектора |
16 - 2063 | данные |
2064 - 2351 | данные для коррекции ошибок |
Первые двенадцать байтов служат для синхронизации. Следующие три байта содержат адрес сектора (например, A5 20 33 означает, что это тридцать третий сектор на двадцатой секунде пятой минуты диска). Следующий, шестнадцатый по порядку, байт определяет тип сектора (всего существует три типа). Тип 0 - пустой сектор (он содержит только нули). Тип 2 - сектор с урезанной коррекцией ошибок (в байтах с 2064 по 2351 записаны обычные данные, защищенные только CIRC-кодировкой в каждом фрейме). Тип 1 - стандартная запись для цифрового компакта, раскладка данных в ней следующая:
Номер байта | Содержимое |
16 - 2063 | данные |
2064 - 2067 | 4 байта EDC |
2068 - 2075 | 8 байт, содержащих 0000 0000 |
2076 - 2247 | 172 байта паритета P |
2248 - 2351 | 104 байта паритета Q |
Как видите, сразу после 2048 байтов данных идут 4 байта кода обнаружения ошибок (EDC - error detection code). В данном случае используется CRC-код (см. КВ №26), причем он относится к байтам с 0 по 2063. Данные Q и P паритета также относятся ко всему сектору в целом. Таким образом, для сектора цифрового компакта предусмотрено несколько уровней обнаружения и коррекции ошибок (EDC, Q и P - паритеты на уровне секторов, CIRC-кодирование и "размазывание" на уровне фреймов). Необходимо отметить, что на самом деле процесс кодирования при записи диска намного сложнее. Если вы хотите разобраться с ним подробнее, загляните на http://www.ee.washington.edu/conselec/CE/kuhn/cdaudio2/95x7.htm, там находится курс лекций по CD-ROM.
За организацию секторов в файлы отвечает стандарт High Sierra (ISO 9660). На компакт-диске используется стандартная иерархическая файловая структура (как и на винчестере). Однако если обычно для того, чтобы найти файл по пути (например, С:\games\doom\doom2.exe), надо произвести последовательный поиск в директориях, то на компакте (поскольку положение файлов никогда не меняется) сразу записаны пути ко всем файлам. Таким образом файл обнаруживается за одно обращение к диску (учитывая большое время поиска, это очень существенно). ISO 9660 ограничивает названия файлов стандартным восьмисимвольным именем и трехсимвольным расширением; количество вложенных каталогов не должно превосходить восемь. В стандарте ISO 9660 не отдается предпочтения ни одному конкретному типу архитектуры компьютера: наиболее важные служебные данные, занимающие несколько байтов, записываются как в формате Intel - сначала младший байт, затем старший, так и в формате Motorola - наоборот.
Под MS-DOS поддержку стандарта High Sierra обеспечивает резидентная программа MSCDEX.EXE (Microsoft Multimedia Extensions). Она вызывается из autoexec.bat примерно таким образом:
mscdex.exe /E /D:MSCD001 /M:15 /V /L:R
(параметр /D: определяет номер устройства, а /L: - задает логический диск, которому будет соответствовать привод CD-ROM). Однако одного MSCDEX недостаточно. Сначала надо загрузить специальный драйвер, который должен поставляться с каждым приводом CD-ROM. Загружается он из config.sys и выглядит это примерно так:
devicehigh=c:\sb16\drv\ccd.sys /D:MSCD001 /P:220 /S:D0 /T:1
Это драйвер нижнего уровня, с MSCDEX его связывает только номер устройства после параметра /D:. Эти номера (в данном случае MSCD001) обязательно должны совпадать, иначе MSCDEX (и MS-DOS) просто не увидят устройство. И еще один момент, связанный с MSCDEX, - он представляет DOS привод CD-ROM в качестве сетевого диска. Поэтому для CD не работают некоторые команды DOS, в частности SUBST и CHKDSK. Кроме того, могут возникнуть конфликты с сетевыми утилитами. Имейте это в виду, иначе из-за чисто программного конфликта исправный привод CD-ROM откажется работать.
В конце хотелось бы сказать пару слов о том, как выбирать компакт-диск. Обязательно осмотрите нижнюю сторону диска в отраженном свете, а затем посмотрите его на просвет. На пластмассе не должно быть продольных царапин (они сбивают систему слежения), а металлический слой должен быть целым (без повреждений) и равномерно распределенным (не просвечивать на краях). Вопреки распространенному мнению, точечные отверстия - "проколы" в металле - не так уж страшны, поскольку вызванные ими сбои легко исправляются кодом коррекции ошибок. Однако лучше, чтобы на диске не было никаких дефектов вообще. И обязательно проверяйте компакт до того, как купите - потом его никто не поменяет.
Константин АФАНАСЬЕВ
Горячие темы