Прямий доступ до пам'яті

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Прями́й до́ступ до па́м'яті ( англ. Direct Memory Access, DMA) — режим обміну даними між пристроями або ж між пристроєм і основною пам'яттю без участі центрального процесора. У результаті швидкість передачі збільшується, тому що дані не пересилаються до центрального процесора і назад.

Крім того, дані пересилаються відразу пачками слів, адреси яких розташовані поспіль, що дозволяє використання так званого «Пакетного» (burst) режиму роботи шини : 1 цикл адреси та наступні за ним численні цикли даних.

Аналогічна оптимізація роботи ЦП з пам'яттю вкрай ускладнена.

В оригінальній архітектурі IBM PC (шина ISA) був можливий лише за наявності апаратного DMA-контролера (мікросхема Intel 8237[en]).

DMA-контролер може отримувати доступ до системної шини незалежно від центрального процесора. Контролер містить кілька регістрів, доступних центральному процесору для читання і запису. Регістри контролера задають порт (який повинен бути використаний), напрям перенесення даних (читання / запис), одиницю переносу (побайтно / послівно), число байтів, яке слід перенести.

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

Контролер може бути багатоканальним, здатним паралельно виконувати кілька операцій.

Захоплення шини (bus mastering)[ред. | ред. код]

У шинах Micro Channel Architecture (MCA), SBus[en], а також PCI і її концептуальних похідних AGP і PCI-X, використовується інша реалізація DMA. Ці шини дозволяють будь-якому пристрою заявити про виникнення потреби до захоплення шини, така потреба задовольняється так званим арбітром[en] при першій можливості. Пристрій, який успішно здійснив захоплення шини, самостійно виставляє на шину сигнали адреси і керування та виконує протягом якогось часу ту ж провідну роль на шині, що і ЦП. Доступ ЦП до шини при цьому короткочасно блокується.

У такій реалізації DMA не існує DMA-контролера, а також номери входу DMA-контролера.

Деякі старі пристрої PCI, а саме, реалізації звукових карт сімейства Sound Blaster, використовували той же DMA-контролер 8237 з оригінальної архітектури IBM PC. Таке використання є, безумовно, застарілим для PCI, але підтримувалося з метою забезпечити повну сумісність за ПЗ і драйверам з версіями Sound Blaster для шини ISA.

Дана підтримка називається Distributed DMA (D-DMA) і реалізована апаратним чином як у пристрої, так і в логіці моста PCI-ISA, в якій на PCI-системах розміщена і логіка оригінального IBM PC DMA контролера 8237.

Реалізація включає в себе 2 запити: спочатку від пристрою мосту PCI-ISA, потім від мосту основної пам'яті.

Крім згаданих реалізацій Sound Blaster, практично ніякі пристрої PCI не використовують поняття «номер входу DMA-контролера», як і 8237 взагалі.

DMA і IDE / ATA, Ultra DMA[ред. | ред. код]

Докладніше: UDMA

Когеренція кеш-пам'яті[ред. | ред. код]

Незбігання даних у пам'яті

DMA може призвести до проблем кеша, якщо процесор оснащений кеш-пам'яттю і є зовнішня пам'ять, доступ до якої може надаватися безпосередньо пристрою за допомогою DMA. Коли процесор звертається до даних X, розташованих в пам'яті, поточне значення буде зберігатися в кеші. Наступні операції з X будуть оновлювати в кеші копію X, але не версію X в зовнішній пам'яті, припускаючи, що запис в кеші. Якщо кеш не скидається в пам'ять перед наступним разом, коли пристрій намагається отримати доступ до X, то пристрій буде отримувати несвіже значення X.

Аналогічним чином, якщо пристрій записує нове значення в пам'ять, кешована копія Х не є дійсною, і процесор буде працювати з несвіжим значенням X.

Цікава інформація[ред. | ред. код]

Примітки[ред. | ред. код]

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]