Устройства ввода-вывода

Память не является единственным ресурсом, которым должна управлять операци­онная система. Устройства ввода-вывода также тесно взаимодействуют с операци­онной системой. Устройства ввода-вывода обычно состоят из двух частей: контроллера и самого устройства. Контроллер — это микросхема или набор микросхем на вставляемой в разъем плате, физически управляющая устройством. Он принимает команды операционной системы, например, указание прочитать данные с устройства, и выполняет их.

Во многих случаях фактическое управление устройством очень сложно и тре­бует высокого уровня детализации, поэтому в работу контроллера входит пред­ставление простого интерфейса для операционной системы. Контроллер диска может принять команду прочесть сектор 11 206 с диска 2. При этом контроллер должен преобразовать линейный номер сектора в номер цилиндра, сектора и го­ловки. Операция преобразования усложняется тем фактом, что внешние цилинд­ры могут иметь больше секторов, чем внутренние, и что номера испорченных сек­торов отображаются на другие секторы. Затем контроллер должен определить, над каким цилиндром находится в данный момент головка, и дать ей последователь­ность импульсов, чтобы переместить ее на необходимое количество цилиндров. Дальше нужно ждать, пока повернется диск, поместив требуемый сектор под го­ловку. Затем начинается чтение и сохранение битов по мере поступления их с дис­ка, удаление заголовка и вычисление контрольной суммы. Наконец, контроллер должен собрать полученные биты в слова и сохранить их в памяти. Для осуществ­ления всей этой работы контроллеры часто содержат маленькие встроенные ком­пьютеры, запрограммированные на выполнение подобных задач.

Следующей частью является само устройство. Устройства имеют достаточно простые интерфейсы, во-первых, потому что их возможности весьма невелики и, во-вторых, потому что нужно привести их к единому стандарту. Единый стандарт необходим, чтобы любой IDE-контроллер диска мог управлять любым IDE-дис­ком. Аббревиатура IDE образована от Integrated Drive Electronics (встроенный интерфейс накопителей). IDE -интерфейс является стандартным для дисков на компьютерах с процессором Pentium, а также некоторых других компьютерах.

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

Так как все типы контроллеров отличаются друг от друга, для управления ими требуется различное программное обеспечение. Программа, которая общается с контроллером, отдает ему команды и получает ответы, называется драйвером устройства. Каждый производитель контроллеров должен поставлять драйверы для поддерживаемых им операционных систем. Вы можете купить сканер с драйверами для Windows 98, Windows 2000 и UNIX. Если вы хотите получить возможность использовать драйвер, его нужно установить в операционную систему так, чтобы он мог работать в режиме ядра. Теоретически драйверы могут работать вне ядра, но такую возможность поддерживают всего несколько существующих систем, так как для этого требуется, чтобы драйвер в пространстве пользователя имел доступ к устройству неким контролируемым способом — очень редко поддерживаемое свойство.

Есть три способа установки драйвера в ядро.

Первый заключается в том, чтобы заново скомпоновать ядро вместе с новым драйвером и затем перезагрузить систему. Так работает множество систем UNIX.

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

При третьем способе операционная система может принимать новые драйверы, не прерывая работы, и оперативно устанавливать их, не нуждаясь при этом в перезагрузке. Этот способ редко используется, но сейчас он становится все более и более распространенным. Такие съемные устройства, как шины USB и IEEE 1394 всегда нуждаются в динамически загружаемых драйверах.

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

На некоторых компьютерах регистры устройств отображаются в адресное пространство операционной системы, поэтому их можно читать или записывать как обычные слова в памяти. На таких машинах не нужны специальные команды ввода-вывода, а программы пользователей можно оградить от аппаратуры, помещая эти адреса в памяти за пределами досягаемости программ (например, с помощью базового и предельного регистров). На других компьютерах регистры устройств располагаются в специальных портах ввода-вывода, и каждый регистр имеет свой адрес порта. На этих машинах в режиме работы ядра доступны команды IN и OUT, они позволяют драйверам считывать и записывать регистры. Первая схема устра-няет необходимость специальных команд ввода-вывода, но использует некоторое количество адресного пространства. Вторая схема не затрагивает адресное простран­но, но требует наличие специальных команд. Обе схемы широко используются.

Ввод и вывод данных можно осуществлять тремя различными способами. Простейший метод состоит в том, что пользовательская программа выдает системный запрос, который ядро транслирует в вызов процедуры соответствующего драйвеpa . Затем драйвер начинает процесс ввода-вывода. В это время драйвер выполня­ет очень короткий программный цикл, постоянно опрашивая готовность устрой­ства, с которым он работает (обычно есть некий бит, который указывает на то, что устройство все еще занято). По завершении операции ввода-вывода драйвер по­мещает данные туда, куда требуется, и возвращается в исходное состояние. Затем операционная система возвращает управление программе, осуществлявшей вызов. Этот метод называется ожиданием готовности или активным ожиданием и имеет один недостаток: процессор должен опрашивать устройство до тех пор, пока оно не завершит свою работу.

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

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

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

Третий метод ввода-вывода информации заключается в использовании специ­ального контроллера прямого доступа к памяти (DMA, Direct Memory Access), который управляет потоком битов между оперативной памятью и некоторыми контроллерами без постоянного вмешательства центрального процессора. Процес­сор вызывает микросхему DMA, говорит ей, сколько байтов нужно передать, со­общает адреса устройства и памяти, а также направление передачи данных и по­зволяет дальше действовать ей самой. По завершении работы DMA инициирует прерывание, которое обрабатывается так же, как было описано выше.

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

Шины

В современных компьютерах, работающих на основе микропроцессора Pentium, имеется несколько различных шин, имеющих различное назначение.

У этой системы восемь шин (шина кэша, локальная шина, шина памяти, PCI, SCSI, USB, IDE и ISA), каждая со своей скоростью передачи данных и своими функциями. В операционной системе для управления компьютером и его конфи­гурации должны находиться сведения обо всех этих шинах. Две основные шины — это ISA (Industry Standard Architecture — промышленная стандартная архитектуpa), оригинальная шина компьютера IBM PC, и ее преемник, шина PCI (Peripheral Component Interconnect — интерфейс периферийных устройств).

Шина ISA впер­вые появилась на компьютерах IBM PC/AT, она работает на частоте 8,33 МГц и может передавать два байта за такт с максимальной скоростью 16,67 Мбайт/с. Она включена в систему для обратной совместимости со старыми медленными платами ввода-вывода.

Шина PCI была создана компанией Intel в качестве пре­емницы шины ISA. Она может работать на частоте 66 МГц и передавать сразу по 8 байт за такт со скоростью 528 Мбайт/с. Сейчас большинство высокоскоростных устройств ввода-вывода используют шины PCI. Даже некоторые компьютеры с процессорами, отличными от Intel, пользуются шиной PCI, поскольку с ней со­вместимо очень много плат ввода-вывода.

При такой конфигурации центральный процессор по локальной шине переда­ет данные микросхеме PCI-моста, который, в свою очередь, обращается к памяти по выделенной шине памяти, часто работающей на частоте 100 МГц. Системы Pentium имеют кэш первого уровня (кэш L1), встроенный в процессор, и намного больший внешний кэш второго уровня (кэш L2), подключенный к процессору от­дельной шиной кэша.

Шина кэша Локальная шина Шина памяти Оперативная память

устройства ввода-вывода - student2.ru

Рис. 1.11. Структура большой системы Pentium Доступные ISA-слоты

Кроме того, в систему входят три специализированные шины: IDE, USB и SCSI. Шина IDE служит для присоединения периферийных устройств к системе — дис­ков и устройств для чтения компакт-дисков (CD-ROM). IDE-шина — это потомок интерфейса контроллера диска на PC/AT, и сейчас она входит в стандартный комплект всех систем, основанных на процессорах Pentium.

Шина USB(Universal Serial Bus – универсальная последовательная шина) была придумана для того, чтобы присоединить к компьютеру все медленные устройства ввода-вывода, такие как клавиатура и мышь. Она использует маленький четырехпроводной разъем, причем два провода поставляют электропитание к USB-устройствам. USB – это централизованная шина, по которой главное устройство каждую миллисекунду опрашивает устройства ввода – вывода, чтобы узнать, есть ли у них данные. Она может управлять загрузкой данных со скоростью 1,5 Мбайт/с. Все USB-ycтpoйства используют один драйвер, избавляя тем самым от необходимости установки новых драйверов для каждого USB –устройства. Поэтому USB – устройства можно присоединять к системе без ее перезагрузки.

SCSI (Small Computer System Interface — системный интерфейс малых компь­ютеров) — это высокопроизводительная шина, применяемая для быстрых дисков, сканеров и других устройств, нуждающихся в значительной пропускной способ­ности. Ее производительность достигает 160 Мбайт/с. Шина SCSI используется в системах Macintosh с момента их появления, кроме того, она популярна в UNIX-системах и некоторых системах на базе процессоров Intel.

Есть еще одна шина (не показанная на рис.), называется IEEE 1394. Иног­да ее также называют Fire Wire, хотя, строго говоря, FireWire — это название, дан­ное компанией Apple собственной реализации шины 1394. Как и USB, IEEE 1394 является бит-последовательной шиной, но она поддерживает пакетную передачу данных со скоростью, достигающей 50 Мбайт/с. Это ее свойство позволяет под­ключать к компьютеру портативные цифровые видеокамеры и тому подобные мультимедийные устройства. В отличие от USB шина IEEE 1394 не имеет цент­рального контроллера. Шины SCSI и IEEE 1394 конкурируют с разработанной более быстрой версией шины USB.

Работая в окружении большого числа разнообразных шин и интерфейсов, операционная система долж­на уметь распознавать аппаратные составляющие и уметь их настраивать. Это тре­бование привело компании Intel и Microsoft к разработке системы персонального компьютера, называемой plug and play («включи и работай»). В основе этой сис­темы лежала концепция, близкая к той, что была впервые реализована компанией Apple Macintosh. До появления plug and play каждая плата ввода-вывода имела фиксированные адреса регистров ввода-вывода и уровень запроса прерывания. Например, клавиатура использовала прерывание 1 и адреса в диапазоне от 0x60 до 0x64; контроллер гибкого диска использовал прерывание 6 и адреса от 0x3F0 до 0x3F7; принтер пользовался прерыванием 7 и адресами от 0x378 до 0х37А и т. д.

Все в этой схеме было хорошо до тех пор, пока пользователь не покупал зву­ковую карту и модем, и оказывалось, что оба устройства случайно использовали, скажем, прерывание 4. В таком случае они конфликтовали и не могли работать вместе. Возможным решением было встроить набор DIP-переключателей или джамперов (jumper — перемычка) в каждую плату и объяснить пользователю не­обходимость настройки каждой платы таким образом, чтобы адреса портов и но­мера прерываний различных устройств не конфликтовали друг с другом. Это не очень простая задача.

Стандарт plug and play позволяет системе автоматически собирать информа­цию об устройствах ввода-вывода, централизованно назначать уровни прерыва­ния и адреса ввода-вывода, а затем сообщать каждой плате эту информацию — вот краткое описание процесса. Такая система работает на компьютерах Pentium. Каж­дый компьютер с процессором Pentium содержит материнскую плату. На материнской плате находится программа, называемая системой BIOS (Basic Input Output System — базовая система ввода-вывода). BIOS содержит программы ввода-вывода низкого уровня, включая процедуры для чтения с клавиатуры, вывода информации на экран, ввода-вывода данных с диска и т. д. В настоящее время эти функции хранятся во флэш-ОЗУ, которая в обыч­ных условиях является неизменяемой, но, если в BIOS нашлись какие-либо ошиб­ки, ее может изменить операционная система.

При начальной загрузке компьютера стартует система BIOS. Сначала она про­веряет количество установленной в системе оперативной памяти, подключены ли клавиатура и другие основные устройства и корректно ли они отзываются. BIOS начинает проверку с шин ISA и PCI, чтобы определить все устройства, присоеди­ненные к ним. Некоторые из этих устройств являются традиционными, их также называют унаследованными (legacy), то есть созданными до изобретения plug and play. Они имеют фиксированные уровни прерывания и адрес порта ввода-вывода (например, заданные с помощью переключателей или перемычек на плате ввода-вывода без возможности их изменения операционной системой). Эти устройства регистрируются. Устройства plug and play тоже регистрируются. Если присутству­ющие устройства отличаются от тех, что были во время последней загрузки, кон­фигурируются новые устройства.

Затем BIOS определяет устройство, с которого будет происходить загрузка, по очереди пробуя каждое из списка, хранящегося в CMOS-памяти. Пользователь может изменить этот список, войдя в конфигурационную программу BIOS сразу после загрузки. Обычно сначала делается попытка загрузиться с гибкого диска. Если это не удается, пробуется компакт-диск. Если в компьютере отсутствуют и гибкий диск, и компакт-диск, система загружается с жесткого диска. С загру­зочного устройства считывается в память и выполняется первый сектор. В этом секторе находится программа, обычно проверяющая таблицу разделов в конце загрузочного сектора, чтобы определить, который из разделов является активным. Затем из того же раздела читается вторичный загрузчик. Он считывает из актив­ного раздела операционную систему и запускает ее.

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

Наши рекомендации