Как указывалось ранее, любое устройство 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 байт.
Типовой блок содержит следующие поля (рис. 5.8):
as OpCode - код операции, 1 байт (графа "Код" в табл. 5.14).
Биты [7:5] определяют группу, а биты [4:0] - код команды.
В группе 0 блок дескриптора имеет длину 6 байт, в группах
1 и 2 - 10 байт, в группе 5-12 байт. Группы 3 и 4 зарезерви-
рованы, группы б и 7 отданы на усмотрение разработчиков.
т LUN - номер ЛУ (для совместимости со SCSI-1), всегда
занимает биты [7:5] байта 1. Если для идентификации ис-
пользуются сообщения Identify, то это поле игнорируется
(рекомендуется устанавливать LUN=0).
LBA - адрес логического блока, 21 бит для 6-байтных
блоков и 32 бит - для 10- и 12-байтных. В ряде команд
поле не используется.
Lengfh - длина (количество блоков или байт) передавае-
мых данных Transfer Length, блока параметров Parameter
List Length или блока, резервируемого И У под данные
Allocation Length (один из трех вариантов в зависимости
от команды). При однобайтном задании длины 0 соответ-
ствует значению 256, в длинных формах 0 указывает на
отсутствие передач. В ряде команд поле не используется.
Control - байт управления. Биты [7:6] отданы на усмот-
рение разработчику, биты [5:2] - зарезервированы, бит 1 -
Flag, бит 0 - Link (служит признаком объединения команд
в цепочку). Flag определяет сообщение, передаваемое в
случае успешного выполнения команд цепочки, при
Flag=i сообщение Linked Command Complete (With Flag)
будет вызывать прерывания между командами цепочки.
Рис. 5.8. Форматы блоков дескрипторов команд: а-б байт,
б-10 байт, в-12 байт
Обратим внимание на порядок байт: первыми передаются
старшие байты (бит MSB - самый старший), за ними - млад-
шие (бит LSB - самый младший). Зарезервированные поля
для совместимости с будущими стандартами должны иметь
нулевые значения.
Исполнение команды завершается в фазе Status передачей
байта состояния Status Byte. Байт не передается, если ко-
манда завершена по сообщению Abort, Abort Tag, Bus Device
Reset, Clear Queue, по условию Hard Reset или в случае не-
ожиданного разъединения. В байте состояния используются
только биты [5:1], возможные состояния приведены в
табл. 5.13 (остальные зарезервированы).
Биты
| Состояние
| Значение
|
RROOOOOR
| Good
| Успешное завершение команды
|
RR00001R
| Check Condition
| Указание на асинхронное событие
|
R R 0 0 0 1 0 R
| Condition Met
| Запрошенная операция выполнена (команды Search Data и Pre-Fetch)
|
R R 0 0 1 0 0 R
| Busy
| Занято (невозможен прием команды)
|
R R 0 1 0 0 0 R
| Intermediate
| Успешное выполнение команды в цепочке
|
RR01010R
| Intermediate Condition Met
| Удовлетворение запрошенной опера- ции в цепочке команд
|
R R 0 1 1 0 0 R
| Reservation Conflict
| Попытка обратиться к ЛУ, зарезер- вированному другим И У
|
RR10001R
| Command Terminated
| Завершение текущего процесса по сообщению Terminate I/O Process или по асинхронному событию
|
R R 1 0 1 0 0 R
| QueueFull
| Очередь (маркированная) заполнена, процесс в очередь не поставлен
|
Набор команд для устройств классов 0-9 приведен в
табл. 5.14. Любое ЦУ SCSI-2 обязано поддерживать четыре
команды: Inquiry, Request Sense, Send Diagnostic, Test Unit
Ready. Они используются для конфигурирования системы,
тестирования устройств и сообщений об ошибках и исклю-
чительных ситуаций. Команда Inquiry позволяет получить
информацию о ЛУ через стандартизованный блок данных
длиной 96 байт: тип подключенного ПУ, возможность сме-
ны носителя, поддержка 32- или 16-битного расширения, син-
хронного обмена, относительной адресации, цепочек ко-
манд, очередей и уведомления об асинхронных событиях.
Здесь же описываются уровень поддержки стандартов SCSI
(ISO, ANSI, ECMA), идентификаторы производителя, уст-
ройства и т. п. Формат блока по усмотрению производителя
может быть расширен.
В графе "Применимость" указаны номера типов ПУ, соот-
ветствующие табл. 5.12 (символ * соответствует всем ти-
пам). Команды для каждого типа устройств могут быть обя-
зательными - номер сопровождается символом m
(Mandatory) - или необязательными - номер типа сопро-
вождается символом о (Optional). Часть команд в устрой-
ствах разных классов реализуется по-разному, что отмече-
но обозначением *z.
Команда
| Код
| Применимость
| Назначение
|
Change Definition
| 40h
| *0
| Модификация определений операций для ЛУ
|
Compare
| 39h
| *0
| Побайтное сравнение данных двухЛУ1
|
Copy
| 18h
| *0
| Копирование данных с одно- го ЛУ на другое'
|
Copy And Verify
| 3Ah
| *0
| Копирование данных с одно- го ЛУ на другое с верифи- кацией1
|
Erase
| 19h
| 1m
| Стирание (участка или до конца носителя)
|
Erase (10)
| 2Ch
| 7o
| То же с 10-байтным блоком дескриптора
|
Erase (12)
| ACh
| 7o
| То же с 12-байтным блоком дескриптора
|
Exchange Medium
| A6h
|
| Обмен носителями между двумя элементами устройства
|
Format
| 04h
| 2o
| Выбор шрифтов и форм
|
Format Unit
| 04h
| Om 7o
| Форматирование устройства
|
Get Data Buffer Status
| 34h
|
| Опрос состояния буфера данных
|
Get Message
| 08h
| 9o
| Прием пакета из коммуни- кационного устройства
|
Команда
| Код
| Применимость
| Назначение
|
Get Message (10)
| 28h
| 9o
| To же с 10-байтным блоком дескриптора
|
Get Message (12)
| A8h
| 9o
| То же с 12-байтным блоком дескриптора
|
Get Window
| 25h
|
| Получение информации о предварительно определен- ном окне
|
Initialize Element Status
| 07h
| 8o
| Инициализация состояния элемента
|
Inquiry
| 12h
| *m
| Опрос типа устройства, уров- ня стандарта, идентифика- тора производителя, модели и т. п.
|
Load Unload
| IBh
| lo
| Загрузка/разгрузка носителя
|
Locate
| 2Bh
| lo
| Позиционирование на заданный логический блок
|
Lock-Unlock Cache
| 36h
| Oo 4o 5o 7o
| Фиксация заданных логи- ческих блоков в кэше устройства и ее отмена
|
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
| *г
| То же с 10-байтньш блоком дескриптора
|
Move Medium
| A5h
| 8ro
| Передача носителя
|
Object Position
| 31h
| 6о
| Позиционирование (загруз- ка/выгрузка) сканируемого объекта
|
Pause/Resume
| 4Bh
| 5о
| Пауза/продолжение воспро- изведения аудио
|
Play Audio (10)
| 45h
| 5о
| Аудиовоспроизведение ука- занных логических блоков
|
Play Audio (12)
| A5h
| 5о
| То же с 12-байтньш блоком дескриптора
|
Play Audio MSF
| 47h
| 5о
| Аудиовоспроизведение с адре- сацией MSF
|
Play Audio Track/Index
| 48h
| 5о
| Аудиовоспроизведение с ука- занием треков и индексов
|
Play Track Relative (10)
| 49h
| 5о
| Аудиовоспроизведение с адре- сацией относительно трека
|
Play Track Relative (12)
| A9h
| 5о
| То же с 12-байтным блоком дескриптора
|
Position To Bement
| 2Bh
| 8о
| Позиционирование транс- портного элемента к указан- ному элементу
|
Pre-Fetch
| 34h
| Оо 4о 5о 7о
| Считывание блоков данных в кэш (без передачи ИУ)
|
Prevent Allow Medium Removal
| lEh
| Оо 1о 4о 5о 7о 8о
| Запрет/разрешение смены носителя в ЛУ
|
Print
| OAh
| 2т
| Печать блока данных
|
Read (6)
| 08h
| От 1т 4о 5о 7о
| Чтение данных (с 6-байтным блоком дескриптора)
|
Read(10)
| 28h
| От 4т 5т 6т 7т
| То же с 10-байтньш блоком дескриптора
|
Read(12)
| A8h
| 4о 5о 7о
| То же с 12-байтным блоком дескриптора
|
Read Block Limits
| 05h
| 1т
| Запрос ограничений на дли- ну блока (минимальная и максимальная длины)
|
Команда
| Код
| Применимость
| Назначение
|
Read Buffer
| 3Ch
| *0
| Чтение буфера
|
Read Capacity
| 25h
| Om 4m 7m
| Определение емкости Л У
|
ReadCd-Rom Capacity
| 25h
| 5m
| Определение емкости CD-ROM (возможно быстрое определение с погрешностью)
|
Read Defect Data
| 37h
| Oo7o
| Чтение списков дефектных блоков (Plist - исходный список от изготовителя, Glist - список, заполняемый при эксплуатации)
|
Read Defect Data (12)
| B7h
| 7o
| То же с 12-байтным блоком дескриптора
|
Read Bement Status
| B8h
|
| Чтение состояния элементов
|
Read Generation
| 29h
| 7o
| Чтение максимально возмож- ного поколения для указан- ного логического блока
|
Read Header
| 44h
| 5o
| Чтение заголовка логического блока CD-ROM
|
Read Long
| 3Eh
| Oo 4o 5o 7o
| "Длинное" чтение - данные блока и поля ЕСС
|
Read Position
| 34h
| lo
| Запрос позиции данных, находящихся в буфере (адрес начала и конца, количество блоков и байт)
|
Read Reverse
| OFh
| lo
| Чтение блоков с текущей по- зиции в обратном направ- лении
|
Read Sub-Channel
| 42h
| 5o
| Чтение данных субканала CD-ROM
|
Read Toe
| 43h
| 5o
| Чтение таблицы содержимого CD-ROM
|
Read Updated Block
| 2Dh
| 7o
| Чтение определенного поко- ления обновленного логичес- кого блока
|
Reassign Blocks
| 07h
| Oo4o7o
| Переназначение дефектных блоков
|
Команда
| Код
| Применимость
| Назначение
|
Receive
| 08h
| 3o
| Прием пакета
|
Receive Diagnostic Results
| ICh
| *o
| Получение результатов диа- гностики
|
Recover Buffered Data
| 14h
| lo2o
| Восстановление данных, по- сланных в буфер, но не запи- санных (не напечатанных) из-за ошибки
|
Release
| 17h
| Om 2m 4m 5m 6m 7m 80
| Освобождение зарезервиро- ванного ЛУ, экстента или элемента
|
Request Sense
| 03h
| Jj
| Опрос уточненного состояния
|
Request Volume Element Address
| B5h
|
| Передача результатов коман- ды SEND VOLUME TAG
|
Reserve
| 16h
| Om 1m 2m 4m 5m 6m 7m 80
| Предотвращение использо- вания Л У (его экстента или элемента) другим ИУ
|
f i\y^flli^J
| Olh
| 1m
| Перемотка носителя к началу раздела
|
Rezero Unit
| Olh
| Oo 4o 5o 7o 80
| Приведение ЛУ в определен- ное состояние
|
Scan
| IBh
| 6o
| Сканирование данных в определенном окне
|
Search Data Equal
| 31h
| Oo 4o 5o 7o
| Поиск данных, (не) совпа- дающих с эталоном2
|
Search Data Equal (12)
| Blh
| 4o 5o 7o
| То же с 12-байтным блоком дескриптора2
|
Search Data High
| 30h
| Oo 4o 5o 7o
| Поиск данных, (не) больших эталона2
|
Search Data High (12)
| BOh
| 4o 5o 7o
| То же с 12-байтным блоком дескриптора2
|
Search Data Low
| 32h
| Oo5o7o
| Поиск данных, (не) меньших эталона2
|
Search Data Low (12)
| B2h
| 4o 5o 7o
| То же с 12-байтным блоком дескриптора2
|
Seek(6)
| OBh
| Oo 4o 5o 7o
| Позиционирование (с 6-байт- ным блоком дескриптора)3
|
Команда
| Код
| Применимость
| Назначение
|
Seek(10)
| 2Bh
| Oo 4o 5o 7o
| Позиционирование - поиск логического адреса (с 10-байт- ным блоком дескриптора)3
|
Send
| OAh
| 3m
| Посылка пакета
|
Send (10)
| 2Ah
|
| Посылка данных в устройство
|
Send Diagnostic
| IDh
| *m
| Запуск теста ЦУ. Ответом будет состояние Good, если тест прошел успешно, или Check Condition в случае ошибки
|
Send Message
| OAh
| 9m
| Посылка пакета в коммуни- кационное устройство
|
Send Message (10)
| 2Ah
| 9o
| То же с 10-байтным блоком дескриптора
|
Send Message (12)
| AAh
| 9o
| То же с 12-байтным блоком дескриптора
|
Send Volume Tag
| B6h
|
| Посылка тега тома (шаблона) для поиска его в элементах или создания нового тега
|
Set Limits
| 33h
| Oo 4o 5o 7o
| Определение области логи- ческих адресов, над которыми могут выполняться операции цепочки команд
|
Set Limits (12)
| B3h
| 4o 5o 7o
| То же с 12-байтным блоком дескриптора
|
Set Window
| 24h
| 6m
| Определение окна сканиро- вания
|
Slew And Print
| OBh
| 2o
| Прогон бумаги и печать
|
Space
| llh
| 1m
| Относительное позициони- рование (вперед и назад) на заданное число блоков, файлов, маркеров и т. п.
|
Start Stop Unit
| IBh
| Oo 4o 5o 7o
| Разрешение/запрет операций с носителем, извлечение но- сителя*
|
Stop Print
| IBh
| 2o
| Останов печати с очисткой буфера или без нее
|
Конаида
| Код
| Применимость
| Назначение
|
Synchronize Buffer
| lOh
| 2o
| Синхронизация буфера - печать всего содержимого, при невозможности - сооб- щение об ошибке
|
Synchronize Cache
| 35h
| Oo 4o 5o 7o
| Синхронизация кэша - запись несохраненных дан- ных заданного диапазона ад- ресов на носитель
|
Test Unit Ready
| OOh
| *m
| Опрос готовности ЛУ
|
Update Block
| 3Dh
| 7o
| Обновление логического блока
|
Verify
| 2Fh
| Oo5o7o
| Верификация - проверка возможности безошибочного считывания блоков данных с носителя
|
Verify
| 13h
| lo
| Тоже
|
Verify (10)
| 2Fh
| 4o5o7o
| То же или проверка чистоты блоков (с 10-байтным блоком дескриптора)
|
Verify (12)
| AFh
| 4o 5o 7o
| То же с 12-байтным блоком дескриптора
|
Write (6)
| OAh
| Oo 1m 4o 7o
| Запись блоков данных, переданных ИУ (с 6-байт- ным блоком дескриптора)
|
Write (10)
| 2Ah
| Oo4m 7m
| Запись блоков данных, переданных ИУ (с 10-байт- ным блоком дескриптора)
|
Write (12)
| AAh
| 4o7o
| То же с 10-байтным блоком дескриптора
|
Write And Verify
| 2Eh
| Oo4o7o
| Запись блоков данных, переданных ИУ, с верифика- цией записи
|
Write And Verify (12)
| AEh
| 7o4o
| То же с 12-байтным блоком дескриптора
|
Write Buffer
| 3Bh
| *o
| Запись в буфер (но не на носитель) или загрузка микрокода
|
Команда
| Код
| Применимость
| Назначение
|
Write Filemarks
| lOh
| 1m
| Запись маркера файлов
|
Write Long
| 3Fh
| Oo4o7o
| "Длинная" запись - блока данных и поля ЕСС
|
Write Same
| 41h
| Oo
| Запись блока данных, пере- данных ИУ, в группу смеж- ных блоков или до конца носителя5
|
1 Команды копирования и сравнения данных оперируют парой Л У, ко-
торые могут принадлежать как одному ЦУ, так и разным, если эту воз-
можность поддерживает ведущее устройство копирования - Copy
Master. Копирование возможно между устройствами любых классов.
Для устройств типов 8 и 9 эти команды не применяются.
2 Данные ищутся сравнением указанного числа логических записей с
эталоном. Логические записи определяются длиной, начальным логи-
ческим блоком и смещением внутри него. Можно потребовать попада-
ния искомых данных в один логический блок.
3 Команда эффективна для ленточных устройств прямого доступа.
4 Команда STOP UNIT для устройств с кэшированием перед остановом
автоматически выполняет синхронизацию кэша.
5 Первые 4 байта в записываемых блоках могут быть заменены на физи-
ческий или логический адрес блока.
5.6. Выполнение команд
Мы не будем рассматривать различные ситуации, приводя-
щие к отклонениям от нормальной последовательности со-
бытий интерфейса. К ним относятся некорректные соедине-
ния со стороны ИУ, выбор несуществующего ЛУ,
неожиданные выборки ИУ, округление параметров, реакция
на асинхронные события и т. п.
Рассмотрим процесс на шине SCSI на примере одиночной
команды чтения Read. ИУ имеет активный набор указате-
лей и несколько сохраненных наборов, по одному на каж-
дый из допустимого числа одновременных конкурирующих
процессов. ИУ восстанавливает указатели процесса в актив-
ный набор и, выиграв арбитраж, выбирает ЦУ. Как только
ЦУ выбрано, оно берет на себя управление процессом. В фазе
Selection И У вводит сигнал ATN^, сообщая о намерении по-
слать сообщение Identify с указанием адресуемого ЛУ. Та-
ким образом устанавливается связь 1_T_L с данным процес-
сом и его набором указателей. ЦУ переходит в фазу Command
и принимает блок дескриптора команды Read. Интерпрети-
ровав команду, ЦУ переходит в фазу Data IN, передает дан-
ные, затем переводится в фазу Status и посылает состояние
Good. Затем в фазе Message IN устройство посылает сообще-
ние Command Complete, после чего освобождает шину (фаза
Bus Free). Процесс завершен.
Рассмотрим тот же пример, но с использованием отключения
от шины (Disconnect) в процессе выполнения команды. Если
устройство определит, что для получения затребованных дан-
ных потребуется много времени, получив команду Read, оно
освобождает шину, послав сообщение Disconnect. Как только
требуемые данные готовы в ЦУ, оно, выиграв арбитраж, вы-
берет ИУ (в фазе Reselect) и в фазе Message IN пошлет ему
сообщение Identify. По определенной этим сообщением свя-
зи 1_T_L ИУ восстановит соответствующий набор указате-
лей в активный и продолжит выполнение процесса, как опи-
сано выше. Если ЦУ хочет отсоединиться, когда часть данных
уже передана (например, головка дошла до конца цилиндра
и требуется время на позиционирование), оно посылает со-
общение Save Data Pointer, а затем Disconnect. После повтор-
ного соединения передача данных возобновится с точки,
определенной последним сохраненным значением указате-
ля. Если произошла ошибка или исключение, ЦУ может по-
вторить обмен данными, послав сообщение Restore Pointers
или отсоединившись без сообщения Save Data Pointers.
Теперь рассмотрим процесс с цепочкой связанных команд. По
успешному завершению каждой команды цепочки ЦУ авто-
матически переходит к исполнению следующей. Все коман-
ды цепочки адресуются к одной и той же связи 1_Т_х и яв-
ляются частью одного процесса. Команды не являются
полностью независимыми: при использовании бита относи-
тельной адресации последний блок, адресованный предыду-
щей командой, доступен для следующей. Так, например, мож-
но исполнить команду Search Data, по которой на диске будет
найден блок, содержащий информацию, совпадающую с эта-
лоном поиска. Связав с ней команду чтения Read, можно
прочитать этот блок или блок с указанным смещением от-
носительно найденного. По выполнении связанных команд
ЦУ посылает сообщения Linked Command Complete (возмож-
но, с флагом), а ИУ обновляет набор сохраненных указате-
лей так, что они указывают на очередную команду цепочки.
Команды в цепочке выполняются как одиночные, но с воз-
можностью относительной адресации.
Команды могут исполняться с использованием очередей. ЦУ
могут поддерживать немаркированные и маркированные
очереди. Поддержка немаркированных очередей, определен-
ная еще в SCSI-1, позволяет любому ЛУ (LUN) или целевой
программе (TRN), занятым процессом от одного ИУ, прини-
мать команды (начинать процесс) с другими И У. При этом
каждый процесс идентифицируется связью 1_Т_х, где х - LUN
или TRN.
Маркированные очереди (Tagged Queue) определены в SCSI-2
для ЛУ (LUN, но не TRN). Для каждой связи 1_T_L суще-
ствует своя очередь размером до 256 процессов (немаркиро-
ванные очереди можно считать вырожденным случаем мар-
кированных с одноместными очередями). Каждый процесс,
использующий маркированные очереди, идентифицируется
связью 1_T_L_Q, где Q - однобайтный тег очереди (Queue Tag).
Теги процессам назначаются ИУ, их значения на порядок
выполнения операций не влияют. Повторное использование
тега возможно лишь по завершении процесса с этим тегом.
Постановка в очередь выполняется через механизм сообще-
ний, при этом очередной процесс можно поставить в оче-
редь "по-честному", а можно пропихнуть вне очереди: про-
цесс, поставленный в очередь с сообщением Head Of Queue
Tag, будет выполняться сразу после завершения текущего
активного процесса. Процессы, поставленные в очередь с со-
общением Simple Queue Tag, исполняются ЦУ в порядке, ко-
торый оно сочтет оптимальным. Процесс, поставленный в
очередь с сообщением Ordered Queue Tag, будет исполняться
последним. ИУ может удалить процесс из очереди, сослав-
шись на него по тегу. Изменение порядка выполнения ко-
манд ЦУ не касается порядка команд в цепочке, поскольку
цепочка принадлежит одному процессу, а в очередь ставят-
ся именно процессы.