Прочитав некоторую документацию по libcdio, я думаю, что понимаю, как работает эта система.
Сначала я немного расскажу о флоппи-дисках и оперативной памяти, а затем подключу их к компакт-дискам.
В ОЗУ каждому байту присваивается номер. Когда мы хотим получить доступ к данным в этом байте, мы отправляем число процессору, и он помещает данные в регистр, который мы можем позже обработать (есть также история сегментов и смещений для x86, но я не думаю, что это актуально по этой аналогии). Система была более или менее простой и обеспечивает относительно легкий доступ к памяти.
Теперь на дискетах (и на жестких дисках тоже) диск разделен на концентрические круги, и они обозначают дорожки. Дорожки, которые расположены параллельно друг над другом или ниже друг друга, образуют так называемый цилиндр (помните, что современные дискеты являются двухсторонними, а на жестких дисках у нас может быть несколько двусторонних дисков). Диск также разделен на сектора. Сектор - это в основном угол, вершина которого находится в центре диска. Область, ограниченная дорожкой и сектором, называется блоком (хотя многие люди называют его также сектором). Еще одна важная вещь - голова. Как я уже сказал, сегодня у дискет есть две стороны, а у жесткого диска каждый диск имеет две стороны. На каждой стороне есть голова, которая читает данные, и у каждой головы есть свой номер.
Когда мы хотим получить данные с дискеты (или старого жесткого диска), мы отправляем номер цилиндра, номер головки и номер сектора на контроллер накопителя, и он перемещает головку в соответствующее место. Размеры дисков стандартизированы, расположение дорожек и секторов тоже. У нас есть шаговый двигатель, который будет перемещать головку по радиусу диска. Контроллер знает расстояние между дорожками и текущее местоположение головки и рассчитывает, на сколько дорожек ему нужно переместить головку, чтобы добраться до нужной дорожки. Когда головка перемещается на правильную дорожку, она считывает данные с дискеты. В каждом блоке (или, как некоторые называют его сектором) есть некоторые метаданные, записанные в дополнение к фронтальным данным. Метаданные содержат информацию о номере сектора и данные CRC. Считывается номер сектора, и контроллер теперь знает, где на самом деле находится головка на диске, и знает, на сколько нужно повернуть диск, чтобы поместить головку в нужный сектор (или, как некоторые называют его блоком). Поскольку (на дискетах и некоторых очень старых жестких дисках) фиксированное количество блоков на каждой дорожке (и каждый блок "занимает" один и тот же угол) контроллер может рассчитать угол, на который ему нужно повернуть диск, чтобы получить нужный блок. рядом с головой. Этот метод определения местоположения также называется цилиндром формы CHS, сектором головки и все еще используется для дискет. Жесткие диски перешли на более удобный метод адресации.
Итак, теперь мы находимся в логической адресации блоков. Идея очень проста. Вместо того, чтобы программист вычислял адрес данных на диске с помощью CHS, мы просто назначим число каждому блоку, точно так же, как каждый байт имеет свой номер в ОЗУ, и получим доступ к данным, используя это. Жесткая электроника выполняет внутреннее преобразование LBA в CHS, и теперь нам не нужно слишком много думать об этом.
Наконец я дошел до области компакт-дисков. Во-первых, я упомяну основное различие между компакт-дисками и жесткими дисками / дискетами: дорожка на CD - это спираль, а не круг. Теперь, когда я сказал это, я немного перейду к истории CD. Поскольку LBA очень прост и удобен в использовании (с точки зрения разработчика ОС и приложения, для программиста прошивки накопителя это сложнее). Уважаемые ученые и инженеры, которые занимались разработкой стандартов на компакт-диски, увидели красоту LBA (которая в то время внедрялась в SCSI, она не станет обычным явлением на домашних компьютерах еще два десятилетия) и решили, что им нужно что-то вроде что на компакт-диске.
Кажется, есть несколько способов получить адрес блока на CD, и я начну с самого простого: номер логического сектора (помните, такие термины, как блок, сектор часто используются так, как будто они имеют одинаковое значение). Используя LSN, вся спираль делится на блоки основных данных размером 2352 байта (которые здесь называются секторами). Каждый блок имеет свой номер. Тогда есть формат адресации LBA. Это LSN-150. Из того, что я прочитал, 150 секторов являются частью начального трека, и эта часть диска должна быть пустой.
Теперь я объясню, что такое "кадр". В основном каждый блок делится на 98 кадров, которые в основном являются своего рода меньшими блоками. Каждый кадр имеет 33 байта данных. Из этих 33 байтов 24 являются фактическими данными, ожидаемыми игроком, и девять - метаданными. Восемь байтов используются для обеспечения исправления ошибок, а один байт используется для предоставления так называемых данных подканала. Из этих подканалов P и Q интересны для нас, поскольку они фактически содержат информацию о местоположении сектора, в котором находятся эти кадры. Канал Q имеет данные о местоположении в абсолютном времени, которые связаны с другой системой блоков, которая является следующей темой. Затем кадр кодируется на диске с использованием схемы модуляции 8-14, и в конце добавляется дополнительное 27-битное слово. Слово специально составлено так, что оно отличается от окружающих данных и используется для разделения двух кадров.
Теперь перейдем к адресации MSF (минута, секунда, кадр). Эта система адресации возникла из-за предполагаемого использования компакт-дисков: цифрового аудио. Должно быть, тогда казалось логичным измерять пространство на диске по количеству времени, в течение которого вы можете воспроизводить звук, используя это пространство. Как я уже сказал, 98 кадров составляют блок. При использовании этой системы адресации в секунду происходит 75 кадров. Интересно то, что здесь "кадр" означает блок, а не кадр, который я обсуждал выше. Также есть, конечно, 60 секунд в минуту. Вот почему мы иногда видим диски, помеченные как 74-минутные или 80-минутные диски.
Я думаю, что наконец-то подошел к той части, которую задал вопрос: как дисковод компакт-дисков знает, где искать. Ну, это работает так же, как HDD и дискеты. Общая схема спирали известна (и накопитель может обнаружить информацию о конкретном диске, когда он вставлен), и головка перемещается в то место, где ожидаются данные. Поскольку для этого используются шаговые двигатели, привод знает точное местоположение головки, и он может легко рассчитать, на сколько шагов он должен двигаться, чтобы добраться до ожидаемого места. Затем он вращает диск так, что ожидаемый блок находится на считывающей головке, и мы готовы. Накопитель получает адрес данных на диске в формате LBA от ОС и выполняет внутреннее преобразование с использованием систем адресации, которые я описал выше. В каждом блоке также есть информация о его местонахождении, что также полезно.