Вспомогательные функции для передачи данных посредством DMA
При создании драйвера устройства, использующего прямой доступ к памяти, разработчик должен написать код, не зависящий от архитектуры и в то же время не зависящий от типа шины в том, что касается DMA. Сейчас эта цель достижима благодаря широкому набору вспомогательных функций DMA, предлагаемых ядром. Эти функции прячут различия в механизмах DMA, применяемых в разных архитектурах.
Существует два подмножества вспомогательных функций DMA. Старое содержит архитектурно-независимые функции для PCI-устройств, а новое обеспечивает независимость как от шины, так и от архитектуры. Далее мы рассмотрим некоторые из этих функций и одновременно остановимся на некоторых аппаратных особенностях схем DMA.
Адреса шины
При каждой пересылке данных посредством DMA задействован, как минимум, один буфер в памяти, содержащий данные, которые должно прочитать или записать аппаратное устройство. В общем случае, перед активизацией пересылки данных драйвер устройства должен обеспечить для схемы DMA возможность прямого обращения к ячейкам оперативной памяти.
До этого момента мы различали три типа адресов памяти: логические и линейные адреса для "внутреннего пользования” центральным процессором и физические адреса, т. е. адреса в памяти, используемые процессором для физического управления шиной данных. Есть и четвертый тип адресов памяти— так называемые адреса шины. Он соответствует адресам памяти, используемым всеми аппаратными устройствами, кроме процессора, для управления шиной данных.
Зачем же ядру понадобились адреса шины? Дело в том, что при прямом доступе к памяти пересылка данных происходит без вмешательства центрального процессора. Шиной данных напрямую управляют устройства ввода/вывода и схема DMA. Следовательно, когда ядро настраивает работу механизма DMA, оно должно записать адрес шины задействованного буфера памяти в соответствующие порты схемы DMA или устройства ввода/вывода.
В архитектуре 80x86 адреса шины совпадают с физическими адресами. Однако в других архитектурах, например SPARC фирмы Sun или Alpha фирмы Hewlett-Packard, имеется электронная схема, называемая IO-MMU (I/O Memory Management Unit, Блок управления памятью ввода/вывода). Это аналог блока управления страницами микропроцессора, отображающий физические адреса в адреса шины. Все драйверы ввода/вывода, использующие схемы DMA, должны корректно настраивать IO-MMU перед началом пересылки данных.
Размеры адреса различны у разных шин. Например, адрес шины у ISA имеет размер 24 бита. Таким образом, в архитектуре 80x86 пересылки с использованием прямого доступа к памяти могут быть выполнены только в нижних 16 Мбайт физической памяти. Вот почему память для буфера, используемая в этом случае, должна быть выделена в зоне zone dma с флагом gfp dma. Оригинальный стандарт PCI определяет 32-битовые адреса шин. Однако некоторые PCI-устройства были первоначально сконструированы для шины ISA, и они не могут обращаться к ячейкам памяти выше физического адреса OxOOffffff. В новом стандарте PCI-Х используются 64-битовые адреса шин, и схемы DMA могут прямо обращаться к областям верхней памяти.
В Linux тип dma addr t представляет адрес шины. В архитектуре 80x86 dma addr t соответствует 32-битовому целому, если ядро не поддерживает
РАЕ При поддержке РАЕ dma addr t соответствует 64-битовому целому.
Вспомогательные функции pci_set_dma_mask И dma set masko проверяют, удовлетворяет ли шину данный размер адреса (маски), и, если это так, уведомляют, что данное периферийное устройство будет использовать адреса этого размера.
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница