Чтение онлайн

на главную - закладки

Жанры

Шины PCI, USB и FireWire

Гук Михаил Юрьевич

Шрифт:

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

В реальном режиме (при отключенной страничной переадресации) физический адрес, фигурирующий на системной шине, совпадает с линейным адресом, формируемым прикладной программой. Тут все просто, правда, в стандартном (а не большом) реальном режиме доступен только первый мегабайт адресного пространства (то есть из устройств доступны только отображенные на область UMA).

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

Для обращения к регистрам устройства, расположенным

в пространстве памяти (или к области памяти устройства), программа должна узнать физический адрес данной области. Далее она должна запросить у ОС линейный адрес, на который отображается этот физический адрес, и обращаться к нему по этому линейному адресу. Иного пути добраться до физического устройства у программы нет, и если ОС откажет в данном запросе, устройство окажется для этой программы недоступным. Для обращения к устройствам через пространство памяти у процессоров x86 предусмотрено большое число разнообразных инструкций, выполняющих как просто пересылку, так и работающих с операндами в памяти (то есть в устройстве). Инструкции, модифицирующие ячейки памяти, порождают на системной шине блокированные транзакции «чтение-модификация-запись». Этот тип транзакций не приветствуется с точки зрения эффективности использования времени шины, так что предпочтительно избегать таких инструкций при взаимодействии с устройствами. Заметим, что инструкции процессора обычно не порождают эффективных пакетных транзакций на шине PCI, они вызывают лишь одиночные транзакции.[7] Некоторые программные ухищрения, позволяющие повысить эффективность программно-управляемого обмена, описаны в главе 2.

При организации прямого доступа к памяти, как по стандартным каналам DMA, так и при использовании ведущих устройств шин ISA и PCI, возникает ряд проблем, связанных со страничным преобразованием адресов. Программе требуется организовать обмен данными между устройством и некоторым буфером данных в ОЗУ, с которым программа общается по линейным адресам, а устройство – по физическим. Отметим ряд существенных моментов:

• программа должна запросить у ОС физический адрес, которому соответствует линейный адрес предполагаемого буфера обмена. Именно этот физический адрес должен задаваться устройству, осуществляющему DMA (или централизованному контроллеру DMA), при инициализации сеанса обмена (при указании начального адреса, длины блока и запуске канала);

• физические страницы, к которым обращаются по DMA, должны быть зафиксированы: механизм замещения страниц не должен их затрагивать, по крайней мере, пока не завершится обмен по DMA;

• если буфер данных не умещается в одной логической странице, возникает проблема пересечения границ. Обычный контроллер DMA работает по последовательно изменяемым (инкрементируемым или декрементируемым) адресам. При пересечении границы логической страницы, возможно, потребуется скачок физического адреса, поскольку следующая логическая страница может иметь физическое отображение в произвольном (относительно предыдущей страницы) месте ОЗУ. Чаще всего ОС оперирует страницами по 4 Кбайт, при этом пересылка больших блоков данных ведется «короткими перебежками», между которыми должна выполняться повторная инициализация контроллера DMA.

Проблема пересечения границ решается усложнением контроллеров DMA – применением «разбросанной записи» в память (scatter write) и «собирающего чтения» памяти (gather read). В этом случае контроллеру DMA задается список описателей блоков (начальный адрес и длина), каждый из которых не пересекает границ логической страницы. Отработав очередной блок памяти, контроллер переходит к следующему, и так до конца списка. Такие возможности имеет, например, станПередача 32-разрядного слова по невыровненному адресу породит пакетный цикл из двух передач, но эффективным (с точки зрения пропускной способности) его не назовешь. дартный контроллер PCI IDE. Для передачи логически непрерывного буфера данных описатели его блоков могут быть сокращены. Так, например, можно задать полный физический адрес начала буфера, его длину и только список базовых адресов занимаемых им страниц. На каждой странице, кроме начальной, данные будут начинаться с нулевого адреса; на каждой странице, кроме последней, данные будут доходить до последнего адреса. Вместо длины буфера можно задавать и физический адрес его конца. Такие варианты описаний используются, например, в хост-контроллерах шин USB и FireWire.

Проблема пересечения границ может решаться и иначе, без усложнения контроллера DMA. Для этого в памяти резервируется буфер значительного размера, отображенный на непрерывную область физической памяти, и обмен данными физическое устройство выполняет только с этим буфером. Однако рядовое приложение не может создать такой буфер, он может быть организован лишь драйвером устройства. Приложения могут лишь получать указатели на этот буфер и обмениваться с ним данными. Таким образом, по пути от приложения к устройству появляется дополнительная «перевалочная база» (буфер драйвера) и, соответственно, дополнительная пересылка данных, что приводит к дополнительным затратам времени.

 

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

Для обращения

программы к пространству ввода/вывода предназначены всего четыре инструкции процессора: 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 9л:) открывает порт для данного приложения (сбрасывает бит в карте разрешений ввода/вывода) и выполняет собственно инструкцию ввода/вывода (возвращая приложению результат ввода). Таким образом, приложению Windows 9x станут доступными любые порты, для которых не установлен виртуальный драйвер. Правда, первое обращение к каждому порту будет происходить медленно (через исключение), но последующие будут выполняться быстро. Если для взаимодействия с устройством задержка первого обращения критична, то при инициализации приложения можно выполнить «безобидные» обращения по адресам всех требуемых портов, что откроет их для дальнейшей непосредственной работы (без издержек).

Поделиться:
Популярные книги

Здравствуй, 1985-й

Иванов Дмитрий
2. Девяностые
Фантастика:
альтернативная история
5.25
рейтинг книги
Здравствуй, 1985-й

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Назад в СССР: 1984

Гаусс Максим
1. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Назад в СССР: 1984

Как я строил магическую империю

Зубов Константин
1. Как я строил магическую империю
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Как я строил магическую империю

Дядя самых честных правил 8

Горбов Александр Михайлович
8. Дядя самых честных правил
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Дядя самых честных правил 8

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Лорд Системы 11

Токсик Саша
11. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 11

Золотая осень 1977

Арх Максим
3. Регрессор в СССР
Фантастика:
альтернативная история
7.36
рейтинг книги
Золотая осень 1977

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Моя (не) на одну ночь. Бесконтрактная любовь

Тоцка Тала
4. Шикарные Аверины
Любовные романы:
современные любовные романы
7.70
рейтинг книги
Моя (не) на одну ночь. Бесконтрактная любовь

Раб и солдат

Greko
1. Штык и кинжал
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Раб и солдат