SCSI - интерфейс для подключения периферийных устройств.

История интерфейса для малой компьютерной системы (Small Computer System Interface, SCSI) начинается в 80-х годах, когда появились его первые варианты на базе системного интерфейса Sugart Associates (Sugart Associates System Interface, SASI). Целью его разработки было создание интеллектуальной, независимой от устройства шины для подключения периферии к ПК и рабочим станциям.

В те времена основным периферийным устройством для мини-компьютеров был жесткий диск, поэтому SCSI пришлось испытать жесткую конкуренцию с более распространенной технологией для дисков со сходными возможностями под названием «усовершенствованная архитектура небольших устройств» (Enhanced Small Device Architecture, ESDI). Однако обещанное, а затем достигнутое в следующем поколении, SCSI-2, повышение производительности позволило ему одержать победу в конкурентной борьбе c ESDI.

Между тем жизнь не стоит на месте, и с тех пор у SCSI появились новые соперники. Но дело даже не в этом, а в активном развитии компьютерных технологий и приложений. В частности, как известно, скорость доступа к диску удваивается каждые два года, а это требует соответствующего увеличения скорости шины, к тому же для нормального обслуживания подключенных устройств она должна быть приблизительно в четыре раза выше, чем у диска. Это привело к усовершенствованию интерфейса и появлению многочисленных его разновидностей — Fast, Wide, Ultra, Ultra2 и их комбинаций. Но и их возможностей уже становится недостаточно для некоторых приложений, поэтому отвечающий за разработку стандарта комитет T10 приступил к выработке радикально новой спецификации SCSI-3.

SCSI-1 В ОБЩИХ ЧЕРТАХ

Стандарт на SCSI (тогда, естественно, SCSI-2 еще не было, поэтому цифра «1» не добавлялась) был принят Американским национальным институтом стандартов (American National Standard Institute, ANSI) в 1986 году. Он определял два режима передачи — асинхронный и синхронный — и позволял иметь до 8 устройств на одной шине общей протяженностью 6 м с параллельной передачей данных. Каждое из устройств могло адресовать до 8 подсистем — так называемых логических единиц (Logical Unit, LU).

SCSI-1 имел максимальную скорость передачи в 5 Мбайт/с в синхронном режиме, однако реальная пропускная способность была намного ниже из-за накладных расходов со стороны самого устройства SCSI, главного адаптера шины, оборудования хоста, драйвера ввода/вывода и операционной системы. Кроме того, собственно передача данных занимала лишь часть времени при выполнении команды, а передача команд осуществлялась в асинхронном режиме. В результате влияния всех факторов общие накладные расходы могли достигать 90%! К тому же практически все ранние реализации использовали асинхронный режим, для которого пиковая скорость равнялась 1, в лучшем случае 2 Мбайт/с.

Устройства подключались в цепочку друг за другом. Первое устройство подключалось к интерфейсу SCSI на главном компьютере, второе — к первому и т. д. (см. Рисунок 1). Первое и последнее устройства в цепочке должны были быть терминированы. На всех остальных устройствах терминирование необходимо было отключить. Устройства идентифицировались посредством задаваемого с помощью перемычек (jumper) или переключателей ID (от 0 до 7), при этом адаптеру шины на хосте присваивался, как правило, ID=7 как дающий наивысший приоритет при доступе к шине. Ниже в соответствующих разделах мы рассмотрим вопросы терминирования, адресации, арбитража и др. более подробно.

Рисунок 1. Типовая схема подключения SCSI-устройств в виде цепочки.

Стандарт не обязывал использовать какой-то определенный тип соединителей (коннекторов), а лишь описывал назначение контактов. Наибольшее распространение получили соединители D-Ribbon типа Centronics для ПК, а также DB-25 для Macintosh. Терминирование было преимущественно пассивное, активное же или регулируемое терминирование применялось лишь отдельными производителями.

К сожалению, первоначальный стандарт оказался недостаточно детальным и допускал различную трактовку со стороны производителей. Это, естественно, привело к проблемам совместимости между различными реализациями. Появившийся практически одновременно со стандартом общий набор команд (Common Standard Set, CCS) был призван ликвидировать неоднозначности в трактовке, но все же он опоздал с появлением и вошел уже в SCSI-2.

АРБИТРАЖ ШИНЫ

Как осуществляется арбитраж шины и обмен данными между устройствами, мы рассмотрим на конкретном примере чтения компьютером файла с жесткого диска, в соответствии с изложением Д. Л. Миллера.

Прежде всего, ПК или, точнее, адаптер шины на ПК проверяет статус шины — «занята» или «свободна». Если шина свободна, то ПК передает по информационным линиям (data lines) свой идентификационный код. (При арбитраже шины каждое устройство передает бит по соответствующей его идентификатору линии, отсюда ограничение на число подключаемых устройств — оно не может превышать ширину шины; в случае SCSI-1 это восемь бит.)

Если одновременно с ПК еще какое-либо устройство стремится получить контроль над шиной, то приоритет получает устройство с наибольшим идентификатором. (В случае, если ширина шины больше 8 бит, в частности 16, как в SCSI-2, то устройства с идентификаторами от 0 до 7 имеют более высокий приоритет, чем устройства с номерами от 8 до 15. Это сделано для того, чтобы 8-битные устройства можно было подключать к широкой шине.) Таким образом, механизм арбитража не обеспечивает «честного» доступа к шине и не позволяет предотвратить занятие шины одним устройством. Поэтому адаптеру SCSI на главном ПК присваивается ID=7, чтобы хост всегда мог получить контроль над шиной, когда это ему необходимо; а периферийным устройствам идентификаторы присваиваются, начиная с нуля, при этом более медленным устройствам, таким, как ленточные накопители, рекомендуется предоставлять более высокий приоритет, нежели более быстрым устройствам, например жестким дискам, чтобы последние не захватывали шину.

После получения контроля над шиной инициатор (initiator) выбирает целевое устройство (target) посредством активизации одной из восьми линий. Выбранное устройство берет на себя контроль за обменом данными до его завершения. Для начала оно запрашивает у инициатора, какую команду следует выполнить. В ответ, в нашем примере, ПК просит прочитать логические блоки в указанном интервале. Хост ничего не знает и не обязан знать о физической организации диска — числе поверхностей, цилиндров и секторов. С помощью SCSI-команды для дисков Read Capacity («Узнать емкость») он может запросить диск об его емкости, выраженной в количестве логических блоков, и о размере блока, например 512 байт на блок.

Диск подтверждает получение команды и преобразует номера логических блоков в номера секторов, находит и считывает эти сектора, осуществляет исправление ошибок и передает данные байт за байтом, при этом в случае асинхронной передачи он ожидает подтверждения приема каждого байта, в результате, как уже упоминалось, реальная скорость обмена данными для SCSI-1 не превышает 2 Мбайт/с. При синхронной же передаче стороны обмениваются данными с заранее заданной скоростью, например 3,33; 4 или 5 Мбит/с, при этом вовсе не обязательно, чтобы все устройства на шине могли осуществлять синхронную передачу — достаточно, чтобы она поддерживалась двумя взаимодействующими устройствами.

После завершения передачи диск просит сообщить о статусе. Если все нормально и данные не надо передавать повторно, то диск отправляет сообщение о завершении выполнения команды. Таким образом, шина может находиться в одном из следующих состояний (фаз):

BUS FREE (шина свободна)
SELECTION (выбор)
COMMAND (передача команд)
DATA (передача данных)
STATUS (передача статуса)
MESSAGE (передача сообщения)
ARBITRATION (арбитраж)
RESELECTION (повторный выбор).

Группа состояний с COMMAND по MESSAGE соответствует процедуре передачи информации. Арбитраж и повторный выбор осуществляются только в случае конкуренции за шину одновременно нескольких устройств.

КОМАНДЫ SCSI

Предшествующие спецификации интерфейсов для жестких дисков (как уже упомянутый ESDI) предусматривали последовательную передачу по одному биту за один раз, при этом управление диском осуществлялось по отдельным проводам (линиям), каждый из которых выполнял определенную функцию. Например, одна конкретная сигнальная линия задавала смещение головки чтения/записи жесткого диска, другая — направление смещения, третья — тип операции (чтение или запись), четвертая служила для передачи данных в требуемом формате. Таким образом, используемый контроллер зависел от типа жесткого диска.

SCSI же способен выполнять высокоуровневые команды, например запрашивать тип подключенного к шине устройства с помощью команды Inquiry. Таким образом, помимо спецификации физических характеристик шины (тип соединителя, уровни напряжения, назначение контактов и т. д.) стандарт для каждого типа периферии (жесткий диск, CD-ROM и т. д.) определяет поддерживаемые команды и соответствующие им ответы (порядка 12 для каждого вида периферии). Стандартные команды SCSI-1 сгруппированы в соответствии с шестью типами устройств, как показано в Таблице.

Таблица. Группы команд в соответствии с типами поддерживаемых устройств.

Тип устройстваНазваниеТипичная функция
1Случайный доступ для чтения/записи (жесткий диск)Адреса логических блоков, длина записываемого блока
2Последовательный доступ (ленточный накопитель)Чтение следующей записи
3ПринтерКонтроль компоновки страницы
4ПроцессорОтправка и прием
5WORM (записывающий CD-ROM)Большой размер, съемный
6Случайный доступ только для чтенияАдреса логических блоков, длина считываемого блока

При запросе целевым устройством команды, как в примере с обращением ПК к диску, инициатор отвечает отправкой 6 байт командной информации. Эти байты служат для задания команды и идентификации устройства. Все вместе они называются блоком описания команды (Command Descriptor Block, CDB). Первый байт (точнее, байт за номером 0) определяет тип команды или операционный код (opcode). Некоторые наиболее распространенные коды имеют следующие значения (в шестнадцатеричном представлении):

00	Тестовое устройство готово;
03	Форматирование;
08	Чтение;
0А	Запись;
0B	Поиск.

Значение оставшихся байт зависит от конкретного операционного кода. Например, в случае команды Write (код 0A) они имеют следующий смысл:

Байт 0	Операционный код 0А;
Байт 1	Номер логического устройства в битах 5 и 6, 


биты с 1 по 4 задают адрес логического блока; Байт 2 Адрес логического блока; Байт 3 Адрес логического блока; Байт 4 Биты со 2 по 5 задают длину передачи; Байт 5 Бит 1 — флаг; биты 6 и 7 назначаются производителем.

Передача команд осуществляется в асинхронном режиме. Однако если ответ содержит данные, то они могут передаваться в синхронном режиме, как в случае команды Inquiry, в ответ на которую целевое устройство передает идентифицирующую его тип строку ASCII (этот ответ часто отображается на мониторе ПК при загрузке драйверов SCSI).

ТЕРМИНИРОВАНИЕ

Как уже упоминалось, первое и последнее устройства на шине должны быть терминированы, т. е. каждая сигнальная линия должна иметь подключенное к ней с обоих концов сопротивление для предотвращения отражения сигнала. На всех остальных устройствах терминирующие сопротивления должны быть отсоединены или удалены.

Терминирование бывает двух типов: пассивное и активное. При пассивном терминировании нагрузочное сопротивление на 220 Ом подключается к источнику мощностью 4,25-5,25 В (так называемому «оконечному питанию»), а сопротивление на 330 Ом — к земле. Поэтому любые колебания напряжения в источнике оконечного питания приводят к флуктуациям напряжения на сигнальных линиях. Иногда это может привести к ошибкам при передаче данных.

При активном терминировании сопротивление на 110 Ом на каждой сигнальной линии подключается к регулятору напряжения с выходным напряжением 2,85 В (входное напряжение регулятор получает от источника оконечного питания). Благодаря тому, что напряжение поддерживается на постоянном уровне, активное терминирование менее подвержено флуктуациям и шумам.

По способу реализации терминирование может быть внутренним или внешним. При внутреннем терминировании оно блокируется или активизируется электронным образом с помощью перемычек или переключателей. При внешнем терминировании терминирующий блок вставляется в свободный разъем SCSI. Он обычно представляет собой однорядный блок резисторов (Single In-Line Package, SIP).

Во многих современных устройствах терминирование включается автоматически, если прибор оказывается крайним в цепочке.

КАБЕЛИ SCSI

Для обеспечения нечувствительности к помехам внешние кабели SCSI не только используют витые пары, но и организованы в виде трех концентрических слоев (см. Рисунок 2). Центральный, внутренний, слой содержит три пары: Request («Запрос»), Acknowledge («Подтверждение») и Ground («Земля»). Средний — промежуточный — слой служит для передачи управляющих сигналов. Третий — внешний — слой предназначен для передачи данных и информации о четности. В среднем слое пары скручены в противоположном направлении по сравнению с прилежащими к нему внешним и внутренним слоями для уменьшения емкостной связи между слоями. Размещение жил для передачи управляющих сигналов в среднем слое обеспечивает отсутствие интерференции между данными и сигналами Request/Acknowledge.

Рисунок 2. Внешний кабель SCSI в разрезе.

Хотя весь кабель в целом изолируется с помощью полихлорвинилового покрытия, для отдельных пар такая изоляция не годится, так как ее электрические характеристики сильно зависят от температуры, а кроме того, она имеет очень большую емкость. Такая конструкция кабеля сказываются в конечном итоге на его цене. Однако мы не так богаты, чтобы покупать дешевые вещи.

ДОЛГАЯ ИСТОРИЯ

Как было отмечено вначале, последующие версии SCSI значительно расширили возможности этого интерфейса, в частности, за счет увеличения ширины шины и тактовой частоты, а также применения иной, дифференциальной схемы передачи электрических сигналов. Кроме того, использование так называемых удлинителей (extender) и коммутаторов (switch) позволяет увеличить общую протяженность шины и организовать нечто наподобие сети из устройств SCSI. Однако все это тема для следующей статьи.

Дмитрий Ганьжа — ответственный редактор LAN. С ним можно связаться по адресу: diga@lanmag.ru.