Адресация и система команд

в начало

Как указывалось ранее, любое устройство 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 Запрет/разрешение смены носителя в ЛУ
Print 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 байта в записываемых блоках могут быть заменены физическим или логическим адресом блока.