в начало
Как указывалось ранее, любое устройство SCSI на шине адресуется идентификатором SCSI ID, соответствующим заданному уникальному адресу. В ЦУ может быть определено до 8 ЛУ со своими номерами LUN (Logical Unit Number) в диапазоне 0-7. Понятие LUN неприменимо к ИУ, но SCSI-устройство двойного назначения может иметь ЛУ.
Система команд и сообщений позволяет адресовать как ЦУ в целом, так и любое его ЛУ. В ЦУ может быть определено до 8 целевых программ TRN (Target Routine), которые не имеют непосредственной привязки к ЛУ. Целевые программы появились в SCSI-2, их адресация также производится через сообщения.
Система команд SCSI включает общие команды, применимые для устройств всех классов, и специфические для каждого класса. Как общие, так и специфические наборы команд содержат обязательные (Mandatory), дополнительные (Optional) и фирменные (Vendor Specific) команды. Любое SCSI-устройство должно поддерживать обязательные команды общего набора и своего класса, чем обеспечивается высокий уровень совместимости. Команда передается ИУ в ЦУ через блок дескриптора команды Command Descriptor Block, посылаемый в фазе Command. Некоторые команды сопровождаются блоком параметров, следующим за блоком дескриптора в фазе Data. Форматы блоков стандартизованы, длина блока определяется кодом операции Operation Code, который всегда является первым байтом блока и может составлять 6, 10 или 12 байт. Типовой блок содержит следующие поля (таблица 3.14):
· OpCode - код операции, 1 байт (графа "Код" в таблице 3.16). Биты [7:5] определяют группу, а биты [4:0] - код команды. В группе 0 блок дескриптора имеет длину 6 байт, в группах 1 и 2 -10 байт, в группе 5 -12 байт. Группы 3 и 4 зарезервированы, группы 6 и 7 отданы на усмотрение разработчиков.
· LUN - номер ЛУ (для совместимости со SCSI-1), всегда занимает биты [7:5] байта 1. Если для идентификации используются сообщения Identify, то это поле игнорируется (рекомендуется устанавливать LUN=0).
· LBA - адрес логического блока, 21 бит для 6-байтных блоков и 32 бит - для 10- и 12- байтных. В ряде команд поле не используется.
· Length - длина (количество блоков или байт) передаваемых данных Transfer Length, блока параметров Parameter List Length или блока, резервируемого ИУ под данные Allocation Length (один из трех вариантов в зависимости от команды). При однобайтном задании длины 0 соответствует значению 256, в длинных формах 0 указывает на отсутствие передач. В ряде команд поле не используется.
· Control - байт управления. Биты [7:6] отданы на усмотрение разработчику, биты [5:2] - зарезервированы, бит 1 - Flag, бит 0 - Link (служит признаком объединения команд в цепочку). Flag определяет сообщение, передаваемое в случае успешного выполнения команд цепочки, при Flag=1 сообщение Linked Command Complete (With Flag) будет вызывать прерывания между командами цепочки.
Таблица 3.14. Форматы блоков дескрипторов команд: а - 6 байт, б - 10 байт, в - 12 байт.
7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | ||||
OpCode | |||||
LUN Резерв | |||||
OpCode | (MSB) | ||||
LUN Резерв | |||||
(MSB) | ---LBA--- | ||||
7 6 5 4 3 2 1 0 | (LSB) | ||||
OpCode | ---LBA--- | (MSB) | |||
LUN (MSB) | (LSB) | ||||
---LBA--- | Резерв | Length | |||
(LSB) | (MSB)Length | (LSB) | |||
Length | (LSB) | Резерв | |||
Control | Control | Control | |||
a | б | в |
Обратим внимание на порядок байт: первыми передаются старшие байты (бит MSB - самый старший), за ними - младшие (бит LSB - самый младший). Зарезервированные поля для совместимости с будущими стандартами должны иметь нулевые значения.
Исполнение команды завершается в фазе Status передачей байта состояния Status Byte. Байт не передается, если команда завершена по сообщению Abort, Abort Tag, Bus Device Reset, Clear Queue, по условию Hard Reset или в случае неожиданного разъединения. В байте состояния используются только биты [5:1], возможные состояния приведены в таблице 3.15 (остальные зарезервированы).
Таблица 3.15. Байты состояния
Биты 7 6 5 4 3 2 1 0 | Состояние | Значение |
RROOOOOR | Good | Успешное завершение команды |
RROOOO1R | Check Condition | Указание на асинхронное событие |
RROOO1OR | Condition Met | Запрошенная операция выполнена (команды Search Data и Pre-Fetch) |
RROO1OOR | Busy | Занято (невозможен прием команды) |
RRO1OOOR | Intermediate | Успешное выполнение команды в цепочке |
RRO1O1OR | Intermediate Condition Met | Удовлетворение запрошенной операции в цепочке команд |
RRO11OOR | Reservation Confhct | Попытка обратиться к ЛУ, зарезервированному другим ИУ |
RR1OOO1R | Command Termmted | Завершение текущего процесса по сообщению Terminate I/O Process или по асинхронному событию |
RR1O1OOR | Queue Full | Очередь (маркированная) заполнена, процесс в очередь не поставлен |
Набор команд для устройств классов 0-9 приведен в таблице 3.16. Любое ЦУ SCSI-2 обязано поддерживать четыре команды: Inquiry, Request Sense, Send Diagnostic, Test Unit Ready. Они используются для конфигурирования системы, тестирования устройств и сообщений об ошибках и исключительных ситуаций. Команда Inquiry позволяет получить информацию о ЛУ через стандартизованный блок данных длиной 96 байт: тип подключенного ПУ, возможность смены носителя, поддержка 32- или 16-битного расширения, синхронного обмена, относительной адресации, цепочек команд, очередей и уведомления об асинхронных событиях.
Здесь же описываются уровень поддержки стандартов SCSI (ISO, ANSI, ЕСМА), идентификаторы производителя, устройства и т. п. Формат блока по усмотрению производителя может быть расширен.
В графе "Применимость" указаны номера типов ПУ, соответствующие таблице 3.16 (символ * соответствует всем типам). Команды для каждого типа устройств могут быть обязательными - номер сопровождается символом m (Mandatory) - или необязательными - номер типа сопровождается символом о (Optional). Часть команд в устройствах разных классов реализуется по-разному, что отмечено обозначением *z.
Таблица 3.16. Команды SCSI
Команда | Код | Применимость | Назначение |
Change Definition | 40h | *o | Модификация определений операций для ЛУ |
Compare | 39h | *o | Побайтное сравнение данных двух ЛУ * |
Copy | 18h | *o | Копирование данных с одного ЛУ на другое * |
Copy And Verify | 3Ah | *o | Копирование данных с одного ЛУ на другое с верификацией * |
Erase | 19h | 1m | Стирание (участка или до конца носителя) |
Erase (10) | 2Ch | 7o | То же с 10-байтным блоком дескриптора |
Erase (12) | ACh | 7o | То же с 12-байтным блоком дескриптора |
Exchange Medium | A6h | 8o | Обмен носителями между двумя элементами устройства |
Format | 04h | 2o | Выбор шрифтов и форм |
Format Unit | 04h | 0m 7o | Форматирование устройства |
Get Data Buffer Status | 34h | 6o | Опрос состояния буфера данных |
Get Message | 08h | 9o | Прием пакета из коммуникационного устройства |
Get Message (10) | 28h | 9o | То же с 10-байтным блоком дескриптора |
Get Message (12) | A8h | 9o | То же с 12-байтпым блоком дескриптора |
Get Window | 25h | 6o | Получение информации о предварительно определенном окне |
Initialize Element Status | 07h | 8o | Инициализация состояния элемента |
Inquiry | 12h | *m | Опрос типа устройства, уровня стандарта, идентификатора производителя, модели и т.п. |
Load Unload | 1Bh | 1o | Загрузка/разгрузка носителя |
Locate | 2Bh | 1o | Позиционирование на заданный логический блок |
Lock-Unlock Cache | 36h | 0o4o5o7o | Фиксация заданных логических блоков в кэше устройства и ее отмена |
Log Select | 4Ch | *o | Запись статистической информации, обработка которой поддерживается устройством, в ЦУ или ЛУ |
Log Sense | 4Dh | *o | Считывание статистической информации с ЦУ или ЛУ |
Medium Scan | 38h | 4o7o | Сканирование - поиск непрерывной области чистых или записанных блоков |
Mode Select (6) | 15h | *z | Запись параметров носителя, ЦУ или ЛУ (с 6-байтным блоком дескриптора) |
Mode Select (10) | 55h | *z | То же с 10-байтным блоком дескриптора |
Mode Sense (6) | lAh | *z | Считывание параметров носителя, ЦУ или ЛУ (с 6-байтиым блоком дескриптора) |
Mode Sense (10) | 5Ah | *z | То же с 10-байтным блоком дескриптора |
Move Medium | A5h | 8m | Передача носителя |
Object Position | 31h | 6o | Позиционирование (загрузка/выгрузка) сканируемого объекта |
Pause/Resume | 4Bh | 5o | Пауза/продолжение воспроизведения аудио |
Play Audio (10) | 45h | 5o | Аудио воспроизведение указанных логических блоков |
Play Audio (12) | A5h | 5o | То же с 12-байтным блоком дескриптора |
Play Audio MSF | 47h | 5o | Аудио воспроизведение с адресацией MSF |
Play Audio Track/Index | 48h | 5o | Аудио воспроизведение с указанием треков и индексов |
Play Track Relative (10) | 49h | 5o | Аудио воспроизведение с адресацией относительно трека |
Play Track Relative (12) | A9h | 5o | То же с 12-байтным блоком дескриптора |
Position To Bement | 2Bh | 8o | Позиционирование транспортного элемента к указанному элементу |
Prefetch | 34h | 0o4o5o7o | Считывание блоков данных в кэш (без передачи ИУ) |
Prevent Allow Medium Removal | 1Eh | 0o1o4o5o7o8o | Запрет/разрешение смены носителя в ЛУ |
0Ah | 2m | Печать блока данных | |
Read(6) | 08h | 0m 1m 4o 5o 7o | Чтение данных (с 6-байтным блоком дескриптора) |
Read (10) | 28h | 0m 4m 5m 6m 7m | То же с 10-байтным блоком дескриптора |
Read (12) | A8h | 4o 5o 7o | То же с 12-байтным блоком дескриптора |
Read Block Limits | 05h | 1m | Запрос ограничений на длину блока (минимальная и максимальная длины) |
Read Buffer | 3Ch | *o | Чтение буфера |
Read Capacity | 25h | 0m 4m 7m | Определение емкости ЛУ |
Read Cd-Rom Capacity | 25h | 5m | Определение емкости CD-ROM (возможно быстрое определение с погрешностью) . |
Read Defect Data | 37h | 0o7o | Чтение списков дефектных блоков (Plist - исходный список от изготовителя, Glist - список, заполняемый при эксплуатации) |
Read Defect Data (12) | B7h | 7o | То же с 12-байтным блоком дескриптора |
Read Element Status | B8h | 8o | Чтение состояния элементов |
Read Generation | 29h | 7o | Чтение максимально возможного поколения для указанного логического блока |
Read Header | 44h | 5o | Чтение заголовка логического блока CD-ROM |
Read Long | 3Eh | 0o4o5o7o | "Длинное" чтение - данные блока и поля ЕСС |
Read Position | 34h | 1o | Запрос позиции данных, находящихся в буфере (адрес начала и конца, количество блоков и байт) |
Read Reverse | 0Fh | 1o | Чтение блоков с текущей позиции в обратном направлении |
Read Sub-Channel | 42h | 5o | Чтение данных субканала CD-ROM |
Read Toc | 43h | 5o | Чтение таблицы содержимого CD-ROM |
Read Updated Block | 2Dh | 7o | Чтение определенного поколения обновленного логического блока |
Reassign Blocks | 07h | 0o 4o 7o | Переназначение дефектных блоков |
Receive | 08h | 3o | Прием пакета |
Receive Diagnostic Results | 1Ch | *o | Получение результатов диагностики |
Recover Buffered Data | 14h | 1o2o | Восстановление данных, посланных в буфер, но не записанных (не напечатанных) из-за ошибки |
Release | 17h | 0m 2m 4m 5m 6m 7m 8o | Освобождение зарезервированного ЛУ, экстента или элемента |
Request Sense | 03h | *m | Опрос уточненного состояния |
Request Volume Element Address | B5h | 8o | Передача результатов команды SEND VOLUME TAG |
Reserve | 16h | 0m 1m 2m 4m 5m 6m 7m 80 | Предотвращение использования ЛУ (его экстента или элемента) другим ИУ |
Rewind | 0lh | 1m | Перемотка носителя к началу раздела |
Rezero Unit | 0lh | 0o4o5o7o8o | Приведение ЛУ в определенное состояние |
Scan | 1Bh | 6o | Сканирование данных в определенном окне |
Search Data Equal | 31h | 0o4o5o7o | Поиск данных, (не) совпадающих с эталоном * |
Search Data Equal (12) | Blh | 4o 5o 7o | То же с 12-байтным блоком дескриптора * |
Search Data High | 30h | 0o4o5o7o | Поиск данных, (не) больших эталона * |
Search Data High (12) | B0h | 4o 5o 7o | То же с 12-байтным блоком дескриптора * |
Search Data Low | 32h | 0o5o7o | Поиск данных, (не) меньших эталона * |
Search Data Low (12) | B2h | 4o 5o 7o | То же с 12-байтным блоком дескриптора * |
Seek(6) | 0Bh | 0o4o5o7o | Позиционирование (с 6-байт-ным блоком дескриптора) * |
Seek(10) | 2Bh | 0o4o5o7o | Позиционирование - поиск логического адреса (с 10-байтным блоком дескриптора ) * |
Send | 0Ah | 3m | Посылка пакета |
Send(10) | 2Ah | 6o | Посылка данных в устройство |
Send Diagnostic | 1Dh | *m | Запуск теста ЦУ. Ответом будет состояние Good, если тест прошел успешно, или Check Conditum в случае ошибки |
Send Message | 0Ah | 9m | Посылка пакета в коммуникационное устройство |
Send Message (10) | 2Ah | 9o | То же с 10-байтным блоком дескриптора |
Send Message (12) | AAh | 9o | То же с 1.2-байтным блоком дескриптора |
Send Volume Tag | B6h | 8o | Посылка тега тома (шаблона) для поиска его в элементах или создания нового тега |
Set Limits | 33h | 0o4o5o7o | Определение области логических адресов, над которыми могут выполняться операции цепочки команд |
Set Limits (12) | B3h | 4o5o7o | То же с 12-байтным блоком дескриптора |
Set Window | 24h | 6m | Определение окна сканирования |
Slew And Print | 0Bh | 2o | Прогон бумаги и печать |
Space | 11h | 1m | Относительное позиционирование (вперед и назад) на заданное число блоков, файлов, маркеров и т. п. |
Start Stop Unit | 1Bh | 0o4o5o7o | Разрешение/запрет операций с носителем, извлечение носителя * |
Stop Print | 1Bh | 2o | Останов печати с очисткой буфера или без нее |
Synchronize Buffer | 10h | 2o | Синхронизация буфера - печать всего содержимого, при невозможности - сообщение об ошибке |
Synchronize Cache | 35h | 0o4o5o7o | Синхронизация кэша - запись несохраненных данных заданного диапазона адресов на носитель |
Test Unit Ready | 00h | *m | Опрос готовности ЛУ |
Update Block | 3Dh | 7o | Обновление логического блока |
Verify | 2Fh | 0o5o7o | Верификация - проверка возможности безошибочного считывания блоков данных с носителя |
Verify | 13h | 1o | Тоже |
Verify(10) | 2Fh | 4o5o7o | То же или проверка чистоты блоков (с 10-байтным блоком дескриптора) |
Verify (12) | AFh | 4o 5o 7o | То же с 12-байтным блоком дескриптора |
Write (6) | OAh | 0o 1m 4o 7o | Запись блоков данных, переданных ИУ (с 6-байтным блоком дескриптора) |
Write (10) | 2Ah | 0o4m 7m | Запись блоков данных, переданных ИУ (с 10-байтным блоком дескриптора) |
Write (12) | AAh | 4o7o | То же с 10-байтным блоком дескриптора |
Write And Verify | 2Eh | 0o4o7o | Запись блоков данных, переданных ИУ, с верификацией записи |
Write And Verify (12) | AEh | 7o4o | То же с 12-байтным блоком дескриптора |
Write Buffer | 3Bh | *o | Запись в буфер (но не на носитель) или загрузка микрокода |
Write Filemarks | 10h | 1m | Запись маркера файлов |
Write Long | 3Fh | 0o4o7o | "Длинная" запись - блока данных и поля ЕСС |
Write Same | 41h | 0o | Запись блока данных, переданных ИУ, в группу смежных блоков или до конца носителя * |
* Команды копирования и сравнения данных оперируют парой ЛУ, которые могут принадлежать как одному ЦУ, так и разным, если эту возможность поддерживает ведущее устройство копирования - Copy Master. Копирование возможно между устройствами любых классов. Для устройств типов 8 и 9 эти команды не применяются.
* Данные ищутся сравнением указанного числа логических записей с эталоном. Логические записи определяются длиной, начальным логическим блоком и смещением внутри него. Можно потребовать попадания искомых данных в один логический блок.
* Команда эффективна для ленточных устройств прямого доступа.
* Команда STOP UNIT для устройств с кэшированием перед остановом автоматически выполняет синхронизацию кэша.
* Первые 4 байта в записываемых блоках могут быть заменены физическим или логическим адресом блока.