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

Матеріал з Вікі ЦДУ
Версія від 15:34, 10 листопада 2014; Лисков Сергій (обговореннявнесок)

(різн.) ← Попередня версія • Поточна версія (різн.) • Новіша версія → (різн.)
Перейти до: навігація, пошук

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

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

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

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

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

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


Захоплення шини (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 і віртуальна пам'ять, IOMMU і AGP GART [ред | правити вікі-текст] В операційних системах з сторінкової віртуальної пам'яттю, таких, як Windows і сімейство UNIX, безперервний регіон віртуальних адрес може бути реалізований розривно розташованими фізичними сторінками.

Виконання DMA по такому регіону являє собою досить складну задачу. Також складним завданням є виконання DMA по відвантажуваної пам'яті.

Вирішення цього завдання вимагає виявлення фізичних сторінок, що реалізують регіон, і їх блокування від відвантаження зверненням до підсистеми віртуальної пам'яті. Далі стає можливим знаходження фізичних адрес сторінок регіону, які в загальному випадку не є безперервними і формують так званий «список розсіювання / складання» (англ. Scatter-gather list - SGL).

Завдання виконання DMA по такому списку може бути вирішена одним із таких способів.

1. Виділення поспіль йде фізичної пам'яті в ядрі операційної системи і проміжне копіювання всіх даних туди / звідти (т. Н. «Буфер відскоку» - англ. Bounce buffer).

Підтримується всіма провідними операційними системами, для активації підтримки в Windows потрібно виклик IoGetDmaAdapter з параметром DEVICE_DESCRIPTION :: ScatterGather, встановленому в FALSE.

Недоліки: трата часу процесора на копіювання, споживання вкрай обмеженого ресурсу безперервної фізичної пам'яті, заняття місця в обмеженої частини пам'яті, до якої є доступ у DMA (перший гігабайт на x86). 2. Розбиття операції на подоперации по кордонах елементів SGL, з перериванням в кінці кожної операції.

Використовувалося в старих 8-бітних SCSI-контролерах, що поставляються зі сканерами типу HP ScanJet.

Недоліки: велика кількість переривань. 3. Підтримка SGL самим пристроєм, з вимогою копіювання SGL, перетвореного в формат, специфічний для пристрою, в пристрій через численні звернення до регістрів пристрою.

Недоліки: вкрай висока складність пристрою, невисока продуктивність великої кількості записів в регістри. 4. Підтримка SGL самим пристроєм, з вимогою розміщення SGL, перетвореного в формат, специфічний для пристрою, в фізично безперервному регіоні основний пам'яті.

Пристрій читає SGL тим же механізмом DMA з захопленням шини, що й власне дані, тим самим реалізуючи функціональність якогось процесора, який читає і виконуючого свою власну «програму», реалізовану як список дескрипторів SGL. Дана архітектура називається «ланцюгової DMA» (англ. Chain DMA), реалізована в практично всім стандартному обладнанні сучасного комп'ютера - Intel IDE (в примітивному вигляді), UHCI і OHCI USB, OHCI 1394, а також у більшості PCI-адаптерів, Ethernet і SCSI (навіть в застарілому AIC78xx). Хороший приклад реалізації даної архітектури в дуже складному і розвиненому вигляді дан в специфікації обладнання OHCI 1394. За деякими відомостями, дана архітектура під назвою «канальні програми» використовувалася ще в IBM 360, відомих в СРСР як ЄС ЕОМ.

Недоліки: висока складність пристрою, хоча і нижче в числі транзисторів, ніж попередній варіант. Наприклад, контролер UHCI USB (згідно специфікації на сайті Intel) вимагає близько 5000 транзисторів. 5. Підтримка SGL в межшінном обладнанні, при якій уявлення фізично розривного буфера для сторони пристрою виглядає фізично безперервним.

Таке обладнання називається IOMMU (англ. IO memory management unit). Реалізовувалося як на комп'ютерах фірми Sun Microsystems для шини SBus, так і на комп'ютерах DEC Alpha для шини PCI. До недавніх часів практично ніколи не реалізовувалося в звичайних x86 / PCI системах, хоча в даний час є тенденція до зміни цієї ситуації, головним чином з метою підвищення продуктивності гіпервізорів віртуальних машин. Завжди реалізовувалося для шини AGP під назвою AGP GART з метою полегшити довільний доступ тривимірного видеопроцессора до текстур, які у основний пам'яті. З боку пристрою дане обладнання було стандартизовано специфікацією AGP, з боку програмного забезпечення стандартизації не існувало, і реалізація залежала від виробника мікросхеми північного мосту між AGP і пам'яттю (звідси необхідність в «драйвере AGP», такому, як agp440.sys для мікросхем Intel). Набір викликів ядер розвинених операційних систем, таких, як Windows, завжди містив архітектурну абстракцію IOMMU (MapTransfer і GetScatterGatherList, ці ж виклики підтримують і bounce buffer, який розуміється як різновид IOMMU), що дозволяє одному і тому ж драйверу пристрою підтримувати його при приєднанні через різні IOMMU .

Недоліки: вимога складної логіки вже не в устрої, а в платформі.


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).