Гук Михаил Юрьевич
Шрифт:
В реальном режиме процессора программе доступно все пространство адресов ввода/вывода. В защищенном режиме инструкции ввода/вывода являются привилегированными: возможность их исполнения зависит от текущего уровня привилегий. В защищенном режиме 32-разрядных процессоров (частным случаем которого является и виртуальный режим V86) имеется возможность программного ограничения доступного пространства ввода/вывода, определяя его максимальный размер (начиная с нулевого адреса и в пределах 64 Кбайт), а внутри разрешенной области доступ может быть разрешен или запрещен для каждого конкретного адреса. Размер области и карта разрешенных портов (IO Permission Bitmap) задается операционной системой в дескрипторе сегмента состояния задачи (TSS). Карта разрешений влияет на исполнение инструкций ввода/вывода в зависимости от соотношения текущего уровня привилегий и требуемого уровня привилегий ввода/ вывода. При недостаточных привилегиях обращение по неразрешенному адресу вызывает исключение процессора, а поведение его обработчика определяется операционной системой. Возможно снятие задачи-нарушителя (знаменитое сообщение «приложение… выполнило недопустимую операцию и будет закрыто»). Возможен и другой вариант, когда по обращению к порту монитор операционной системы выполняет некоторые действия, создавая для программы иллюзию реальной операции ввода/вывода. Таким образом виртуальная машина по операциям ввода/вывода может общаться с виртуальными устройствами. Программа, выполняемая на нулевом уровне привилегий, безусловно может обращаться ко всем портам непосредственно.
Наиболее корректный (с точки зрения организации ОС) способ общения приложения с портами устройства требует помещения инструкций ввода/вывода в драйвер устройства, работающий на уровне привилегий ОС (на нулевом уровне). Обращение к портам непосредственно из приложения возможно, если в карте разрешения портов бит для данного порта сброшен. Если бит установлен, то обращение к порту вызывает исключение защиты, которое обрабатывает VMM (диспетчер виртуальной машины). В этом случае VMM вызывает процедуру, назначенную для данного порта операционной системой. Это может быть либо специальная процедура виртуального драйвера, установленного для данного порта, либо процедура по умолчанию. В первом случае ввод/вывод для данного порта приложению доступен только через виртуальный драйвер, вызов которого каждый раз будет приводить к издержкам переключения задач и смены уровня привилегий (от приложения на третьем уровне к драйверу нулевого уровня). Однако с точки зрения идеологии многозадачности и защиты это естественное решение, обеспечивающее полную виртуализацию ввода/вывода. Процедура по умолчанию (в Windows 9л:) открывает порт для данного приложения (сбрасывает бит в карте разрешений ввода/вывода) и выполняет собственно инструкцию ввода/вывода (возвращая приложению результат ввода). Таким образом, приложению Windows 9x станут доступными любые порты, для которых не установлен виртуальный драйвер. Правда, первое обращение к каждому порту будет происходить медленно (через исключение), но последующие будут выполняться быстро. Если для взаимодействия с устройством задержка первого обращения критична, то при инициализации приложения можно выполнить «безобидные» обращения по адресам всех требуемых портов, что откроет их для дальнейшей непосредственной работы (без издержек).
Заметим, что ОС Windows 9x не особо заботится о виртуализации и защите ввода/вывода; здесь, например, из DOS-окна можно обращаться к любым портам, даже к портам устройств, занятых операционной системой. В ОС Windows NT/2000/ XP защита портов строже и сложнее.
ГЛАВА 1Шины PCI и PCI–X
Шины PCI и PCI–X являются основными шинами расширения ввода/вывода в современных компьютерах; для подключения видеоадаптеров их дополняет порт AGP. Шины расширения ввода/вывода (Expansion Bus) являются средствами подключения системного уровня: они позволяют адаптерам и контроллерам периферийных устройств непосредственно использовать системные ресурсы компьютера – пространство адресов памяти и ввода/вывода, прерывания, прямой доступ к памяти. Устройства, подключенные к шинам расширения, могут и сами управлять этими шинами, получая доступ к остальным ресурсам компьютера. Шины расширения механически реализуются в виде слотов (щелевых разъемов) или штырьковых разъемов; для них характерна малая длина проводников, то есть они сугубо локальны, что позволяет достигать высоких скоростей работы. Эти шины могут и не выводиться на разъемы, но использоваться для подключения устройств в интегрированных системных платах.
Поначалу шина PCI вводилась как пристройка (mezzanine bus) к системам с шиной ISA. Она разрабатывалась в расчете на процессоры Pentium, но хорошо сочеталась и с процессорами i486. Позже PCI на некоторое время стала центральной шиной: она соединялась с шиной процессора высокопроизводительным мостом («северным» мостом), входящим в состав чипсета системной платы. Остальные шины расширения ввода/вывода (ISA/EISA или MCA), а также локальная ISA-подобная шина X-BUS и интерфейс LPC, к которым подключаются микросхемы системной платы (ROM BIOS, контроллеры прерываний, клавиатуры, DMA, портов COM и LPT, НГМД и прочие «мелочи»), подключались к шине PCI через «южный» мост. В современных системных платах с «хабовой» архитектурой шину PCI отодвинули на периферию, не ущемляя ее в мощности канала связи с процессором и памятью, но и не нагружая транзитным трафиком устройств других шин.
Шина PCI является синхронной – фиксация всех сигналов выполняется по положительному перепаду (фронту) сигнала CLK. Номинальной частотой синхронизации считается частота 33,3 МГц, при необходимости она может быть понижена. Начиная с версии PCI 2.1 допускается повышение частоты до 66,6 МГц при «согласии» всех устройств на шине. В PCI–X частота может достигать 133 МГц.
В PCI используется параллельная мультиплексированная шина адреса/данных (AD) с типовой разрядностью 32 бит. Спецификация определяет возможность расширения разрядности до 64 бит; в PCI–X версии 2.0 определен также 16-битный вариант шины. При частоте шины 33 МГц теоретическая пропускная способность достигает 132 Mбайт/с для 32-битной шины и 264 Мбайт/с для 64-битной; при частоте синхронизации 66 МГц – 264 Мбайт/с и 528 Мбайт/с соответственно. Однако эти пиковые значения достигаются лишь во время передачи пакета: из-за протокольных накладных расходов реальная средняя пропускная способность шины оказывается ниже.
Сравнительные характеристики шин PCI и PCI–X и других шин расширения PC-совместимых компьютеров приведены в табл. 1.1.[8] Шина ISA из настольных компьютеров уходит, но она сохраняет свои позиции в промышленных и встраиваемых компьютерах, как в традиционном, слотовом, так и в «бутербродном» варианте PC/104. В блокнотных компьютерах широко применяются слоты PCMCIA с шинами PC Card и Card Bus. Шина LPC является современным дешевым средством для подключения нересурсоемких устройств к системной плате.
Организация шин PCI и PCI–X
Шина PCI позволяет объединять равноранговые устройства. Любое устройство шины может выступать как в роли инициатора транзакций (задатчика), так и в роли целевого устройства. Целевое устройство отвечает на транзакции, адресованные к его ресурсам (областям памяти и портам ввода/вывода). Ядро компьютера (центральный процессор и память) для шины PCI также представляется устройством – главным мостом (host bridge). В транзакциях, обращенных к устройствам PCI, инициированных центральным процессором, главный мост является задат-чиком. В транзакциях от устройств PCI, обращающихся к ядру (к системной памяти), главный мост является целевым устройством. Право на управление шиной в любой момент времени дается лишь одному устройству данной шины; арбитраж запросов на управление шиной осуществляется централизованным способом. Арбитр, как правило, является частью моста.
Наличие активных устройств (помимо ЦП) позволяет выполнять в компьютере параллельно несколько операций обмена: одновременно с обращениями процессора могут выполняться транзакции от мастеров шины PCI. Эта параллельность – PCI Concurrency – возможна лишь для обменов по непересекающимся путям. Одновременный доступ нескольких инициаторов к одному ресурсу (как правило, к системной памяти) требует довольно сложной организации контроллера этого ресурса, но ради повышения суммарной эффективности системы на эти усложнения приходится идти. В системе с несколькими шинами PCI возможна параллельная работа устройств-мастеров на разных шинах – PCI Peer Concurrency. Однако если они обращаются к одному ресурсу (системной памяти), то какие-то фазы этих обменов все-таки должны будут выполняться последовательно.