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

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

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

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

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

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

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

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

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

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

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

У такій реалізації 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[ред.ред. код]

Спочатку контролер жорсткого диска IBM PC / AT не підтримував DMA, і вимагав передачі всіх даних дискового введення / виведення інструкціями REP INSW / REP OUTSW через порт 0x1f0.

На початку 90х років диски MFM / RLL вимерли, змінившись дисками IDE, але регістровий інтерфейс ПЗ до контролера не змінився.

Низька продуктивність такого контролера стала серйозною проблемою, особливо на системах PCI. Крім вимоги декількох циклів PCI на 2 байти переданих даних, це призводило до завантаження процесора дисковим введенням-виведенням.

Для вирішення проблеми ряд компаній, у тому числі Intel, розробили контролери IDE з підтримкою DMA.

Контролери були і є несумісні за ПЗ між різними виробниками, хоча сумісність всіх Intel IDE / ATA / SATA знизу вгору більш-менш підтримується.

Також особливістю цієї підтримки є використання нових команд протоколу IDE / ATA, а значить, і вимога підтримки DMA не тільки контролером, а й самим жорстким диском.

Близько 2000 року підтримка DMA по шині IDE / ATA розвинулася в бік збільшення тактової частоти шини, що зажадало нового типу кабелю від контролера до диску з подвоєним числом провідників меншого розміру. Ця технологія називалася Ultra DMA (UDMA).

Багато операційних систем вимагали дій адміністратора для використання IDE DMA. Так, наприклад, стандартні ядра Linux до приблизно 2004 року не мали такої підтримки, було потрібно перестроювання ядра з відредагованим файлом конфігурації.

У сімействі Windows підтримка IDE DMA з'явилася спочатку тільки для Intel в пакетах оновлень до Windows NT4, і вимагала на більшості систем ручного редагування реєстру для задіяння.

У Windows 2000 ця вимога зникла, але з'явилася вимога обов'язкової вписки навіть не-завантажувальних дисків в BIOS і обов'язкового виставлення режиму DMA для них в налаштуваннях BIOS. Ці налаштування BIOS ставали видимі ядру ОС через технологію ACPI, і ОС не дозволяла включити DMA для диска, що не вписаного в BIOS.

Для порівняння: NT4 підтримувала і довільний розмір диска, і DMA без вписки диска в BIOS.

У системах Linux для включення або виключення IDE DMA вручну може застосовуватися команда hdparm .

Сучасні версії ядра автоматично включають DMA режим, що можна спостерігати в повідомленнях налагодження (рядки виду ata1.00: configured for UDMA/133 або hda: UDMA/33 mode selected).

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

Неспівпадіння даних в пам'яті

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

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

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

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