Как расположить модуль dma на компьютере

Обновлено: 04.07.2024

защита DMA ядра(также известная как защита доступа к памяти) является компонентом Windows 10 защищенного ядра пк, который поддерживается на платформах Intel и AMD, начиная с Windows 10, версии 1803 и Windows 10, версия 1809.

С помощью этой функции ОС и встроенное по системы защищают систему от вредоносных и нежелательных атак с прямым доступом к памяти (DMA) для всех устройств с поддержкой DMA:

  • В процессе загрузки.
  • Для вредоносного прямого доступа устройств, подключенных к легко доступным внутреннимвнешним портам с поддержкой DMA, таким как M. 2 разъемы PCIe и молнией™ 3, во время выполнения операционной системы.
  • Системное встроенное по должно защищаться от атак DMA с предварительной загрузкой путем реализации изоляции DMA для всех буферов ввода-вывода устройств с поддержкой DMA, предварительно Екситбутсервицес ().
  • Системное встроенное по должно отключить бит включения шины (БМЕ) для всех корневых портов PCI, у которых нет дочерних устройств, необходимых для выполнения DMA между Екситбутсервицес () и драйвером устройства, который запускается операционной системой.
  • В Екситбутсервицес () IOMMU должно быть восстановлено системным встроенным по в состоянии включения питания.
  • Ни одно устройство не может выполнять DMA вне РМРР регионов (Intel) или блоков ИВМД (AMD) после Екситбутсервицес () до тех пор, пока соответствующие драйверы ОС не будут загружены и запущены службой PnP.
    • Выполнение DMA вне РМРР регионов или блоков ИВМД после Екситбутсервицес () и до запуска драйвера устройства операционной системой приведет к сбою IOMMU и, возможно, проверке системных ошибок (0xE6).
    • Системное встроенное по должно установить соответствующие флаги в таблицах ACPI, чтобы включить защиту DMA для ядра в ОС:
      • Для платформ Intel системное встроенное по должно установить "DMA_CTRL_PLATFORM_OPT_IN_FLAG" в поле "флаги таблицы ДМАР" (технология виртуализации Intel для прямого ввода/вывода спецификации, редакция 2,5, раздел 8,1).
      • Для платформ AMD системное встроенное по должно установить бит "Поддержка повторного преобразования DMA" в поле ИВРС Ивинфо (Спецификация AMD IOMMU 3,05, раздел 5.2.1).
      • Определение внешних предоставляемых корневых портов PCIe.
      • Определение внутренних портов PCIe, доступных пользователям и требующим защиты DMA.
      • При каждой загрузке, в которой отключены IOMMU (VT-D или AMD-VI) или защита с помощью DMA ядра, будет отключена или настроена на более низкое состояние безопасности, платформа должна расширить событие EV_EFI_ACTION в PCR [7] перед включением DMA.
      • Строка события должна быть "Защита DMA отключена". Встроенное по платформы должно регистрировать это измерение в журнале событий, используя строку "Защита DMA отключена" для данных событий.

      проверка состояния защиты DMA ядра в Windows 10ной системе

      Состояние защиты DMA ядра можно проверить на заданной системе одним из следующих способов.

      использование приложения Сведения о системе:

      • Запустите MSINFO32.exe.
      • Проверьте поле "Защита режима DMA" на странице "Сводка системы".

      использование приложения Безопасность Windows:

      запустите Безопасность Windows приложение из меню Windows.

      Щелкните значок "безопасность устройства".

      Щелкните "сведения о изоляции ядра".

      "Защита доступа к памяти" будет отображаться как доступная функция безопасности, если она включена.

      DMA - Direct Memory Access, механизм, использующийся для непосредственного обмена данными между устройством и оперативной памятью компьютера, минуя центральный процессор.


      Контроллер DMA - Используется для уменьшения нагрузки на центральный процессор в случае длительного обмена большим потоком данных с устройствами. К таким устройствам могут быть причислены:

      • Жёсткие диски (IDE, ATA, SCSI ).
      • Приводы для гибких магнитных накопителей ( CD , PCI Bus Master .

      ISA DMA - старый контроллер DMA, который описан ниже.

      В современные ПК устанавливаются два контроллера DMA:

      Среди этих восьми каналов наиболее часто используются:

        Канал 2 - для работы с гибкими дисками ( Порты

      Микросхема контроллера DMA (i8237A) содержит четыре независимых друг от друга канала, каждый из которых имеет свой набор регистров:

      • CAR (Current Address Register) - регистр текущего адреса ячейки памяти, используемой в данный момент для выполнения операции обмена данными.
      • CWR (Current Word Register) - регистр счётчика слов, подлежащих передаче минус один.
      • PAR (Page Address Register) - регистр адреса страницы, служит для задания старших разрядов адресов (4 бита для DMA-1 и 8 бит для DMA-2).
      • BAR (Base Address Register) - регистр базового адреса буфера (смещение), с которым осуществляется обмен данными. Служит для начальной загрузки значения в регистр CAR.
      • BWCR (Base Word Count Register) - регистр базового числа циклов DMA (общее число передаваемых слов минус единица), служит для начальной загрузки значения в регистр CWR.

      Фактически, регистр CAR имеет тот же адрес, что и BAR, а CWR - тот же, что BWCR. Отличие cостоит в том, что доступ к CAR и CWR осуществляется только при чтении данных из портов, а к BAR и BWCR - только при записи данных в порты.

      Весь список портов регистров DMA для каналов можно представить следующей таблицей:

      Помимо этого, у каждого контроллера DMA есть свой набор регистров только для записи:

      Управляющий регистр CR (Command Register) задаёт параметры работы контроллера DMA, общие для всех каналов микросхемы. Регистр представляет собой следующую структуру:

      • бит 7 - уровень сигнала подтверждения DACK (1 - высокий, 0 - низкий).
      • бит 6 - уровень сигнала подтверждения DREQ (1 - высокий, 0 - низкий).
      • бит 5 - цикл записи (1 - расширенный, 0 - задержанный).
      • бит 4 - приоритеты (1 - циклически меняются, 0 - фиксированы).
      • бит 3 - сжатие цикла по времени.
      • бит 2 - управление работой контроллера (1 - запрещена, 0 - разрешена).
      • бит 1 - разрешение захвата канала 0 для режима память/память.
      • бит 0 - режим работы (0 - обычный, 1 - память/память).

      Регистр программного запроса RR (Request Register) имеет вид:

      • биты 7-3 - не используются.
      • бит 2 - запрос на DMA (0 - сбросить, 1 - установить).
      • биты 1-0 - номер канала.

      Регистр маскирования канала CMR (Channel Mask Register) позволяет временно блокировать сигнал запроса на обслуживание (DREQ) для определённого канала. Содержимое регистра представляется следующим образом:

      • биты 7-3 - не используются (должны быть равны нулю).
      • бит 2 - запрос на DMA (0 - сбросить, 1 - установить).
      • биты 1-0 - номер канала.

      Регистр установки режима работы MR (Mode Register) позволяет задать режим работы канала:

      • биты 7-6 - режим обслуживания:
        • 00 - передача по требованию.
        • 01 - одиночная передача.
        • 10 - блочная передача.
        • 11 - каскадирование.
        • 00 - тарификация.
        • 01 - запись.
        • 10 - чтение.
        • 11 - запрещённая комбинация.

        Регистр сброса контроллера предназначен для сброса контроллера DMA, который осуществляется при записи любого значения в соответствующий ему порт.

        Сброс регистра маски контроллера предназначен для снятия маскирующих битов со всех каналов одновременно. Операция осуществляется записью любого значения в этот регистр.

        Регистр одновременной записи всех масок каналов WAMR (Writa All Mask Register) предназначен для одновременного изменения масок всех каналов контроллера. Регистр имеет вид:

        • биты 7-4 - зарезервированы (0).
        • бит 3 - маскирование канала 3.
        • бит 2 - маскирование канала 2.
        • бит 1 - маскирование канала 1.
        • бит 0 - маскирование канала 0.

        Регистр состояния SR (Status Register) имеет те же номера портов, что и регистр CR, но доступен только для чтения. Формат регистра следующий:

        Содержание

        Функциональное описание DMA

        Контроллер DMA использует системную шину совместно с процессорным ядром. Если CPU и DMA обращаются к одной о той же области памяти или одной и той же периферии, то DMA может приостановить доступ CPU к системной шине, но при этом как минимум половина пропускной способности шины резервируется за CPU. Это означает, что даже при интенсивном обмене данными по DMA процессор не зависнет наглухо.

        При возникновении определенного события, периферийное устройство отправляет сигнал запроса в контроллер DMA. После этого запускается процесс обмена данными, который состоит из 3-х шагов:

        1. Загрузка данных из регистра периферийного устройства (если направление передачи из периферии в память) или загрузка данных из памяти (если направление передачи из памяти в периферию);
        2. Сохранение загруженных данных в память (если из периферии в память) или в периферийное устройство (если из памяти в периферию);
        3. Уменьшение значения регистра DMA_CNDTRx на единицу. Как только этот регистр станет равен нулю, то передача данных завершится.

        Приоритеты каналов DMA

        DMA1 в микроконтроллерах STM32F103c8 имеет 7 каналов, причем в конкретный момент времени передача данных может осуществляться только по одному из них. Однако, если активно несколько каналов, то при одновременном возникновении запросов DMA передача будет запущена для того канала, приоритет которого выше. Приведу небольшой пример. Пусть у нас 3-й канал DMA1 настроен на передачу массива данных в SPI1, а 1-й канал на прием от ADC1. Установим приоритет канала 3 больше, чем у канала 1. В этом случае, если запросы от SPI1 и ADC1 возникнут одновременно, то сначала будет обработан запрос от SPI1 (3-й канал), а уже потом от ADC1 (1-й канал). То есть одновременно включать несколько каналов DMA можно, но одновременно вести передачу может только один из них.

        Приоритеты можно настраивать программно, всего 4-е градации:

        • Very high priority (Очень высокий приоритет)
        • High priority (Высокий приоритет)
        • Medium priority (Средний приоритет)
        • Low priority (Низкий приоритет)

        При одинаковом уровне приоритета (например, 1-й и 3-й канал настроили на Very high priority) канал с меньшим номером будет иметь приоритет над каналом с большим номером (канал 1 будет иметь бОльший приоритет)

        Каналы DMA

        Каждый канал DMA имеет следующие регистры:

        Так, вроде все понятно: имеем 4-е регистра, с помощью которых можно настроить пересылку данных туда-сюда.

        Но это для случая, если нам надо передавать данные в периферию по одному байту. А что делать, если у нас разрядность массива 2 байта, и периферия хочет на вход 2 байта тоже?

        Для таких случаев в регистре DMA_CCRx есть конфигурационные биты разрядности периферийного регистра (PSIZE) и разрядности данных в памяти (MSIZE). Они могут принимать следующие значения:

        То есть, если мы поставим MSIZE=16 бит (2 байта), то за раз мы будем отправлять уже 2 байта, и указатель на адрес памяти будет увеличиваться на 2. А вот регистр DMA_CNDTRx все так же будет уменьшаться на единицу, так как он содержит не количество байт для передачи, а количество самих передач (транзакций). Получается, что MSIZE нужен для того, чтобы сказать DMA, на сколько байт увеличивать внутренний указатель на адрес памяти. Все верно, но MSIZE используется и еще для одной вещи.

        Выравнивание данных разной разрядности

        Пусть разрядность источника данных 8 бит, а приемника 16. Тогда при пересылке DMA добавит 8 незначащих нулей к данным из источника и запишет их в приемник: из источника прочитали, например, 0x13, а в приемник записали 0x0013. В случае, если разрядность источника больше разрядности приемника, то DMA обрежет лишние старшие биты у данных из источника, и в приемник запишет только младшие биты: если разрядность источника 32 бита, а приемника 8 бит, то DMA прочтет из источника значение, например, 0xABCDEF12, а в приемник попадет 0x12. В принципе, все как при присвоении значений переменным в Си.

        В Reference manual на микроконтроллеры STM32F1xxx в разделе про DMA есть вот такая таблица:

        Programmable data width and endian behavior

        Рис. 1. Правила выравнивания данных DMA

        Таблица из Reference manual-а может показаться довольно замысловатой (на самом деле это так и есть 😉 ).Давайте разберемся в ней на одном из случае. Например, источник данных у нас 32 бита, а приемник 16 бит:


        Рис. 2. Преобразование 32-х битных значений к 16-и битным

        Пусть мы пересылаем данные из одного массива в памяти в другой посредством DMA. Причем эти массивы разной разрядности. Массив-источник имеет 32 разряда и содержит следующие данные:

        • элемент 0: B3B2B1B0, смещение 0x00
        • элемент 1: B7B6B5B4, смещение 0x04
        • элемент 2: BBBAB9B8, смещение 0x08
        • элемент 3: BFBEBDBC, смещение 0x0C

        Если непонятно что такое смещение и почему оно принимает именно эти значения, то необходимо почитать про организацию данных в памяти микроконтроллера и указатели языка Си.

        В качестве массива это будет выглядеть вот так:

        Ну и приемник данных:

        А DMA будет выполнять вот такую операцию:

        Думаю, что для людей, знакомых с Си, будет понятен результат такой операции:

        В принципе, все то же самое справедливо и для пересылки данных из памяти в регистр периферии, только в том случае не используется инкремент адреса периферии.

        Особенности обращения к периферии AHB/APB

        Тут есть одна очень важная и не очевидная особенность архитектуры микроконтроллеров STM32. CPU в STM32 является 32-х разрядным, и для записи в память 8, 16 или 32-х бит существуют разные команды и разные запросы на запись. Для ОЗУ ни каких проблем не существует: мы можем выполнять 8, 16 и 32-х разрядные запросы к памяти. А вот к периферии AHB/APB можно обращаться только 32-х битными запросами. А если нам надо выполнить запись в регистр, который имеет разрядность меньше, чем 32 бита? Объясню на примере все того же SPI. Регистр данных DR у него имеет разрядность 16 бит, и старшие 16 бит 32-х разрядной шины просто не используются:

        SPI register map and reset values

        Рис. 3. Карта регистров SPI

        Если в DMA мы настроим разрядность периферии PSIZE = 16 бит, и разрядность памяти MSIZE = 16 бит, то DMA продублирует младшие 16 бит в старшие и произведет 32-х битный запрос к периферии:

        Т.е. из 0xABCD DMA сделает 0xABCDABCD и это значение отправится в периферию. И так как старшие 16 бит регистра DR не используются (зарезервированы), то старшие 16 бит просто проигнорируются. Так же можно настроить PSIZE = 32 бита, и тогда в регистр DR будет занесено значение 0x0000ABCD. А вот если PSIZE установить 8 бит, то DMA сделает следующее преобразование:

        Таким образом, в DR будет занесено 0xABAB а не 0x00AB, как можно подумать, если не знать этих особенностей. Вот как раз из-за того, что к периферии можно обращаться только 32-битными запросами, все регистры в периферии выравнены по границе 32 бита (см. рис. 3).

        Кольцевой режим DMA (Circular mode)

        Думаю, все знакомы с кольцевым буфером. Его очень удобно использовать при непрерывном приеме/передаче данных. В DMA микроконтроллеров STM32 такой режим работы реализован аппаратно, и включается он битом CIRC в регистре управления DMA_CCRx. Если этот режим активирован, то после передачи всех данных по DMA (после того, как DMA_CNDTRx станет равно нулю), регистр DMA_CNDTRx заново перезагружается исходным значением и передача продолжается.

        Прерывания DMA

        Каждый канал DMA имеет 3 прерывания:

        Ошибки при передаче данных по DMA

        Ошибка DMA может возникнуть при чтении/записи в зарезервированное адресное пространство микроконтроллера STM32. При возникновении ошибки соответствующий канал DMA отключается (сбрасывается бит EN) и возникает прерывание Transfer error (если разрешено).

        Каналы DMA и периферия

        DMA1 в микроконтроллерах STM32F103C8 имеет 7 каналов передачи данных, причем на каждом канале висит своя периферия. Приведу таблицу из Reference manual, чтоб было понятнее:

        Summary of DMA1 requests for each channel

        Рис. 4. Каналы DMA и соответствующие им запросы от периферийных устройств

        Например, 1-й канал может обслуживать запросы от ADC1, TIM2_CH3 и TIM4_CH1, а 2-й канал от SPI1_RX, USART3_TX, TIM1_CH1, TIM2_UP и TIM3_CH3. Стоит отметить, что сами запросы должны быть разрешены в регистрах периферийных устройств, при этом, если разрешить DMA-запрос от 2-х источников, то обмен данными будет запускаться от 2-х разных запросов. С ходу не смогу привести пример, где это может быть полезно, и скорее всего такая конфигурация не имеет смысла.

        На этом пока все, в следующей статье будет описание регистров DMA, а уже потом перейдем к практике. Продолжение следует. 😉

        Термин DMA наверняка не раз встречался читателям в различных компьютерных статьях. Что же он означает, влияет ли это понятие на работу компьютера, и если да, то как? В этом мы и попытаемся разобраться.

        DMA - Direct Memory Access

        Принцип работы

        Большинство устройств ПК нуждаются в периодическом обмене данными не только с центральным процессором (ЦП), но и с оперативной памятью. В первых вариантах персональных компьютеров процесс обмена данными какого-либо устройства с ОЗУ протекал при помощи процессора. Такой метод получил название PIO (Programmable Input-Output, программируемый ввод-вывод). Однако этот метод имел ряд недостатков. Прежде всего, было очевидно, что поскольку процессор загружен множеством задач, то он не всегда может отвлекаться на то, чтобы управлять процессом чтения и записи данных ОЗУ, тем более, что объем этих данных в результате прогресса компьютерной техники все увеличивался и увеличивался.

        Так появилась идея технологии DMA (сокращение от Direct Memory Access, т.е. Прямой Доступ к Памяти), состоящая в том, чтобы позволить различным устройствам обращаться к оперативной памяти напрямую, минуя ЦП. Также часто используется русская аббревиатура данной технологии – ПДП.

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

        В шине ISA также использовались специальные каналы ПДП, которые часто закреплялись за отдельным устройством:

        Обычно данные каналы можно было устанавливать программным путем, но на некоторых старых устройствах, например, картах расширения для подключения накопителей CD-ROM, необходимо было вручную устанавливать значения нужных каналов при помощи перемычек.

        Современная реализация

        Начиная с появления шины ввода-вывода PCI, концепция практической реализации ПДП претерпела изменения. В материнских платах с шиной PCI больше не использовался контроллер DMA, а вместо этого стала применяться технология Bus Mastering. Суть этой технологии заключается в том, что любое устройство может обратиться к шине и полностью использовать ее в своих целях, в том числе, и для доступа к оперативной памяти. Кроме того, в шине PCI отпала необходимость в использовании каналов доступа к памяти. Подобный механизм используется также и в преемниках шины PCI –сверхбыстрых шинах AGP и PCI-Express.

        Прямой доступ к памяти могут использовать любые устройства, расположенные в слотах расширения материнской платы, или подключенные к ней при помощи внутренних шин. Это могут быть, например, жесткие диски, накопители для оптических дисков, видеокарты, звуковые и сетевые карты, и т.д. Кроме того, технология DMA может использоваться как внутри процессоров – для передачи данных между отдельными ядрами, так и внутри самой оперативной памяти – для обмена данными между различными участками памяти.

        Современные операционные системы, такие как MS Windows, умеют управлять режимом ПДП для многих устройств. В частности, пользователь имеет возможность включить или выключить режим DMA для жестких дисков.

        В жестких дисках с интерфейсом IDE технология ПДП получила свое развитие в виде дополнительных режимов ПДП, получивших название Ultra DMA (UDMA). Всего стандарт Ultra DMA поддерживает 8 основных режимов передачи данных, обеспечивающих скорость от 16,7 до 167 МБ/c. Использование режимов Ultra DMA для винчестеров позволило значительно увеличить пропускную способность шины IDE. Включить или изменить режим Ultra DMA для жестких дисков можно при помощи специальной опции BIOS, обычно носящей название DMA (UDMA) Mode.

        Заключение

        Появление технологии ПДП позволило разгрузить процессор и избавить его от большого объема рутинной работы по пересылке данных между оперативной памятью и устройствами, расположенными на материнской плате или подключенными к ней. Особенно важно использование разновидности технологии ПДП – Ultra DMA в винчестерах на основе интерфейса IDE, что позволяет значительно ускорить обмен данными между накопителем IDE и материнской платой.

        Читайте также: