Вітаємо вас на нашому блозі! Сподіваємося, що ви зможите знайти тут для себе щось цікаве. Сподіваємося, що вам сподабається. Щиро ващі студенти БДПУ 2ІФ групи)

Історія мікропроцессорів 

DMA в пристроях

DMA- це режим обміну даними між пристроями комп'ютера або ж між пристроєм і основною пам'яттю, в якому центральний процесор  не бере участь.

 Саме DMA   технологія допомагає вашому комп'ютеру відтворювати для вас музику, виводити зображення на екран, записувати інформацію на жорсткий диск, і при цьому надавати на центральний процесор просто мізерну навантаження.


Уявімо таку ситуацію на мережеву карту прийшло 1600 байт даних,мережева карта ініціює переривання з метою повідомити процесору, що дані необхідно забрати з пристрою, інакше станеться так званий переповненя буфера(buffer overrun).Операційна система ловить переривання від контролера переривань і віддає його на обробку драйверу,драйвер в циклі побайтно читає дані з регістрів мережевої карти.

 Якщо читання одного байта забирає близько 1 мс процесорного часу, то читання 1600 байт - відповідно 1600 мс. Але це всього лише один Ethernet пакет, уявімо собі, скільки пакетів отримує мережева карта, коли ви відвідуєте звичайні сайти.В реальності читання в PIO режимі можна організовувати по 4, 8 байта, проте втрати продуктивності при цьому все одно будуть завелекі.Саме тоді стала проблема як мінімізувати участь процесора в обміні даних.


  Як же до регістрів пристроїв  центральний процесор має доступ? В комп'ютерних технологіях є така сутність  як Input / Output ports(IO порти). Їх призначення для обміну інформацією між центральним процесором і периферійними пристроями, а доступ до них можливий за допомогою спеціальних ассемблерних інструкцій - in / out. BIOS  на ранніх етапах ініціалізації PCI пристроїв, а також деяких інших (Super IO контролера, контролера PS / 2 пристроїв, ACPI timer і т.д.), закріплює за визначеним контролером власний діапазон IO портів, куди і відображаються регістри пристрою.

Існує два методу утілізації DMA-contiguous  и scatter/gather DMA.

DMA-contiguous

Даний метод зараз практично віджив своє, проте до цих пір використовується для програмування звукових контролерів (наприклад Envy24HT). Його принцип наступний:
Виділяється один буфер досить великого розміру в оперативній пам'яті.
Фізична адреса  цього буфера записується в регістр пристрою.
Під час того, як приходять дані на пристрій, контролер пристрої ініціює DMA трансфер.
Після того, як буфер повністю заповнений, контролер пристрої ініціює переривання, щоб повідомити центрального процесора, що буфер слід передати операційній системі.
Драйвер операційної системи обробляє переривання, і передає отримані дані з буфера, далі по стеку пристроїв операційної системи.

 Як тільки шина ISA обзавелася підтримкою DMA, даний метод знайшов дуже широке застосування. Наприклад драйвера мережевих карт мали два таких DMA буфера: один на  rx(прийом даних), інший на  tx(відсилання).

DMA Scatter / gather 

З ростом швидкості Ethernet адаптерів, contiguous DMA перестав справлятися. В основному через те, що були потрібні області пам'яті досить великого розміру, які часом неможливо було виділити, тому що в сучасних системах фрагментація фізичної пам'яті досить висока.

Було прийнятто рішення:  використовувати замість одного великого ділянки пам'яті кілька, але в різних регіонах цієї самої пам'яті. Але як же повідомити контролеру пристрою, як ініціювати DMA трансфер і за якою адресою писати дані? І тут знайшли рішення, використовувати Дескриптори, щоб описувати кожну ось таку ділянку в оперативній пам'яті.

Типовий дескриптор DMA буфера містить наступні поля:
-Адреса ділянки ОЗУ (саме bus address), які призначений для DMA трансферу.
-Розмір описуваного ділянки ОЗУ.
-Опціональні прапори та інші специфічні аргументи.
-Адреса наступного дескриптора в пам'яті.

Структура дескрипторів визначається конкретним виробником контролера пристрою, і може містити будь-які інші поля. Дескриптор також як і DMA буфер, розміщується в оперативній пам'яті.

Алгоритм scatter / gather DMA наступний:
-Драйвер операційної системи виділяє і ініцілізірует Дескриптори DMA буферів.
-Драйвер виділяє DMA буфери (ділянки ОЗУ для DMA трансферу) та записує Необхідну інформацію про них в Дескриптори.
-Пристрій у міру виникнення потреби, заповнює DMA буфери, і після того, як заповнений один або кілька буферів ініціює переривання.
-Драйвер ОС переглядає всі Дескриптори DMA буферів, визначає які з них були заповнені контролером пристрою, пересилає дані з буфера далі по стеку пристроїв і позначає буфер як готовий до DMA трансферу.

Трохи про настройку DMA на вашому hdd (Linux)

-----------------------------------------------------------------------------------
  /dev/hda:

    Model=QUANTUM FIREBALLlct20 20, FwRev=APL.0900, SerialNo=552114732078
    Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
    RawCHS=16383/16/63, TrkSize=32256, SectSize=21298, ECCbytes=4
    BuffType=DualPortCache, BuffSize=418kB, MaxMultSect=8, MultSect=off
    CurCHS=16383/16/63, CurSects=-66060037, LBA=yes, LBAsects=39876480
    IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
    PIO modes: pio0 pio1 pio2 pio3 pio4
    DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5
    AdvancedPM=no
    Drive Supports : ATA/ATAPI-5 T13 1321D revision 1 : ATA-1 ATA-2 ATA-3
    ATA-4 ATA-5
-----------------------------------------------------------------------------------


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

Для установки режиму mdma (multiword DMA), використовуйте ключ -X <базове число = 32> + номер DMA. Наприклад для mdma2 команда буде виглядати так:

        # Hdparm -X34 / dev / hda // 32 + 2 (для mdma2)
Режими PIO і UltraDMA встановлюються аналогічно, з тією лише різницею, що базове число для PIO дорівнює 8, а для UltraDMA - 64. Коли я писав ці рядки, у мене стояв жорсткий диск, що підтримує ATA100, так що його можна перевести в режим udma5 командою :

        # Hdparm -X69 / dev / hda // 64 + 5 (для udma5)
Майте на увазі, що вищі режими DMA доступні не на всіх чіпсетах.

Для режимів ATA66 і ATA100 потрібно 80-ти жильний IDE шлейф (кабель). Думаю, що диск, підключений іншим шлейфом, в цих режимах працювати не буде.

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

Якщо вам доводиться працювати з великими файлами, то можете спробувати встановити більше значення. За замовчуванням встановлюється число 8 (щось близько 4 Кб).

Синтаксис команди:

        # Hdparm -a N / dev / hda
де n - число секторів для випереджаючого читання.



Комментариев нет:

Отправить комментарий