ECMA-130 (Compact Disc) на пальцях

Три переїзду одно одній пожежі. Вигрібаючи старий ящик, пропахлий ацетоном, з багатошарової пилом на денці (як добре, що дружина не бачила) я натрапив на до болю знайомі мені компакт диски. Ось один з улюблених фільмів дитинства… а от моя колись улюблена аркадна іграшка…

Дивна річ — цікавість. Ось на столі примірник CD — безнадійно застарілого у наш просвященный XXI століття формату зберігання даних; а все таки цікаво, як же там зберігаються дані?.. Який сам стек зберігання даних?.. Як виправляються помилки?.. Яка надмірність коду?..

В дитинстві мені було достатньо знань про лазерному промені, про якийсь голівці, про «цієї крутиться штуки» і про таємничих питах.

Сказано — зроблено. Прогледівши стандарт ECMA-130 (є, до речі і вітчизняний стандарт: ГОСТ 27667-88) виявив масу цікавих деталей. Наприклад, я здогадувався про надмірність, але я і подумати не міг, що для запису 700 Мб даних «в реальності» записується 1943 Мб (тобто у 2.776 разів більше)…

Схематично весь стек можна уявити картинкою:




Стек розглянемо «зверху вниз».
Тобто від моменту передачі даних приводу до запису самих пітів.
Слід сказати, що не вся область диска використовується для запису/збереження/читання інформації.
Компакт диск розділений на зони (areas):
  1. Centre Hole (Центральне отвір ) — це «та сама дірочка» діаметром 15 мм (±0.1 мм), за яку прикріплюється сам диск.
  2. First transition area (Перша перехідна зона) — «кільце», між 15 та 20 мм від центру диска.
  3. Сlamping area (Зона затиску) — як зрозуміло з назви-це область необхідна, щоб диск не скакав» при читанні / запису. (26-33 мм)
  4. Second transition area (Друга перехідна зона) — «друге кільце», між 33 та 44 мм від центру диска.
  5. area Information (Зона інформації) — це «інформаційно корисна» частина компакт диска. Знаходиться на відстані від 44 мм до 118 мм від центру.
  6. Rim area (обід) — остання область. Являє собою кільце від 118 мм до 120 мм від центру.


Саме зона інформації нам і цікава, тому про неї скажемо більш докладно. area Information поділяється на такі «підзони»:
  • inner buffer zone (зона введення)
  • user data zone (зона програми)
  • outer buffer zone (зона виводу)


Всі три перекладу зроблені ГОСТом… Так що від себе перекладати не буду. При чому тут «програма», коли мова йде про дані — розуму додати не можу. Якщо хтось на Хабре зможе мені відповісти, чому user data zone переклали як «зона програми» я буду вкрай вдячний!

Уф… З фізичним лікнепом, сподіваюся, покінчили. Зрозуміло, я упустив багато моменти, пов'язані з ширинами і довжинами; з методом покриття; довжиною хвилі променя; та іншими фізичними властивостями. Однак, по-перше це не є метою даної статті; по-друге я і сам більше половини інформації поки не розібрав. Та й немає бажання, якщо чесно… Моя цікавість чисто «программистской» спрямованості ;)

Information Tracks («Інформаційні доріжки»)

Перша фаза — це розбиття на «інформаційні доріжки». Вже тут є два варіанти запису, в цифровому вигляді (Digital Data Tracks, DDT) аудіодані (Audio Tracks).
Надалі будемо розглядати лише цифрові дані. Вся нижченаведена інформація коректна тільки для DDT.

Sector (Сектор)

Дані розбиваються по 8 біт (по одному байту) і групуються у сектори.
Забавно, що кількість секторів диску не визначено стандартом. Воно залежить від того, скільки даних «вийти» записати диск…

Це здається трохи дивним. Тим не менш цю безглуздість в свою епоху використовували різні компанії по виявленню контрафактних дисків. (Так як це «відхід в сторону», то написав детальніше під спойлером трохи нижче, в кінці глави.)

Зрозуміло, довжина доріжки більш-менш фіксована і в цілому QoS гарантувати можна.

Існує три способи (mode) запису даних в секторах:
  • Sector Mode (00) — це порожній сектор, заповнюється даними, що складаються з 0x00 байтів.
  • Sector Mode (01) використання EDC, P-Q та CIRC кодування. (про це трохи нижче)
  • Sector Mode (02) — відсутність P і Q кодування, тільки CIRC кодування


Наведемо картинки:


Метод визначення контрафактного дискаМетод, як і все геніальне, проста.

Запис ключа.
  1. Слід спочатку записати всю необхідну інформацію на диск.
  2. Потім ми вибрати 2 сектори. Наприклад 103123 і 120234 сектора. Позначимо ці сектори як A та Б.
  3. Вибираємо два байти: по одному байту на кожному секторі. Наприклад 4й байт першого сектора і 8й байт другого
  4. Потім слід підрахувати кут між цими байтами на секторі. Як це зробити? Припустимо, у вас є доступ до низкорівневому драйверу читання і ви знаєте час одного обороту.Тоді слід обчислити час, витрачений на зчитування між А та Б. Поділивши цей час на час одного обороту можна з певною похибкою обчислити кут.
  5. Зачение кута, з округленням до визначеного знаку, подається на вхід хеш-функции. У хеш-значення беруться кілька символів, наприклад, останні 3 символи.
  6. Ці три символи записуються в ліцензійний ключ.


Процедура перевірки ліцензійного ключа.
  1. У користувача просять ввести ліцензійний ключ.
  2. Обчислюємо кут між вибраними байтами A та Б секторами
  3. Обчислюємо перевіряється список кутів. Наприклад ми вирахували кут 33,343°. Припустимо, що округлення відбувається з точністю до градуса. Округляємо і отримуємо 33°. Припустимо, що похибка ±2°. Список кутів: [31°, 32°, 33°, 34°, 35°].
  4. Для кожного кута зі списку обчислюємо хеш. Беремо кілька символів з хеш. Для прикладу — останні 3 символи
    Якщо хоча б один хеш зі списку збігся з хешем з ліцензійного ключа, то робимо висновок, що ліцензійний диск. Інакше диск контрафактний


Корекція помилок (тільки Sector Mode 01)

Корисна інформація (User Mode) складається з 2048 байт в режимі 01 або 2336 байт в режимі 02.
Який режим вибрати? Все залежить від того, яка вимога надійності вам потрібно.
Sector Mode 01 надійніше, так як в ньому використовуються додатково EDC перевірка і P-Q кодування.

EDC

Error Detection Code (EDC), як зрозуміло з назви, призначений тільки для виявлення, але не для виправлення помилок.

Ось його поліном: P(x)=(x16+x15+x2+1)(x16+x2+x+1)

Intermediate

Вісім байт поля Intermediate заповнюються нульовими байтами (0x00).
Ось вже не знаю навіщо їх залишили… Може «про запас» (IT стандартах це люблять), а може це підступний план стеганографічної передачі даних.

P і Q кодування (RSPC)

Reed-Solomon Product-like Code (RSPC), P+Q кодування використовується з 12 з 2075 байт даних в режимі 01. Подробиці опущу, ви можете прочитати їх в Annex A стандарту ECMA-130.

Байти з 12 з 2075 і перевірочні з 2 076 з 2 351 складають 2340 байт даних. Ці дані розбиваються на два блоки 1170 байт кожен. Розділення відбувається як у шкільних уроках фізкультури. "На перррвый — вторрррой рассчитась!". Тобто на непарні і парні байти.

Далі йде кодування зовнішніми і внутрішніми кодами. Зовнішній називається P-кодуванням, внутрішній Q-кодуванням.

Картинка з P і Q кодуванням

Для більшого розуміння: картинка тільки з Q кодуванням


Сама складна в розумінні стека ECMA-130 пройдена. Тепер буде значно простіше.

Скремблювання

Переходимо до скремблированию. Ось так виглядає один сектор скремблювання:


Кожен такий сектор називають Scrambled Sector.

А що таке «скремблювання» і навіщо це потрібно?Про сенс скремблювання коротко і ємко у коментарі до одного з моїх постів написав snapdragon
Скремблер потрібен для того, щоб зробити спектр сигналу рівномірним. Інакше, при однорідних даних (наприклад, багато повторюваних одиниць або нулів) енергія сигналу буде зосереджена у вузькому діапазоні.


F1, F2 F3 frame's

Кожен Scrambled Sector розбивається на frame'и, довжиною 24 байт кожен.
Дані frame'и мають назву: F1 frame.
Кожен Scrambled Sector у нас складається з 2352 байт.
Відповідно кожен сектор розбивається на 98 frame'ів.

CIRC кодування (F2 frame)
Cross Interleaved Reed-Solomon (CIRC) кодування здійснюється для кожного F1 frame'а.
Це код, коригуючий помилки з довжиною вхідного слова у 24 байта, а довжиною вихідного слова у 32 байти.
Причому на відміну від EDC та RSPC кодування, CIRC кодування застосовується для всіх Sector Mode.
Отриману послідовність з 32 байт називають F2 frame'ами.

Контрольний байт
В початок кожного F2 frame'а додають один перевірочний байт і виходить F3 frame з довжиною 33 байта (32+1=33).

8-to-14 кодування
На цій стадії дані кожен байт (8 біт) перетворюється в 14 біт даних. Перетворення здійснюється за таблицею.

Всю таблицю приводити не буду, ви можете знайти її у Annex D стандарту ECMA-130.

... ...
00010000 10000000100000
00010001 10000010000000
00010010 10010010000000
00010011 00100000100000
00010100 01000010000000
00010101 00000010000000
00010110 00010010000000
... ...


Навіщо необхідно 8-to-14 кодування в стандарті не зазначено. (Стандарт і не зобов'язаний відповідати на питання ЧОМУ, в стандарті повинні бути відповіді на питання ЯКИМ ЧИНОМ)…

У мене є одна гіпотеза. Справа в тому, що реальний світ не такий «ідеальний», яким його бачать програмісти. Наприклад, намальована точка — це маленька «пляма», а намальована лінія завжди має площу; в іншому випадку наші очі не бачили б точку і лінію… З цієї причини ризикну висловити ряд припущень. Підкреслю, що я ніколи не працював професійно з виготовленням CD дисків. Це всього лише припущення. (Дискусія в коментарях категорично вітається!).

Гіпотези.
  1. Піт не «ідеально» випалюється на поверхні диска, тому необхідно якийсь простір поруч з пітом, т. к. за це простір випалений піт може «заскочити».
  2. Швидше за все, є певні проблеми з синхронізацією самої головки.Занадто велика кількість поспіль йдуть нулів — це погано.
  3. Можливо велика кількість одиниць це додаткове «навантаження» на прочитує голівку. Тому їх зменшення дозволить істотно збільшити термін експлуатації CD приводу. В середньому на 8 біт даних ми имеети 4 одиниці. У 8-to-14 кодуванні в кодовому слові у нас 1 або 2 одиниці. Тобто в два рази менше.


Підраховуємо надмірність

Подивимося, наскільки протокол CD надлишковий:
  1. В залежності від Sector Mode:
    • Sector Mode 01 (P-Q кодування) — На вході блок з 2048 байт, на виході 2352. Отже надмірність дорівнює: 2352/2048=1.148
    • Sector Mode 02 (P-Q кодування) — 2352/2336=1.007
  2. Скремблювання — дрібниця, але для порядку врахуємо: (12+2340)/2340=1.005
  3. F1-F2-F3 фреймів33/24=1.375
  4. 8-to-14 кодування14/8=1.750


Перемножая все, отримуємо: 1.148 ⋅ 1.005 ⋅ 1.375 ⋅ 1.750 = 2.776. Таким чином на сам диск в результаті записується у 2.776 разів більше інформації, ніж «корисна інформація».
Наприклад при обсязі «корисної інформації» 700Мб, реально на диск записується 1943 Мб даних.

Для Sector Mode 02 не використовується P-Q кодування. Для цього режиму надмірність дорівнює: 1.007 ⋅ 1.005 ⋅ 1.375 ⋅ 1.750 = 2.435.

Бонус: SCSI Multimedia Commands

Є стандарт SCSI Multimedia Commands. У ньому дано опис команд «сирого» читання даних. Команди READ CD та WRITE CD дозволяють зчитувати 2352 байт даних з усього сектора. Однак команд для зчитування F-fraim'ів я не знайшов… В принципі якщо записувати надлишкову інформацію, для якої не страшні часткові втрати (наприклад відео, телематика)
можна обійтися без F1-F2-F3 фреймів збільшивши «корисне навантаження» у 1.375 разів.

Так само є ряд невикористаних областей в компакт диску (наприклад той же Intermidiate), якими можна скористатися. Наприклад заради завдань стеганографії.

На жаль я не знайшов OpenSource коду, що реалізує дані можливості…
Якщо на хабре є специ з даного питання, буду радий отримати посилання (з мене плюс в карму).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.