\chapter{Внешние устройства}\label{ExternalDevices}

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

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

\begin{itemize}
\item Устройства внешней памяти, которые в свою очередь,
можно разделить на два класса:
\begin{itemize}
 \item устройства памяти с произвольным доступом, главным образом
магнитные диски. К этому же классу относятся дискеты, магнитооптические
и оптические диски. (Не все устройства данного типа являются дисками.
Например, в  60-е и 70-е годы существовали магнитные барабаны,  в
которых
каждому логическому сектору соответствовала одна дорожка на барабане и одна
головка чтения-записи. Такие устройства обеспечивали гораздо более высокую
скорость доступа, чем тогдашние магнитные диски, хотя и были намного
более дорогими в расчете на килобайт емкости). Удачным универсальным 
обозначением для этого класса устройств является принятое в  документации  
фирмы  \entname{IBM} сокращение
\termint{DASD}{Direct Access  Storage  Device}{запоминающее
устройство прямого доступа};
\item устройства памяти с последовательным доступом. 
В основном, это лентопротяжные устройства (стримеры и др.).
\end{itemize}
\item Устройства последовательного ввода/вывода: печатающие устройства,
телетайпы, терминалы и т.д.
\item Векторные и растровые графические терминалы.
\item Позиционные устройства ввода: мыши, планшеты-дигитайзеры,
световые перья и т.д.
\item Сетевые адаптеры.
\item Устройства звукового ввода/вывода.
\item Устройства графического ввода/вывода:
сканнеры или видеодекодеры (ввод),
плоттеры, графические принтеры или видеокодеры (вывод).
\item Специализированная контрольно-измерительная аппаратура.
\end{itemize}

\section[Обзор внешних устройств]{Обзор существующих\\ внешних устройств}

Исторически одним из первых механизмов взаимодействия с пользователем был
телетайп. Телетайп представляет собой электрическую пишущую машинку,
которая может печатать символы, либо вводимые с клавиатуры, либо
передаваемые ей по проводу. Такие машинки использовались для передачи
телеграмм в США еще до второй мировой войны, поэтому в 50-е гг. телетайп
был очень распространенным аппаратом.

Телетайп принимает и передает по проводу последовательности двоичных
значений -- битов. В ранних моделях код одного символа содержал только
6 бит. При помощи 6 бит можно представить 64 различных значения, чего с
трудом хватает для кодирования управляющих кодов (перевода каретки, конца
передачи и т.д.), английских букв верхнего регистра и цифр. Примером
такой кодировки является 6-битная телеграфная кодировка \standname{RADIX},
позволяющая представить символы верхнего регистра, цифры и знак \verb"'$'",
а также знаки препинания, пробел и перевод строки.

Существование 6-битных символов оказало воздействие на архитектуру некоторых
машин третьего поколения. Например, в 24-разрядных машинах линии
\machname{ICL 1900} есть понятие 6-битного байта. Это понятие унаследовал и
распространенный в \entname{Институте ядерной физики} \machname{Одренок}.

В более современных телетайпах используется 7- или 8-битная кодировка,
позволяющая кодировать не только верхний регистр алфавита, но и нижний,
а также различные экзотические символы вроде фигурных скобок.
Примером такой кодировки является широко известный код \standname{ASCII}
(American Standard Code for Information Interchange -- Американский
стандартный код информационного обмена).
8-битная кодировка позволяет представлять не только набор символов
\standname{ASCII}, но и символы национальных алфавитов, например,
кириллицы.

Независимо от кодировки обычный алфавитно-цифровой терминал, такой, как
\machname{vt100} или \machname{IBM 3270}, с точки зрения компьютера
ничем не отличается от телетайпа -- это тоже устройство, передающее
и получающее по последовательной линии двоичные коды. Как правило,
такие терминалы помимо алфавитно-цифровых и прочих печатаемых символов
умеют обрабатывать специальные командные последовательности:
позиционирование курсора, очистка экрана, прокрутка экрана, изменение
яркости символов и т.д. В большинстве систем  (\sysname{Unix},
\sysname{VMS}) генерация таких командных последовательностей
возлагается на прикладную программу, а ОС выполняет только
передачу сформированных команд на терминал.

Для подключения терминальных устройств был разработан протокол передачи
двоичных данных по последовательной линии \termin{\standname{RS232}}%
{Recommended Standard \#232}. Этот протокол определяет электрические 
параметры устройств,
выполняющих немодулированнную передачу данных по витой паре проводов
или по двум таким парам. Немодулированная передача означает, что битовые
значения передаются строго последовательно и биту 1 соответствует
высокое напряжение (обычно 5 В.), а биту 0 -- низкое (обычно 0).

Такая передача относительно проста, но отличается низкой защищенностью
от помех. Стандарт \standname{RS232} определяет один из простых способов
защиты от помех -- передачу вместе с каждой порцией данных так называемого
\term{бита четности}. Аппаратура передатчика устанавливает этот бит так,
чтобы общее число единиц в посылке было четным или нечетным, в зависимости
от договоренности. Это позволяет обнаруживать ошибки при передаче, но
не позволяет их исправлять. Исправление в таком случае возлагается на
протокол более высокого уровня. Например, некоторые терминалы могут
запросить повтор ошибочного байта. При передаче по протоколу \protname{SLIP}
(Serial Line Internet Protocol) вместе с пакетом данных передается
контрольный код \termint{CRC}{Cyclic Redundancy Code}{циклический
избыточный код},
который позволяет исправлять единичные, а иногда и множественные ошибки.

Для передачи по длинным линиям, особенно по телефонным каналам,
используются специальные устройства -- \termin{модемы}{модулятор/демодулятор},
преобразующие передаваемые значения в звуковой сигнал различного тона.
Модемы, как правило, умеют не только делать модулированную передачу,
но и дозваниваться до заданного телефонного номера.

В настоящее время порты \standname{RS232} используются для подключения широкого
спектра различной низкоскоростной аппаратуры. С их помощью подключаются мыши,
модемы, различная измерительная аппаратура, даже принтеры. Практически
любая современная вычислительная система имеет несколько последовательных
портов. Например, в \machname{IBM PC} под \sysname{MS~DOS} последовательные
порты видны как устройства \verb"COM" с соответствующим номером.
Система \sysname{UNIX} называет те же порты \verb"/dev/tty", тоже с номером.
Современные \standname{RS232}-порты обеспечивают передачу на скоростях до
115 кБод (килобит в секунду). Существуют также более скоростные стандарты,
сверху вниз совместимые с \standname{RS232}, например, \standname{RS422}.

С точки зрения компьютера адаптер последовательного порта
представляет собой устройство, подключенное к системной шине. Это
устройство имеет один или несколько управляющих портов, а также байтовый
порт данных. Порты отображены на адреса памяти или находятся в специальном
адресном пространстве ввода/вывода в зависимости от архитектуры процессора.
Адаптер может генерировать прерывание при получении очередного байта
или при завершении передачи.

Некоторые многопортовые платы, например
адаптер \machname{DL-11} фирмы \entname{DEC}, могут сбрасывать получаемые
данные в заданную область памяти, не прерывая работу центрального процессора,
или, наоборот, передавать в порт заданное количество данных из памяти, начиная
с заданного адреса. При этом центральный процессор должен только
запрограммировать устройство на прием или передачу. Такой режим 
работы называется \termin{прямым доступом к памяти}{ПДП}
и часто используется в устройствах, передающих большие объемы
данных, особенно в дисковых контроллерах. Словосочетание 
\term{ПДП} -- это калька с англоязычного термина 
\termin{DMA}{Direct Memory Access}.

Для подключения более скоростных устройств, например принтеров или
лентопротяжек, используются параллельные порты. В современных системах обычно
используется стандарт de-facto, известный как Centronix. В первом приближении
такой порт представляет собой восемь последовательных линий, в
электрическом отношении очень похожих на \standname{RS232}, и провода,
по которым передаются синхронизационные сигналы. Понятно, что такая линия
будет по крайней мере в восемь раз быстрее, чем последовательный порт.

Часто скорость передачи по параллельному порту оказывается
недостаточной, например, при печати изображений на лазерном принтере.
Для решения этой проблемы существуют специальные высокоскоростные адаптеры,
подключаемые непосредственно к системной шине компьютера.

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

Подключение устройства непосредственно к системной шине имеет два
серьезных недостатка.
\begin{itemize}
\item Такое устройство может подключаться только к компьютерам с
определенным типом шины. Это может не казаться недостатком, если мы имеем
дело только с монокультурой одинаковых систем, например \machname{IBM PC AT},
с шиной \machname{ISA}. Если же у нас появляется несколько других систем,
скажем \machname{microVAX}, \machname{Sun}, \machname{Macintosh} или
хотя бы \machname{x86} с шиной \machname{EISA}, или \machname{PCI}, или
вообще \machname{ЕС-184X} с советским стандартом шины, похожим на
\machname{ISA}, но отличающимся от него --
сразу начинаются трудности.

\item Для подключения устройства необходимо вскрывать компьютер. В
некоторых случаях, например, если машина предназначена для работы в
промышленных цехах и имеет герметичный корпус, это превращается в целую
эпопею. Вообще, системная шина -- дело тонкое, и включать в нее сомнительное
устройство, разработанное неизвестной третьей фирмой, часто бывает просто
страшно. Поэтому многие конторы, занимающиеся гарантийным ремонтом машин,
отказываются чинить машины, в которые ставились неизвестные платы.
\end{itemize}

Для дисковых контроллеров существует еще одна проблема -- дисковый контроллер
для машины третьего поколения представляет собой сложную систему,
сравнимую по сложности с центральным процессором. С одной стороны, контроллер
управляет шаговыми двигателями подачи магнитных головок, формирует
модулированный сигнал для записи на магнитную поверхность, сочиняет
информацию, записываемую в заголовок и конец каждого блока на диске,
и т.д. С другой стороны, он буферизует считываемые и записываемые данные,
делает их передачу в основную память по ПДП и осуществляет все взаимодействие
с центральным процессором.

Поэтому еще в 60 гг. появились различные стандарты де-факто,
позволяющие одному дисковому контроллеру работать с различными дисководами.
Так, одни и те же дисковые накопители могли использоваться как с
мэйнфрэймами фирмы \entname{IBM}, так и с суперкомпьютерами \entname{Cray}
или \entname{CDC}, или с \machname{VAX-11/780}.
А контроллер дисковой подсистемы поставлялся вместе с компьютером.

Такая организация дисковой подсистемы использовалась и в ранних моделях
\machname{IBM PC}. Имеются в виду так называемые \standname{MFM}-винчестеры,
у которых большая часть управляющей электроники расположена на плате,
подключаемой к системной шине.

Однако электроника прогрессировала очень быстро, и контроллеры дешевели
гораздо быстрее, чем механика. Поэтому в 80-е гг. выяснилось, что
стоимость контроллера намного ниже стоимости самого дисковода. Оказалось
целесообразным перенести весь контроллер на плату, привинченную к корпусу
диска, а к системной шине подключать только относительно
простой \termint{HBA}{Host Bus Adapter}{адаптер шины <<хозяина>>}.
Наиболее простым примером такой организации являются диски \standname{IDE}
(Integrated Drive Electronic), используемые в большинстве
современных дешевых клонов \machname{IBM PC/AT-AT386}.

Более развитой архитектурой такого типа обладают устройства, выполненные
в стандарте \termint{\standname{SCSI}}{Small Computer System Interface}%
{интерфейс [для] малых компьютерных систем, читается <<скази"}.
\standname{SCSI} представляет собой высокоскоростную параллельную шину,
к которой может подключаться до семи устройств. По этой шине передаются
высокоуровневые команды, например -- выдать состояние устройства; перевести
считывающую головку к заданному сектору\footnote{\standname{SCSI}
использует линейную адресацию секторов, т.е. нулевой сектор
второй дорожки идет сразу за последним сектором первой и т.д.};
считать блок данных. Система команд достаточно широка, чтобы к этой
шине можно было подключать не только магнитные диски, но и лентопротяжки,
оптические дисководы и даже устройства, вообще не являющиеся устройствами
внешней памяти, например сканеры, или даже сетевые адаптеры
\standname{Ethernet}.

Устройства \standname{SCSI} бывают двух типов -- устанавливаемые внутри корпуса
компьютера и внешние. Внешние устройства имеют свой корпус, свой блок
питания и даже свой сетевой шнур, поэтому они заметно дороже
внутрикорпусных. Внешние устройства очень полезны, если внутри корпуса
мало места, как в случае настольных рабочих станций \machname{Sun} или
\machname{x86 - low profile}. Соответственно есть два типа кабелей
\standname{SCSI} -- для внешних устройств (круглый кабель, заключенный
в экран и оболочку из толстой пластмассы)
и для внутренних -- обычный плоский кабель, внешне похожий на кабели
для подключения \standname{IDE}-дисков и флопповодов, но намного шире.

Большинство современных рабочих станций и мощных персональных компьютеров
имеют \standname{SCSI}-адаптеры.

Говоря о стандартах подключения внешних устройств, нельзя не упомянуть
о различных стандартных шинах для измерительной аппаратуры, например,
о стандарте \standname{CAMAC}. Этот стандарт по своей структуре похож
на системную шину компьютера с низкой производительностью. Более того,
существует компьютер с такой системной шиной: известный в \entname{ИЯФ}е
\machname{Одренок}.
Однако большинство компьютеров подключается к шине \standname{CAMAC}
через более или менее сложный HBA. Существует и ряд других стандартов
\term{магистрально-модульной} аппаратуры -- \standname{VME},
\standname{Multibus} и т.д.

Следует четко разделять магистрально-модульные стандарты, такие как
\standname{CAMAC, VME {\rm или} SCSI}, и стандарты системной шины
\machname{ISA}, \machname{EISA}, \machname{MCA}, \machname{VLB},
\machname{PCI} для \machname{IBM PC}
и ее клонов, \machname{NuBus} для \machname{Macintosh}
\machname{UNIBUS {\rm и} Q-bus} для техники фирмы \entname{DEC}:
\machname{PDP-11} и семейства \machname{VAX}.

Системная шина представляет собой способ
непосредственного подключения устройств к центральному процессору. Поэтому
такие интерфейсы отличаются:
\begin{itemize}
\itemвысокой скоростью передачи;
\itemпростым доступом со стороны центрального процессора. Как говорилось
выше, процессор обычно видит управляющие регистры устройства как несколько
байтов или слов в адресном пространстве памяти или специальных адресах
ввода/вывода. В первом случае для обращения к устройству можно использовать
любые команды работы с памятью, а во втором программист должен пользоваться
специальными командами \verb"in" и \verb"out", как в процессорах фирмы
\entname{Intel};
\itemнизкой помехоустойчивостью и низкими порогами по напряжению и току;
\itemСложностью. Часто для полноценной реализации того или иного интерфейса
необходимы специальные заказные микросхемы, как для устройств в
стандарте шины \machname{NuBus} фирмы \entname{Apple});
\itemориентацией на архитектуру конкретного компьютера или семейства
компьютеров. Например, реализовать интерфейс для подключения устройства в
стандарте \machname{Q-bus} к шине \machname{IBM PC} практически невозможно.
\end{itemize}

Магистрально-модульные устройства, как правило, подключаются к центральному
процессору через HBA. Скорость работы такого интерфейса может быть ненамного
ниже, чем у системной шины, особенно в случае \standname{VME {\rm или} SCSI},
но доступ к устройствам из процессора осуществляется не напрямую через
адресное пространство, а путем программирования HBA.
Любопытно, что такое косвенное
программирование может в итоге оказаться проще прямого программирования
контроллера, особенно если HBA хорошо спроектирован.

Некоторые HBA магистрально-модульных систем, однако, отображают управляющие
регистры устройств в адресное пространство процессора. Для \standname{VME}
и даже для \standname{CAMAC} существуют даже специализированные
машины-контроллеры, у которых системная шина совпадает с требуемым
интерфейсом.
Понятно, что для машины общего назначения такой подход часто может оказаться неприемлемым, например,
потому что потребуется выделить окно в несколько мегабайт в физическом
адресном пространстве в 16 М (\machname{IBM PC AT386/ISA}) или просто по
стоимости.

Стандарты можно также разделить по принципу: открытый стандарт или фирменный.
Например, стандарт \machname{NuBus} является фирменным стандартом
\entname{Apple}, и получить его описание или лицензию на приобретение
соответствующих микросхем не так то просто.
Стандарты же \standname{SCSI {\rm или} CAMAC} полностью
открытые, т.е. любой может получить полную документацию и создать
собственное устройство. Если его интерфейс соответствует документации,
то оно будет работать совместно с любым <<правильным>> HBA.
Как правило, открытые стандарты создаются в исследовательских центрах,
(например, \standname{CAMAC} был разработан в \entname{CERN}) или
разрабатываются правительственными или межправительственными организациями.
Однако иногда и фирмы делают свои внутренние стандарты открытыми, как это
произошло со стандартом \standname{SCSI}.

Открытые стандарты особенно выгодны небольшим фирмам и командам разработчиков,
у которых нет денег на проталкивание на рынок <<фирменной>>, ни на что не
похожей системы со своим шлейфом периферийных устройств.
Например, за счет открытых стандартов \standname{VME {\rm и} SCSI} выросла
фирма \entname{Sun Microsystems}, начинавшая с
изготовления рабочих станций на процессоре \machname{680x0} с системной
шиной \standname{VME}. Однако, когда они выросли, они тут же выпустили
рабочие станции линии \machname{SPARCStation} с фирменной шиной
\machname{S-bus}.


