Відмінності між версіями «Тема 8. Прямий доступ до пам'яті (DMA).»

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук
(Створена сторінка: П'''рямий доступ до пам'яті''' (англ. '''Direct Memory Access''', DMA) - режим обміну даними між пристроями ...)
 
 
Рядок 1: Рядок 1:
П'''рямий доступ до пам'яті''' (англ. '''Direct Memory Access''', DMA) - режим обміну даними між пристроями або ж між пристроєм і основною пам'яттю (RAM) без участі центрального процесора (ЦП). У результаті швидкість передачі збільшується, так як дані не пересилаються в ЦП і назад.
+
'''Прямий доступ до пам'яті''' (англ. '''Direct Memory Access''', DMA) - режим обміну даними між пристроями або ж між пристроєм і основною пам'яттю (RAM) без участі центрального процесора (ЦП). У результаті швидкість передачі збільшується, так як дані не пересилаються в ЦП і назад.
  
 
Крім того, дані пересилаються відразу для багатьох слів, розташованих по поспіль йдуть адресами, що дозволяє використання т. зв. «Пакетного» (burst) режиму роботи шини - 1 цикл адреси і наступні за ним численні цикли даних. Аналогічна оптимізація роботи ЦП з пам'яттю вкрай утруднена.
 
Крім того, дані пересилаються відразу для багатьох слів, розташованих по поспіль йдуть адресами, що дозволяє використання т. зв. «Пакетного» (burst) режиму роботи шини - 1 цикл адреси і наступні за ним численні цикли даних. Аналогічна оптимізація роботи ЦП з пам'яттю вкрай утруднена.

Поточна версія на 11:18, 14 травня 2013

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

Крім того, дані пересилаються відразу для багатьох слів, розташованих по поспіль йдуть адресами, що дозволяє використання т. зв. «Пакетного» (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).


Режими Ultra DMA протоколу ATA для ОС Linux

sudo hdparm -i /dev/sda

Mode 0 16.7 UDMA16
Mode 1 25.0 UDMA25
Mode 2 33.3 UDMA33
Mode 3 44.4 UDMA44
Mode 4 66.7 UDMA66
Mode 5 100.0 UDMA100
Mode 6 133.3 UDMA133
MByte/s