ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 19.06.2021

Просмотров: 103

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Тема 6. Организация ввода-вывода


Лекция 14. Операции для работы с портами ввода-вывода

1. Пространство ввода-вывода

2. Операции для работы с портами ввода-вывода

3. Ввод из порта и вывод в порт



1. Пространство ввода-вывода


Пространство ввода-вывода в IBM PC отделено от пространства памяти. У всех процессоров семейства х86, в том числе и 32-разрядных, в пространстве ввода-вывода используется 16-разрядная адресация (диапазон адресов 0-FFFFh). Для дешифрации адресов портов в оригинальном PC из 16 бит использовались только младшие 10 (А0-А9), что обеспечивало обращением портам в диапазоне адресов 0-3FFh. Старшие биты адреса, хотя и поступали на шину, устройствами игнорировались. В результате обращения по адресам, к примеру 378h, 778h, B78h и F78h, воспринимались устройствами одинаково. Это упрощение, нацеленное на снижение стоимости как системной платы, так и схем плат адаптеров.

В адаптерах для шин МСА и PCI и во всех современных системных платах используются все 16 бит адреса. Карта распределения адресов ввода-вывода стандартных устройств PC приведена в табл. 1. Эта карта подразумевает 10-битную дешифрацию адреса. Причем в конкретном компьютере реально присутствуют не все перечисленные устройства, но в то же время там могут оказаться другие, не попавшие в таблицу.

Таблица 1

Стандартная карта портов ввода-вывода


АТ – усовершенствованная технология

ХТ – расширенная технология


AT и PS/2

PC/XT

Назначение

000-00F

000-00F

Контроллер DMA #1 8237

010-01F


PS/2 — расширение DMA#1

020-021

020-021

Контроллер прерываний #1 — 8259А

040-05F

040-043

Таймер (PC/XT: 8253, AT: 8254)

060

060

Диагностический регистр POST (только запись)


060-063

Системный интерфейс 8255

060,064


Контроллер клавиатуры AT 8042

061


Источники NMI и управление звуком

070-07F


Память CMOS и маска NMI

080


Диагностический регистр-

080-08F

080-083

Регистры страниц DMA

090-097


PS/2 микроканал, арбитр


0А0

Маска NMI

0A0-0BF


Контроллер прерываний #2 — 8259А

0C0-0DF


Контроллер DMA #2 8237А-5

0F0-0FF


Сопроцессор 80287

100-1EF


PS/2 управление микроканалом

170-177


Контроллер НЖМД #2 (IDE#2)

1F0-1F7


Контроллер НЖМД #1 (IDE#1)

200-207

200-20F

Игровой адаптер


210-217

Блок расширений

238-23F


COM4

278-27F

278-27F

Параллельный порт LPT2 (LPT3 при наличии MDA)


2А2-2АЗ

4acbiMSM48321RS

2C0-2DF

2C0-2DF

EGA #2

2Е0-2Е7


COM4

2E8-2EF


COM4

2F8-2FF

2F8-2FF

COM2

300-31F


ПлатЬ прототипа


320-32F

Жесткий диск XT

338-33F


COM3 <,

370-377


Контроллер НГМД #2

376-377


Порты комайд IDE#2

378-37F

378-37F

Параллельный порт LPT1 (LPT2 при наличии MDA)

380-38F

380-38F

Синхронный адаптер SDLC/BSC #2

3A0-3AF

3А0-3А9

Синхронный адаптер BSC#1

3В0-3ВВ

3В0-3ВВ

Монохромный адаптер (MDA)

3В4-3С9


PS/2 видеосистема

3BC-3BF

3BC-3BF

Параллельный порт LPT1 платы MDA

3C0-3CF

3C0-3CF

EGA#1

3C0-3DF

3C0-3DF

VGA

3D0-3DF

3D0-3DF

CGA/EGA

ЗЕ0-ЗЕ7


COM3

3E8-3EF


COM3

3F0-3F7

3F0-3F7

Контроллер НГМД #1

3F6-3F7


Порты команд IDE*1

3F8-3FF

3F8-3FF

СОМ1



Каждой шине назначается своя область адресов ввода, поэтому дешифратор адресов, расположенный на системной плате, при чтении открывает соответствующие буферы данных, так что реально считываться будут данные только с одной шины. При записи в порты данные (и сигнал записи) могут распространяться по всем шинам компьютера. В стандартном распределении адреса 0h-0FFh отведены для устройств системной платы. При наличии (и разрешении работы) периферийных устройств на системной плате чтение по этим адресам не распространяется на шины расширения. Для современных плат со встроенной периферией и несколькими шинами (ISA, PCI) распределением адресов управляет BIOS через регистры конфигурирования чипсета.



2. Операции для работы с портами ввода-вывода


Описанные далее две команды появились впервые в системе команд процессора i386. Они позволяют организовать эффективную передачу данных между портами ввода-вывода и цепочками в памяти. Следует отметить, что эти две команды позволяют достичь более высокой скорости передачи данных по сравнению с той скоростью, которую может обеспечить контроллер DMA (Direct Memory Access — прямой доступ к памяти).

Ввод элемента цепочки из порта ввода-вывода

Операция ввода элемента цепочки из порта ввода-вывода реализуется командой INS (Input String), имеющей следующий формат:

ins адрес_приемника,номер_порта

Эта команда вводит элемент из порта, номер которого находится в регистре DX, в элемент цепочки, адрес памяти которого определяется операндом адрес_прием-ника. Несмотря на то, что цепочка, в которую вводится элемент, адресуется указанием этого операнда, ее адрес должен быть явно сформирован в паре регистров ES:EDI/DI. Размер элементов цепочки должен быть согласован с размером порта — он определяется директивой резервирования памяти, с помощью которой выделяется память для размещения элементов цепочки. После пересылки команда INS производит коррекцию содержимого регистра EDI/DI на величину, равную размеру элемента, участвовавшего в операции пересылки. Как обычно, при работе цепочечных команд учитывается состояние флага DF.

Подобно командам, реализующим рассмотренные ранее цепочечные операции-примитивы, транслятор преобразует команду INS в одну из трех машинных команд без операндов, работающих с цепочками элементов определенного размера:

INSB (INput String Byte) — ввести из порта цепочку байтов;

INSW (INput String Word) — ввести из порта цепочку слов;

INSD (INput String Double Word) — ввести из порта цепочку двойных слов.


Вывод элемента цепочки в порт ввода-вывода

Операция вывода элемента цепочки в порт ввода-вывода реализуется командой OUTS (Output String), имеющей следующий формат:

outs номер_опрта,адрес_источника

Эта команда выводит элемент цепочки в порт, номер которого находится врегистре DX. Адрес элемента цепочки определяется операндом адрес_источника.


Несмотря на то, что цепочка, из которой выводится элемент, адресуется указанием этого операнда, значение адреса должно быть явно сформировано в паре регистров DS: ESI/SI. Размер структурных элементов цепочки должен быть согласован с размером порта — он определяется директивой резервирования памяти, с помощью которой выделяется память для размещения элементов цепочки. После пересылки команда OUTS производит коррекцию содержимого регистра ESI/SI на величину, равную размеру элемента цепочки, участвовавшего в операции пересылки. При этом, как обычно, учитывается состояние флага DF.

Подобно команде INS транслятор преобразует команду OUTS в одну из трех машинных команд без операндов, работающих с цепочками элементов определенного размера:

OUTSB (OUTput String Byte) — вывести цепочку байтов в порт ввода-вывода;

OUTSW (OUTtput String Word) — вывести цепочку слов в порт ввода-вывода;

OUTSD (OUTput String Double Word) — вывести цепочку двойных слов в порт ввода-вывода.

В качестве примера рассмотрим фрагмент программы, которая выводит последовательность символов в порт ввода-вывода с номером 378 (lptl), соответствующий принтеру:

.data

str_pech db "Текст для печати"

.code

mov dx,378h

lea di,str_pech

mov ex, 16

rep outsb

Для организации работы с портами недостаточно знать их номера и назначение. Не менее важно знать и понимать алгоритмы их работы. Эти сведения можно найти в документации на устройство.




3. Ввод из порта и вывод в порт


Физически порт ввода/вывода представляет регистры разрядностью 8, 16 или 32 бита. Доступ к устройствам ввода/вывода, системным устройствам компьютера осуществляется посредством этих регистров, причем каждый из этих регистров должен иметь возможность уникальной идентификации. С этой целью архитектурно процессор поддерживает так называемое адресное пространство ввода-вывода. Адресное пространство ввода-вывода физически независимо от пространства оперативной памяти и имеет ограниченный объем, составляющий 216, или 65 536, адресов ввода/вывода.

Таким образом, порт ввода/вывода можно определить как 8-, 16- или 32-разрядный аппаратный регистр, имеющий определенный адрес в адресном пространстве ввода-вывода. Вся работа системы с устройствами на самом низком уровне выполняется с использованием портов ввода-вывода. На рис. 1. показана упрощенная концептуальная схема управления оборудованием компьютера.

Рис. 1. Упрощенная схема управления компьютером


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


in <аккумулятор>,<номер_порта> — ввод в аккумулятор из порта с номером <номер_порта>;

out <номер_порта>,<аккумулятор> — вывод содержимого аккумулятора в порт с номером <номер_порта>.

Использование этих команд без проблем возможно только в программе, предназначенной для MS-DOS. При попытке их запуска в программе для Windows будет выдано сообщение об ошибке. Это не означает невозможности запуска исполняемого модуля описанной далее программы в сеансе Windows. Более того, Windows поддержит реализацию полного цикла разработки данной программы, но сделано это будет в специальном режиме работы — режиме виртуального процессора х86.

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

В большинстве компьютеров есть внутренний динамик. Раньше он использовался для того, чтобы издавать звуки при работе самых различный приложений, плоть до игровых. Сейчас у него осталась единственная важная функция — воспроизведение звуков, которые генерирует BIOS на этапе тестирования и начальной загрузки.

Несмотря на то что прямой доступ к портам ввода-вывода доступен только из среды MS-DOS, сведения о номерах портов и особенностях работы с ними полезны и при программировании для Windows. Если системы Windows 95/98 практически не закрывают доступ к портам, то в Windows NT/2000/XP любая попытка обращения к ним приведет к возникновению ошибки. Причина в том, что порты являются критически важным ресурсом, и механизмы защиты Windows NT/2000/XP не могут допустить их монополизацию каким-либо приложением. Операционная система Windows NT/2000/XP предоставляет программисту функции API для работы с устройствами, посредством которых в конечном итоге и осуществляется доступ к портам посредством команд IN и OUT. Попытка использовать эти команды в программе пользователя в среде Windows NT/2000/XP приведет к возникновению исключения по недопустимому коду операции. Если программе удастся получить уровень привилегий ядра (такой уровень имеют драйверы устройств), то в этом случае она может беспрепятственно использовать команды IN и OUT и работать с устройством так же, как в среде MS-DOS.

Существуют специальные программы, которые позволяют получить доступ к портам ввода/вывода из программы пользователя, исключая необходимость написания драйвера: UserPort и PortTalk.

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

программируемого периферийного интерфейса (ППИ) i8255;

таймера i8253.

Общая схема формирования такого сигнала показана на рис. 2.

Основная работа по генерации звука производится микросхемой таймера. Микросхема таймера (просто таймер) имеет три канала с совершенно одинаковыми внутренней структурой и принципом работы. На каналы таймера подаются импульсы от микросхемы системных часов, которые, по сути, представляют собой генератор импульсов, работающий с частотой 1,19 МГц. Каждый канал имеет два входа и один выход. Выходы канала замкнуты на вполне определенные устройства компьютера. Так, канал 0 замкнут на контроллер прерываний, являясь источником аппаратного прерывания от таймера, которое возникает 18,2 раза в секунду. Канал 1 связан с микросхемой прямого доступа к памяти (DMA). И наконец, канал 2 выходит на динамик компьютера Структурно каналы таймера состоят из трех регистров: регистр ввода-вывода разрядностью 8 битов, регистр-фиксатор (latch register) и регистр-счетчик (counter register), оба по 16 битов.


Все регистры связаны между собой следующим образом. В регистр ввода-вывода извне помещается некоторое значение. Источником этого значения может быть либо системное программное обеспечение, либо программа пользователя. Каждый регистр ввода-вывода имеет адрес в адресном пространстве ввода-вывода (номер) порта ввода-вывода. Регистр ввода-вывода канала 2 имеет номер порта ввода вывода 42 h. Помещаемые в него значения немедленно попадают в регистр-фиксатор, где значение сохраняется до тех пор, пока в регистр ввода-вывода не будет записано новое значение. Для согласования разрядности регистров (8-ми и 16-ти разрядных) предназначен регистр управления (ему соответствует порт 43h), который является частью механизма управления всей микросхемой таймера. Он содержит слово состояния, с помощью которого производятся выбор канала, задание режима работы канала и типа операции передачи значения в канал.


Рис. 2. Схема формирования звука встроенного динамика


Структура слова состояния включает в себя:

бит 0 определяет тип константы пересчета: 0 — константа задана двоичным числом, 1 — константа задана двоично-десятичным (BCD) числом. Константа пересчета — значение, загружаемое извне в регистр-фиксатор;

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

биты 4-5 определяют тип операции: 00 - передать значение счетчика в регистр-фиксатор (то есть возможны не только операция записи значения в канал, но и извлечение значения регистра-счетчика из него), 10 - записать в регистр-фиксатор только старший байт, 01 - записать в регистр-фиксатор только младший байт, 11 - записать в регистр-фиксатор сначала старший байт, затем младший. Поэтому формирование 16-разрядного регистра-фиксатора через 8-разрядный регистр ввода-вывода производится следующим образом: запись производится в два приема, первый байт из регистра ввода-вывода записывается на место старшего байта регистра-фиксатора, второй байт – на место младшего байта. Причем в регистр ввода-вывода эти байты помещаются командами IN и OUT;

биты 6-7 определяют номер программируемого канала.

Для формирования любого звука необходимо задать его длительность и высоту. После того как значение из регистра ввода-вывода попало в регистр-фиксатор, оно моментально записывается в регистр-счетчик. Сразу же после этого значение регистра-счетчика начинает уменьшаться на единицу с приходом каждого импульса от системных часов. На выходе любого из трех каналов таймера стоит схема логического умножения. Эта схема имеет два входа и один выход. Значение регистра-счетчика участвует в формировании сигнала на одном из входов схемы логического умножения И. Сигнал на втором входе этой схемы зависит от состояния бита 0 регистра микросхемы интерфейса с периферией (порт 61h). Когда значение в регистре-счетчике становится равным нулю, на соответствующем входе схемы И формируется единица. И если при этом на втором входе, значение которого зависит от бита 0 порта 61h, также 1, то импульс от системных часов проходит на выход канала 2. Одновременно с пропуском импульса в канале 2 немедленно производится загрузка содержимого регистра-фиксатора (которое не изменилось, если его не изменили извне) в регистр-счетчик. Весь процесс с уменьшением содержимого регистра-счетчика повторяется заново. Чем меньшее значение загружено в регистр-фиксатор, тем чаще будет происходить обнуление регистра-счетчика и тем чаще импульсы будут проходить на выход канала 2. А это означает большее значение высоты звука. Максимальное значение частоты на входе 1 динамика — 1,19 МГц. Таким образом, импульс с выхода канала 2 попадает на динамик, и если на последний подан ток, то возникает звук. Подачей тока на динамик управляет бит 1 порта 61h. Для прерывания звучания возможны два пути: первый — отключить ток, сбросив бит 1 порта 61h, второй — сбросить бит 0 порта 61h. Эти две возможности используют для создания различных звуковых эффектов. Сбрасывая и устанавливая эти биты фактически определяется длительность звучания.