В каком случае доступ к памяти реализуется с помощью dma контроллера

Обновлено: 07.07.2024

Использование механизма прерываний позволяет разумно загружать процессор в то время, когда устройство ввода-вывода занимается своей работой. Однако запись или чтение большого количества информации из адресного пространства ввода-вывода (например, с диска) приводят к большому количеству операций ввода-вывода, которые должен выполнять процессор. Для освобождения процессора от операций последовательного вывода данных из оперативной памяти или последовательного ввода в нее был предложен механизм прямого доступа внешних устройств к памяти – ПДП или Direct Memory Access – DMA. Давайте кратко рассмотрим, как работает этот механизм.

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

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

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

Логические принципы организации ввода-вывода

Рассмотренные в предыдущем разделе физические механизмы взаимодействия устройств ввода-вывода с вычислительной системой позволяют понять, почему разнообразные внешние устройства легко могут быть добавлены в существующие компьютеры. Все, что необходимо сделать пользователю при подключении нового устройства, – это отобразить порты устройства в соответствующее адресное пространство, определить, какой номер будет соответствовать прерыванию , генерируемому устройством, и, если нужно, закрепить за устройством некоторый канал DMA. Для нормального функционирования hardware этого будет достаточно. Однако мы до сих пор ничего не сказали о том, как должна быть построена подсистема управления вводом-выводом в операционной системе для легкого и безболезненного добавления новых устройств и какие функции вообще обычно на нее возлагаются.

Структура системы ввода-вывода

Если поручить неподготовленному пользователю сконструировать систему ввода-вывода, способную работать со всем множеством внешних устройств, то, скорее всего, он окажется в ситуации, в которой находились биологи и зоологи до появления трудов Линнея [Linnaes, 1789]. Все устройства разные, отличаются по выполняемым функциям и своим характеристикам, и кажется, что принципиально невозможно создать систему, которая без больших постоянных переделок позволяла бы охватывать все многообразие видов. Вот перечень лишь нескольких направлений (далеко не полный), по которым различаются устройства.

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

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

Похожий подход оказался продуктивным и в области программного подключения устройств ввода-вывода. Подобно тому как Линнею удалось заложить основы систематизации знаний о растительном и животном мире, разделив все живое в природе на относительно небольшое число классов и отрядов, мы можем разделить устройства на относительно небольшое число типов, отличающихся по набору операций, которые могут быть ими выполнены, считая все остальные различия несущественными. Мы можем затем специфицировать интерфейсы между ядром операционной системы, осуществляющим некоторую общую политику ввода-вывода, и программными частями, непосредственно управляющими устройствами, для каждого из таких типов. Более того, разработчики операционных систем получают возможность освободиться от написания и тестирования этих специфических программных частей, получивших название драйверов, передав эту деятельность производителям самих внешних устройств. Фактически мы приходим к использованию принципа уровневого или слоеного построения системы управления вводом-выводом для операционной системы (см. рис. 13.1).

В последующих разделах мы подробнее рассмотрим организацию и функции набора драйверов и базовой подсистемы ввода-вывода .

Контроллер ПДП

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

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

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

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

  • А вот при реализации цифрового осциллографа в уроке 29 программное чтение данных АЦП значительно ограничивало возможности устройства. На время чтения развертки осциллографа программа работала в блокирующем режиме, зависала. Приходилось даже запрещать прерывания. Благодаря высокому быстродействию STM32 удалось считывать данные АЦП с дискретностью 1 мкс, но это был предел. С большей скоростью поток данных уже не обработать.

А ведь задача пересылки данных между памятью и периферийным устройством с аппаратной точки зрения очень простая. Достаточно аппаратного счетчика адреса памяти, счетчика количества данных и промежуточного регистра. Данное считывается, например, из АЦП и записывается в память по адресу из специального регистра-счетчика. Его содержимое увеличивается на 1, и новое данное из АЦП записывается в память по следующему адресу. Процесс продолжается пока счетчик количества данных не остановит работу устройства. При этом процессор продолжает выполнение основной программы.

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

Процесс обмена данными без участия процессора (за счет аппаратных узлов микроконтроллера)

  • между памятью и периферийными устройствами микроконтроллера,
  • или между периферийными устройствами,
  • или между блоками памяти

называется прямым доступом к памяти (ПДП). Английская аббревиатура DMA - Direct memory access.

Аппаратная часть микроконтроллера, реализующая процесс прямого доступа к памяти называется контроллер прямого доступа к памяти (контроллер DMA).

Использование ПДП (DMA) позволяет:

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

Контроллер ПДП

Устройство контроллеров DMA, как правило, простое, очевидное и понятное для разработчиков программ.

Общие принципы работы контроллера прямого доступа к памяти в STM32.

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

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

  • В микроконтроллере STM32F103c8 есть только один контроллер DMA c 7 каналами. В микроконтроллерах старших серий (high-density и XL-density) добавлено второе устройство DMA.
  • Как я писал выше, прямой доступ к памяти происходит по общей с процессором системной шине. Поэтому при одновременном обращении к памяти или периферийному устройству процессора и контроллера DMA могут возникать конфликты. В результате работа процессора может приостанавливаться, но как минимум половина пропускной способности системной шины отдается процессору. Программа будет выполняться даже при интенсивном обмене через прямой доступ к памяти. Не говоря о том, что не каждая команда программы работает с оперативной памятью или периферийным устройством.
  • Инициаторами обмена с помощью контроллера DMA являются аппаратные события микроконтроллера (event). Конечно, при наличии соответствующих разрешений в управляющих регистрах. В уроке 18 я писал о событиях, и чем они отличаются от прерываний.

В общем случае прямой доступ к памяти происходит следующим образом.

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

Сам обмен данными (транзакция) с использованием DMA состоит из трех операций.

  • Данное загружается в промежуточный регистр из памяти или из регистра данных периферийного устройства в зависимости от направления обмена. Адреса памяти и периферийного устройства содержатся в специальных регистрах.
  • Данное перегружается в память или регистр данных периферийного устройства.
  • Регистр количества транзакций (элементов обмена) уменьшается на 1. При достижении 0, обмен завершается.

Все просто и логично.

Каналы DMA.

Повторюсь. В микроконтроллере STM32F103c8 есть только один контроллер DMA c 7 каналами.

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

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

В каждый момент времени обмен данными может происходить только по одному каналу. При нескольких активных каналах контроллер DMAразрешает работу канала с более высоким приоритетом.

Приоритет каждого канала устанавливается программно и может иметь четыре уровня:

  • Very high priority (очень высокий);
  • High priority (высокий);
  • Medium priority (средний);
  • Low priority (низкий).

При активных каналах с одинаковым уровнем приоритета преимущество имеют каналы с меньшим номером.

Регистры каналов.

Каждый канал для нас – отдельный аппаратный контроллер передачи данных.

Каждый канал имеет 4 собственных регистров, которые полностью определяют режим обмена данными по нему.

Каналы настолько независимы, что если вести речь обо всех регистрах контроллера DMA, то к регистрам каналов добавятся только регистры управления прерываниями.

Итак 4 регистра, с очевидным назначением.

    — адрес памяти, по которому выполняется запись или чтение в зависимости от направления передачи данных. — адрес регистра данных периферийного устройства, из которого выполняется чтение или в который производится запись. В режиме обмена данными между блоками памяти он также содержит адрес памяти. — содержит количество элементов для передачи (количество транзакций). В качестве элемента транзакции могут быть выбраны байт, полуслово, слово. — регистр конфигурации канала. Разрешает работу канала, определяет режимы передачи данных.

Полное описание регистров есть в справочнике.

Количество элементов данных для передачи устанавливается программно и может быть от 0 до 65535.

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

Что касается памяти, то как правило, необходимо записывать или считывать данные по последовательно расположенным адресам.

Для этого существует режим инкрементации адреса. Он доступен как для адреса памяти (бит MINC регистра DMA_CCRx), так и для адреса периферийного устройства (бит PINC регистра DMA_CCRx). Хотя в последнем случае не имеет смысла.

Таким образом, после каждого обращения к памяти указатель увеличивается на 1, 2 или 4, в зависимости от заданного размера элемента данных. Начальные адреса передачи данных хранятся в регистрах DMA_CMARx (для памяти) и DMA_CPARx (для периферии). В процессе обмена данными их значения не изменяются, а текущие значения указателей содержатся во внутренних регистрах микроконтроллера и программе недоступны.

Размер элементов данных транзакции может иметь значения:

  • 8 бит (байт);
  • 16 бит (полуслово);
  • 32 бита (слово).

Выбор размера данных осуществляется независимо не только для каждого канала, но и отдельно для приемника и передатчика данных каждого канала. Для этого в регистре DMA_CCRx существуют битовые поля PSIZE и MSIZE.

После выполнения последней передачи запросы по каналу перестают обслуживаться. Регистр количества данных передачи DMA_CNDTRx содержит 0. Чтобы инициировать новый DMA обмен необходимо загрузить в него новое значение. Это возможно только после отключения канала. При этом все остальные регистры канала (DMA_CMARx, DMA_CPARx и DMA_CCRx) сохраняют значения.

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

Конфигурация канала DMA.

Для использования канала необходимо конфигурировать его, выполнив следующую последовательность действий. Изначально канал должен быть запрещен (бит EN регистра DMA_CCRx сброшен).

  • Загрузить в DMA_CPARx адрес регистра данных периферийного устройства. Данные будут записываться/считываться по этому адресу после возникновения события периферийного устройства, формирующего запрос DMA.
  • Загрузить в DMA_CMARx начальный адрес блока памяти. В этот блок будут записываться данные из периферийного устройства, либо из него будут считываться данные для передачи в периферийное устройство.
  • Записать в DMA_CNDTRx общее количество элементов обмена. Каждая транзакция будет уменьшать значение этого регистра. При достижении 0, DMA передача будет остановлена.
  • Задать конфигурацию DMA передачи в регистре DMA_CCRx: направление передачи, приоритет канала, режим инкрементирования, размер элемента данных и т.д.
  • Включить канал битом EN регистра DMA_CCRx.

После этого начинают обрабатываться запросы от периферийных устройств, подключенных к каналу.

Чтением регистра DMA_CNDTRx можно узнать количество оставшихся для передачи элементов.

  • После завершения передачи половины от общего количества элементов, будет установлен флаг HTIFx в регистре DMA_ISR. Произойдет прерывание на это событие, если оно разрешено в регистре DMA_CCRx (бит HTIE).
  • После завершения передачи всех данных, будет установлен флаг TCIFx в регистре DMA_ISR. Произойдет прерывание на это событие, если оно разрешено в регистре DMA_CCRx (бит TCIE).
  • Если не задан циклический режим, то после пересылки заданного количества данных работа канала останавливается.
  • В циклическом режиме (бит CIRC регистра DMA_CCRx) после завершения передачи данных, в регистр DMA_CNDTRx автоматически перезагружается его первоначальное значение, и обмен продолжается бесконечно.

Режим “из памяти в память”.

Режим используется для копирования блоков данных в памяти.

  • Для его конфигурации необходимо установить бит MEM2MEM в регистре DMA_CCRx.
  • После включения канала битом EN регистра DMA_CCRx сразу начнется передача данных. Дополнительные запросы не требуются.

Режим запрещено использовать совместно с циклическим режимом.

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

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

  • Если разрядность источника превышает разрядность приемника, то лишние старшие разряды источника игнорируются. Например, 32х разрядное число 0x87654321 передаем в периферию с регистром данных 16 разрядов. В него запишется 0x4321.
  • Если разрядность источника меньше разрядности приемника, то недостающие старшие разряды в приемнике будут заполнены нулями. Например, 16ти разрядное число 0x4321 источника загружаем в 32х разрядный приемник. Запишется 0x00004321.

В принципе используется правило преобразования (приведения) типов данных языка C.

Специфика доступа к периферийным устройствам через шины AHB/APB.

Периферийные устройства STM32 подключены к процессору и памяти через шины AHB/APB. Это 32х разрядные шины. Они не поддерживают операций передачи меньшей разрядности. В результате в регистры периферийных устройств можно записывать или считывать из них только 32х разрядные слова.

Многие регистры периферии имеют меньшую разрядность, часто 16 разрядов. В оставшиеся биты при передаче данных DMA тоже что-то будет записываться. В большинстве случае это не важно, разряды не значащие. Но все-таки давайте внесем определенность в этот процесс.

При записи в периферийное устройство байта или полуслова через шину AHB данные на неиспользуемых линиях шины дублируются. Например.

  • Если мы записываем полуслово 0x4321, в регистр периферии загрузится 0x43214321.
  • Если мы записываем байт 0x21, в регистр периферии загрузится 0x21212121.
  • Но если мы укажем разрядность источника слово, т.е. запишем слово 0x87654321, а разрядность периферийного регистра укажем полуслово, то произойдет выравнивание разрядности, описанное в предыдущем абзаце. В результате в регистр загрузится 0x00004321.

Ошибки при DMA передаче.

Ошибка может возникнуть только в результате попытки доступа к зарезервированному адресному пространству. В этом случае канал, в котором произошла ошибка, отключается аппаратным сбросом бита EN. Устанавливается флаг ошибки TEIFx в регистре DMA_ISR. И формируется прерывание, если оно разрешено битом TEIE в регистре DMA_CCRx.

Прерывания DMA.

Для каждого канала могут генерироваться прерывания по следующим флагам регистра DMA_ISR.

  • HTIFx – завершена передача половины данных. Разрешается прерывание битом HTIE в регистре DMA_CCRx.
  • TCIFx - завершена передача всех данных. Разрешается прерывание битом TCIE в регистре DMA_CCRx.
  • TEIFx – ошибка передачи. Разрешается прерывание битом TEIE в регистре DMA_CCRx.

Соответствие каналов DMA периферийным устройствам.

Каналов DMA только 7. Периферийных устройств больше. Поэтому на каждый канал поступают сигналы запросов от нескольких периферийных устройств, объединенные логическим элементом ИЛИ. В каждый момент времени только одно устройство может использовать канал.

Остальные периферийные устройства должны отключить свои запросы DMA. Для этого у каждого устройства с поддержкой DMA есть специальный бит активации/деактивации формирования запроса.

Остается привести таблицу соответствия каналов DMA периферийным устройствам.

Соответствие каналов DMA периферийным устройствам STM32

На мой взгляд, контроллер DMA один из самых простых и понятных узлов STM32.

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

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

Например, предположим, что вам понадобится сохранить эту статью на жестком диске. Если вы решили так поступить, и знаете место на диске, куда нужно записать статью, зачем вам нужен процессор? Вы ведь не производите никаких расчетов? Не считая индикации прогресса или одновременного обновления файловой системы, больше ведь ничего и не происходит. Данные забираются вашей сетевой картой, потом они направляются в требуемое место на вашем жестком диске. Все просто. Использование возможностей процессора для такого типа операций было бы излишеством.

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

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

Взрывной или однотактный

Что случается после получения DMA-контроллером контроля над шиной памяти, зависит от того, какой режим работы установлен для DMA-контроллера. Есть два основных режима для DMA-контроллеров. Первый из них называется «взрывным» (burst). Когда DMA-контроллер работает в этом режиме, он сохраняет контроль над шиной памяти на протяжении всего процесса передачи данных. Отрицательным аспектом работы в таком режиме является то, что ЦП не сможет работать с шиной памяти, пока DMA-контроллер не завершит передачу данных. То есть процессор сможет работать только со своими кэшами первого и второго уровней, но не с чем-либо другим в памяти; очевидно, это ограничвает возможности ЦП на время ожидания процессором завершения операции и возвращения контроля над шиной памяти DMA-контроллером.

Чтобы избежать такой невыгодной ситуации, когда ЦП приходится ожидать завершения передачи данных, DMA-контроллер может работать в другом режиме, который называется однотактным (single-cycle). При работе в однотактном режиме DMA-контроллер возвращает контроль над шиной памяти после передачи каждого отдельного блока данных. Размер этого блока обычно составляет 256 или 512 байт. Это дает возможность процессору использовать шину памяти для своих целей без необходимости долго ждать. К сожалению, есть недостатки и у однотактного режима работы. После возвращения контроля над шиной памяти DMA-контроллеру нужно снова посылать запрос процессору, опять ждать разрешения на контроль над шиной памяти, чтобы сделать передачу очередного блока данных. То есть необходимость повторять последовательность запросов может в разы увеличить время простоя в процессе передачи данных.

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

Когерентность кэша

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

У этой проблемы есть два возможных решения. Системы с полной когерентностью кэша реализуют аппаратное решение, в котором DMA-контроллер отправляет сигнал контроллеру кэша, сообщающий о месте в памяти, с которым он работает. Если при прямом доступе требуется произвести запись в это место, контроллер кэша аннулирует содержимое кэша процессора. Если производится чтение, контроллер кэша обновит содержимое кэша процессора, чтобы оно содержало текущее значение (которое и должно храниться в кэше ЦП). Такой метод работы требует некоторых накладных расходов, но при этом он гарантирует когерентность кэша процессора.

В системах с неполной когерентностью кэша работа по поддержке кэша отдается операционной системе. От операционной системы в таком случае требуется, чтобы она принимала решение, стоит ли обновлять значение кэша перед операцией прямого доступа к памяти или аннулировать после нее. Какой метод лучше? Я не уверен, что есть однозначный ответ на этот вопрос, ведь оба метода достаточно адекватны. Но лично я предпочитаю элегантность аппаратного решения, реализуемого в случае полностью когерентной системы.

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) позволяет задать режим работы канала: