link700 link701 link702 link703 link704 link705 link706 link707 link708 link709 link710 link711 link712 link713 link714 link715 link716 link717 link718 link719 link720 link721 link722 link723 link724 link725 link726 link727 link728 link729 link730 link731 link732 link733 link734 link735 link736 link737 link738 link739 link740 link741 link742 link743 link744 link745 link746 link747 link748 link749 link750 link751 link752 link753 link754 link755 link756 link757 link758 link759 link760 link761 link762 link763 link764 link765 link766 link767 link768 link769 link770 link771 link772 link773 link774 link775 link776 link777 link778 link779 link780 link781 link782 link783 link784 link785 link786 link787 link788 link789 link790 link791 link792 link793 link794 link795 link796 link797 link798 link799 link800 link801 link802 link803 link804 link805 link806 link807 link808 link809 link810 link811 link812 link813 link814 link815 link816 link817 link818 link819 link820 link821 link822 link823 link824 link825 link826 link827 link828 link829 link830 link831 link832 link833 link834 link835 link836 link837 link838 link839

PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

Введение

Взаимодействие через пространство ввода/вывода

Для обращения программы к пространству ввода/вывода предназначены всего четыре инструкции процессора: IN (ввод из порта в регистр процессора), OUT (вывод в порт из регистра процессора), INS (ввод из порта в элемент строки памяти) и OUTS (вывод элемента из строки памяти в порт). Последние две инструкции, появившиеся с процессором 80286, могут использоваться с префиксом повтора REP, что обеспечивает быструю пересылку блоков данных между портом и памятью. Обмен данными с портами, при котором применяют строковые инструкции ввода/вывода, получил название PIO (Programmed Input/Output — программированный ввод/вывод).

Разрядность слова, передаваемого за одну инструкцию ввода/вывода, может составлять 8, 16 или 32 бита. В зависимости от выровненности адреса по границе слова и разрядности данных используемой шины это слово может передаваться за один или несколько циклов шины с указанием соответствующего нарастающего адреса в каждом цикле обращения к памяти. Инструкции ввода/вывода порождают шинные циклы обмена, в которых вырабатываются сигналы чтения порта/записи в порт. Во избежание недоразумений и для экономии шинных циклов рекомендуется выравнивать адреса 16-битных портов по границе слова, а 32-битных — по границе двойного слова. Обращения по выровненным адресам выполняется за один цикл системной шины. Обращение по невыровненным адресам выполняется за несколько циклов, причем однозначная последовательность адресов обращений (которая зависит от модели процессора) не гарантируется. Так, например, одна инструкция вывода слова по нечетному адресу приведет к генерации двух смежных шинных циклов записи. При программировании обращений следует учитывать специфику устройств ввода/вывода. Если, например, устройство допускает только 16-разрядные обращения, то старший байт его регистров будет доступен лишь при вводе-выводе слова по четному адресу.

В реальном режиме процессора программе доступно все пространство адресов ввода/вывода. В защищенном режиме инструкции ввода/вывода являются привилегированными: возможность их исполнения зависит от текущего уровня привилегий. В защищенном режиме 32-разрядных процессоров (частным случаем которого является и виртуальный режим V86) имеется возможность программного ограничения доступного пространства ввода/вывода, определяя его максимальный размер (начиная с нулевого адреса и в пределах 64 Кбайт), а внутри разрешенной области доступ может быть разрешен или запрещен для каждого конкретного адреса. Размер области и карта разрешенных портов (IO Permission Bitmap) задается операционной системой в дескрипторе сегмента состояния задачи (TSS). Карта разрешений влияет на исполнение инструкций ввода/вывода в зависимости от соотношения текущего уровня привилегий и требуемого уровня привилегий ввода/вывода. При недостаточных привилегиях обращение по неразрешенному адресу вызывает исключение процессора, а поведение его обработчика определяется операционной системой. Возможно снятие задачи-нарушителя (знаменитое сообщение «приложение... выполнило недопустимую операцию и будет закрыто»). Возможен и другой вариант, когда по обращению к порту монитор операционной системы выполняет некоторые действия, создавая для программы иллюзию реальной операции ввода/вывода. Таким образом виртуальная машина по операциям ввода/вывода может общаться с виртуальными устройствами. Программа, выполняемая на нулевом уровне привилегий, безусловно может обращаться ко всем портам непосредственно.

Наиболее корректный (с точки зрения организации ОС) способ общения приложения с портами устройства требует помещения инструкций ввода/вывода в драйвер устройства, работающий на уровне привилегий ОС (на нулевом уровне). Обращение к портам непосредственно из приложения возможно, если в карте разрешения портов бит для данного порта сброшен. Если бит установлен, то обращение к порту вызывает исключение защиты, которое обрабатывает VMM (диспетчер виртуальной машины). В этом случае VMM вызывает процедуру, назначенную для данного порта операционной системой. Это может быть либо специальная процедура виртуального драйвера, установленного для данного порта, либо процедура по умолчанию. В первом случае ввод/вывод для данного порта приложению доступен только через виртуальный драйвер, вызов которого каждый раз будет приводить к издержкам переключения задач и смены уровня привилегий (от приложения на третьем уровне к драйверу нулевого уровня). Однако с точки зрения идеологии многозадачности и защиты это естественное решение, обеспечивающее полную виртуализацию ввода/вывода. Процедура по умолчанию (в Windows 9x) открывает порт для данного приложения (сбрасывает бит в карте разрешений ввода/вывода) и выполняет собственно инструкцию ввода/вывода (возвращая приложению результат ввода). Таким образом, приложению Windows 9x станут доступными любые порты, для которых не установлен виртуальный драйвер. Правда, первое обращение к каждому порту будет происходить медленно (через исключение), но последующие будут выполняться быстро. Если для взаимодействия с устройством задержка первого обращения критична, то при инициализации приложения можно выполнить «безобидные» обращения по адресам всех требуемых портов, что откроет их для дальнейшей непосредственной работы (без издержек).

Заметим, что ОС Windows 9x не особо заботится о виртуализации и защите ввода/вывода; здесь, например, из DOS-окна можно обращаться к любым портам, даже к портам устройств, занятых операционной системой. В ОС Windows NT/2000/XP защита портов строже и сложнее.