Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Рисунок 10. Блок данных sense data, возвращаемый командой REQUEST SENSE
Три поля данной структуры – Sense Key, Additional Sense Code (ASC), Additional Sense Code Qualifier – позволяют точно установить причину ошибки. Допустимые значения этих полей и их описание ошибочной ситуации приведены в спецификации INF-8020i, таблицы 140 и 141, стр. 183 – 185.
Анализ ошибочной ситуации выполняет функция request_sense():
int request_sense()
{
int i = 0;
__u8 cmd_buff[12];
__u8 sense_buff[14];
__u16 a;
memset((void *)cmd_buff, 0, 12);
memset((void *)sense_buff, 0, 14);
/* Формируем пакетную команду REQUEST SENSE. Из блока sense data считываем первые 14 байт – этого нам хватит,
* чтобы определить причину ошибки
*/
cmd_buff[0] = 0x3;
cmd_buff[4] = 14;
/* Посылаем устройству команду и считываем sense data */
if(send_packet_data_command(14, cmd_buff) < 0) exit(-1);
for(i = 0; i < 14; i += 2) {
IN_P_W(a, 0x170);
memcpy((void *)(sense_buff + i), (void *)&a, 2);
}
printf("Sense key - 0x%X ", sense_buff[2] & 0x0F);
printf("ASC - 0x%X ", sense_buff[12]);
printf("ASCQ - 0x%X ", sense_buff[13]);
return 0;
}
Полный листинг программы чтения RAW-секторов с компакт-диска находится в файле RAW/read_sector.c. Приведём пример работы этой программы. С компакт-диска считывается сектор номер 1000. В результате работы будет создан файл sector. Посмотрим на первые 16 байт этого файла:
00 FF FF FF FF FF FF FF FF FF FF 00 00 15 25 01
Первые 12 байт – это поле синхронизации Sync-сектора (см. рис. 6). Следующие за ним 3 байта – координаты сектора в формате MSF, значения представлены в BCD-коде. Последний байт содержит значение режима записи данных, Data Mode.
Пересчитаем координаты сектора из MS- формата в LBA по формуле (см. [3, 4]):
LBA = ((Minute * 60 + Second) * 75 + Frame) – 150
В нашем примере, Minute = 00, Second = 15, Frame = 25. Подставив значения в формулу, получаем LBA = 1000. Именно этот сектор мы считывали.
Теперь проверим, как обрабатываются ошибочные ситуации. Удалим из привода компакт-диск и запустим программу на выполнение. В результате программа выдаст следующее:
Sense key = 0x2
ASC = 0x3A
ASCQ = 0x0
За расшифровкой обратимся к таблицам 140 и 141. Значение Sense key, равное 0x2, означает «NOT READY. Indicates that the Device cannot be accessed», ASC=0x3A и ASCQ=0x0 – «MEDIUM NOT PRESENT». Устройство сообщило о том, что компакт-диск в приводе отсутствует.
Теперь попытаемся прочитать сектор, номер которого заведомо превышает допустимое значение. В программе задаем LBA = 10000000 и получаем в результате:
Sense key = 0x5 - ILLEGAL REQUEST
ASC = 0x21 - LOGICAL BLOCK ADDRESS OUT OF RANGE
ASCQ = 0x0
В этом случае устройство сообщает, что логический адрес сектора вышел за пределы допустимого диапазона.
Q-субканал Lead-In области компакт-диска содержит таблицу содержания диска, Table of Contents, или TOC. Это своеобразный аналог таблицы разделов жесткого диска. В TOC хранятся данные о координатах треков и другая служебная информация.
Чтение таблицы содержания диска выполняется командой READ TOC. Формат этой команды представлен на рис. 11.
READ TOC Command
Bit Byte |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
Operation code (43h) |
|||||||
1 |
Reserved |
MSF (Mandatory) |
Reserved |
|||||
2 |
Reserved |
Format |
||||||
3 |
Reserved |
|||||||
4 |
Reserved |
|||||||
5 |
Reserved |
|||||||
6 |
Starting Track / Session Number |
|||||||
7 |
MSB |
Allocation Length |
LSB |
|||||
8 |
||||||||
9 |
Format |
Reserved |
||||||
10 |
Reserved |
|||||||
11 |
Reserved |