Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

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



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

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

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

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

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

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

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

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

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

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.