
Название опции:
DMA Mode
Возможные значения:
Описание:
Опция позволяет указать режим прямого доступа к памяти (DMA — Direct Memory Access, UDMA — Ultra DMA), используемый при работе накопителя, подключенного к данному каналу стандартного IDE/SATA-контроллера чипсета. Как правило, можно использовать режим автоматического определения возможностей накопителя (Auto). В случае проблем с данным конкретным диском можно попытаться отключить режим DMA (Disabled). Только стоит иметь в виду, что это приведет к существенному падению производительности дисковой подсистемы, использовать эту меру можно только в крайнем случае.
Зачастую среди значений данной опции присутствуют не только варианты, дающие возможность включить или отключить режим прямого доступа к памяти, но и значения, позволяющие указать конкретный режим. Тогда, если накопитель работает нестабильно, можно попробовать вместо полного отключения DMA перейти на один из младших режимов. Возможно, это полностью решит проблему, при этом не столь пагубно сказавшись на производительности дисковой подсистемы.
Для справки приведем названия режимов и максимальную скорость обмена данными с накопителем интерфейса IDE или SATA для каждого из режимов (следует учитывать, что режимы DMA дополняют режимы PIO Mode, обеспечивая существенно большую скорость работы):
| Single-Word DMA 0 | 2.1 Мбайт/сек |
| Single-Word DMA 1 | 4.2 Мбайт/сек |
| Single-Word DMA 2 | 8.3 Мбайт/сек |
| Multi-Word DMA 0 | 4.2 Мбайт/сек |
| Multi-Word DMA 1 | 13.3 Мбайт/сек |
| Multi-Word DMA 2 | 16.7 Мбайт/сек |
| Ultra DMA 0 | 16.7 Мбайт/сек |
| Ultra DMA 1 | 25.0 Мбайт/сек |
| Ultra DMA 2 или Ultra DMA 33 | 33.3 Мбайт/сек |
| Ultra DMA 3 | 44.4 Мбайт/сек |
| Ultra DMA 4 или Ultra DMA 66 | 66.7 Мбайт/сек |
| Ultra DMA 5 или Ultra DMA 100 | 100.0 Мбайт/сек |
| Ultra DMA 6 или Ultra DMA 133 | 133.0 Мбайт/сек |
Все современные жесткие диски с интерфейсом IDE способны работать как минимум в режиме Ultra DMA 100. Приводы оптических дисков и им подобные устройства обычно используют режим Ultra DMA 33, есть модели, использующие Ultra DMA 66. Таким образом, для более или менее современных жестких дисков должна быть установлена комбинация PIO Mode 4 и Ultra DMA 100 (как вариант, Ultra DMA 133), но лучше установить значение Auto. Для приводов оптических дисков и им подобных устройств — PIO Mode 4 и Ultra DMA 33 (как вариант, Ultra DMA 66), но, опять же, лучше использовать Auto.
Для начала немного про PIO /DMA/UDMA способы/режимы доступа к данным на жестком диске:
Прямой доступ к памяти (DMA — Direct Memory Access) — это аппаратная возможность обмена информацией между устройствами, практически не требующая участия центрального процессора (протоколы — Multiword DMA и Ultra DMA), что позволяет во время выполнения передачи данных использовать ресурсы центрального процессора для выполнения других задач. Для режимов Ultra DMA-3 и выше необходим 80-жильный интерфейсный кабель.
Максимальная пропускная способность протоколов передачи данных (Мб/c (Мбайт/сек))
Single-Word DMA 0 = 2.1
Single-Word DMA 1 = 4.2
Single-Word DMA 2 = 8.3
Multi-Word DMA 0 = 4.2
Multi-Word DMA 1 = 13.3
Multi-Word DMA 2 = 16.7
Ultra DMA 0 = 16.7
Ultra DMA 1 = 25.0
Ultra DMA 2 или Ultra DMA 33 = 33.3
Ultra DMA 3 = 44.4
Ultra DMA 4 или Ultra DMA 66 = 66.7
Ultra DMA 5 или Ultra DMA 100 = 100.0
Ultra DMA 6 или Ultra DMA 133 = 133.0
Для работы UDMA устройств требуется соблюдение следующих условий :
Настройки DMA /UDMA в BIOS
Настройки DMA /UDMA в Windows XP
- Intel(R) 82801DB Ultra ATA Controller
- Поставщик драйвера: Intel
- Дата разработки: 01.10.2002
- Версия драйвера: 2.3.0.2160
- Цифровая подпись: Microsoft Windows Hardware Compatibility Publisher
Проблемы с настройкой DMA /UDMA в Windows XP начались с желания обновить драйвера для набора микросхем Intel® с сайта производителя;(. Так например загрузив самые якобы свежие драйвера для набора микросхем Intel® 845 Chipset Family , непосредственно с сайта производителя intel.com, в исполняемом файле infinst_autol.exe для автоматической их установки — после установки онных в системе был установлен драйвер Intel(R) 82801DB Ultra ATA Controller , тот который Дата разработки: 01.10.2002, Версия драйвера: 2.3.0.2160 .
Дальше, по рекомендации Intel® " If you need a Bus Master driver for the newer Intel® 800 series chipsets, we recommend using the Intel® Application Accelerator. ", был установлен Intel® Application Accelerator. Стоит отметить, что при установке Intel® Application Accelerator устанавливается и драйвер Intel(R) 82801DB Ultra ATA Controller , тот который Дата разработки: 01.10.2002, Версия драйвера: 2.3.0.2160 .
Intel® Application Accelerator предоставляет графический интерфейс для управления Intel(R) контроллером но, после перезагрузки никакой акселерации подразумеваемой или явной ощутить не представилось возможным!:)
Мало того, система стала туго/долго входить в спящий режим и это при том, что в так званом Intel® Application Accelerator стоял режим передачи UDMA-5. Дальше больше.
При выходе из спящего режима Windows стал зависать на сообщении "Восстановление Windows" с белой полосой загрузки внизу. Эта проблема проявляется только когда Windows отправлен в спящий режим из под учётной записи обычного (ограниченного в правах) пользователя. Проблема отсутствует если Windows отправлен в спящий режим из под учётной записи пользователя с административными правами (администратора), в таком случае Windows успешно выходит из спящего режима. Но, тем не менее выход в спящий режим был нудно долгим и затяжным процессом — около 30-40 сек.
Ай да Intel®, ай да Application Accelerator, ох и молодчег — как услужил. После сноса Intel® Application Accelerator драйвер Intel(R) 82801DB Ultra ATA Controller , тот который Дата разработки: 01.10.2002, Версия драйвера: 2.3.0.2160 , остался вместе с проблемой спящего режима. Удаление из диспетчера устройств Intel(R) 82801DB Ultra ATA Controller и его каналов с перезагрузкой ничего не дали как и обновление его драйверов с сайта Microsoft.
С другими версиями драйвера Intel(R) 82801DB Ultra ATA Controller кроме как с Дата разработки: 01.10.2002 Версия драйвера: 2.3.0.2160 штука по имени Intel® Application Accelerator работать отказывается и выдаёт:
Пришлось ручками выбирать нужный драйвер Intel(R) 82801DB Ultra ATA Storage Controller — 24CB который Дата разработки: 14.11.2003, Версия драйвера: 5.1.1.1001 , установленный ранее вместе с Windows. Почему такое различие с драйверами достоверно не известно, ведь поставщик один и тот же Intel(R), а версии разные — вероятно старый, добрый банальный чел. фактор.
После восстановления драйвера проблемы со спящим режимом улетучились, а время ухода в спящим режим сократилось до 5-10 сек.!
Мораль сей басни такова: если не хочешь себе геморроя, то не стоит использовать/всякие твикеры и акселераторы даже если они от Intel(R)!, а все настройки выполнять ручками или стандартными средствами администрирования самой ОС.
Тонкая настройка DMA /UDMA в Windows XP
Для более тонкой настройки DMA /UDMA в Windows XP нужно нырять в дебри реестра Windows. Паpаметpы контpолёpа хранятся в pеестpе Windows, по адpесy HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass <4D36E96A-E325-11CE-BFC1-08002BE10318>. Внyтpи этой ветки находится 4 каталога:
Выбираем каталог который отвечает за нужный нам канал, и заходим в него. Каждому из каналов (yстpойств), соответствуют по два ключа, MasterDeviceTimingModeAllowed и SlaveDeviceTimingModeAllowed (или UserMasteDeviceTimingModeAllowed и UserSlaveDeviceTimingModeAllowed, если pежимы выбиpались вpyчнyю), определяющие максимальный режим работы Master и Slave yстpойств, yстановленных на контpолёpе, и MasterDeviceTimingMode и SlaveDeviceTimingMode, котоpые опpеделяют в каком pежиме pеально pаботают Slave и Master yстpойства.
Для того что бы pазpешить использовать yстpойство в UDMA pежиме, MasterDeviceTimingModeAllowed (или Slave:, зависит от того к чемy диск подключен) должно иметь значение 0хffffffff. Если оно бyдет 0x0000001f, то yстpойство сможет pаботать только в PIO pежиме. Убедившись что этот ключ стоит пpавильно, выставляем MasterDeviceTimingMode, опpеделяя в каком pежиме должен pаботать пpивод.
Возможны следyющие ваpианты (цифpы в HEX) значений в шестнадцатеричной системе:
- 0x10010 — pежим UDMA Mode 5 (ATA100).
- 0x8010 — pежим UDMA Mode 4 (ATA66).
- 0x2010 — pежимы UDMA Mode 2 (ATA33).
- 0x0410 — pежим Multi-Word DMA Mode 2 и PIO 4.
Кроме этого, UDMA Mode 4 можно включить 0xffff, а UDMA Mode 5 — 0xfffff. Выставляйте нyжное, и пеpезагpyжайтесь, диск должен пеpейти в тpебyемый pежим
ВНИМАНИЕ!: Для Windows 7 ключи в реестре от ХР не совпадают.
Проблемы с DMA /UDMA на жестких дисках с IDE интерфейсом
Исходя из расшифровки DMA (DMA — Direct Memory Access) это аппаратная возможность обмена информацией между устройствами и основной памятью (RAM), практически не требующая участия центрального процессора, тобишь возможность обмена данными при помощи прямого доступа к оперативной (основной) памяти.
Так как оперативная память является основной и от её достатка и оперативности зависит скорость работы всех приложений и отображения результата их работы на экране, то при её нехватке и одновременном доступе DMA /UDMA устройства к памяти ВОЗМОЖНО (не факт) могут возникать проблемы типа хаотичного перемещения указателя мыши, застывания мыши/изображения и т.п., а особенно эти проблемы могут проявляться при наличии в системе нескольких DMA /UDMA устройств!
Лечение проблем с DMA /UDMA на жестких дисках с IDE интерфейсом
Первое на что следует обратить внимание, так это на то, что многие очень часто ставят на один канал жесткий диск как Primary master и другое, более медленное устройство, типа CD-ROM, как Primary slave. Но так как IDE может обращаться только к одному устройству на канале одномоментно, то снижается производительность системы в целом. Так что Лучше не иметь slave-устройств в принципе.
На каком IDE диске ограничивать DMA /UDMA когда все на одном IDE канале?
Также в случае когда в системе используется несколько модулей оперативной памяти разной ёмкости (256/512/1024 МВ и т.д.), рекомендуется на первое место/слот (DIMM1) устанавливать тот модуль который имеет наибольший объем памяти! Проверить где и какой модуль установлен можно при помощи программы " EVEREST > Системная плата > SPD (смотреть DIMM1/DIMM2) ".
Всем привет, сегодня мы с вами поговорим о DMA: именно о той технологии, которая помогает вашему компьютеру воспроизводить для вас музыку, выводить изображение на экран, записывать информацию на жесткий диск, и при этом оказывать на центральный процессор просто мизерную нагрузку.
DMA, что это? О чем вы говорите?
DMA, или Direct Memory Access – технология прямого доступа к памяти, минуя центральный процессор. В эпоху 486-ых и первых Pentium во всю царствовала шина ISA, а также метод обмена данными между устройствами – PIO (Programmed Input/Output).
PIO по своей сути прост: чтобы получить данные с устройства, драйвер операционной системы (или же firmware другого устройства), должен был читать эти данные из регистров устройства. Давайте разберемся на примере:
- На сетевую карту пришло 1500 байт данных.
- Сетевая карта инициирует прерывание с целью сообщить процессору, что данные необходимо забрать с устройства, иначе произойдет так называемый buffer overrun.
- Операционная система ловит прерывание от контроллера прерываний и отдает его на обработку драйверу.
- Драйвер в цикле побайтно читает данные с регистров сетевой карты.
В итоге, если чтение одного байта отнимает около 1 мс процессорного времени, то чтение 1500 байт – соответственно 1500 мс. Но это всего лишь один Ethernet пакет, представте себе, сколько пакетов получает сетевая карта, когда вы читаете любимый хабрахабр. Конечно в реальности чтение в PIO режиме можно организовывать по 2, 4 байта, однако потери производительности при этом все равно будут катастрофическими.
Когда объемы данных, которыми оперирует процессор начали возрастать, стало понятно, что нужно минимизировать участие процессора в цепочке обмена данными, а то прийдется туго. И вот тогда активное применение нашла технология прямого доступа к памяти.
Кстати говоря, DMA используется не только для обмена данными между устройством и ОЗУ, но также между устройствами в системе, возможен DMA трансфер между двумя участками ОЗУ (хотя данный маневр не применим к x86 архитектуре). Также в своем процессоре Cell, IBM использует DMA как основной механизм обмена данными между синергетическими процессорными элементами (SPE) и центральным процессорным элементом (PPE). Также каждый SPE и PPE может обмениватся данными через DMA с оперативной памятью. Данный прием – на самом деле большое преимущество Cell, ибо избавляет от проблем когерентности кешей при мультипроцессорной обработке данных.
И снова теория
Прежде чем мы перейдем к практике, я бы хотел осветить несколько важных аспектов программирования PCI, PCI-E устройств.
Я вскользь упомянул о регистрах устройства, но как же к ним имеет доступ центральный процессор? Как многие из вас знают, есть такая сущность в компьютерных технологиях, как IO порты (Input/Output ports). Они предназначены для обмена информацией между центральным процессором и периферийными устройствами, а доступ к ним возможен с помощью специальных ассемблерных инструкций — in/out. BIOS (или OpenFirmware на PPC based системах) на ранних этапах инициализации PCI устройств, а также некоторых других (Super IO контроллера, контроллера PS/2 устройств, ACPI timer и т.д.), закрепляет за определенным контроллером собственный диапазон IO портов, куда и отображаются регистры устройства.
Также регистры устройства могут отображатся в ОЗУ (Memory Mapped Registers), т.е. на физическое адресное пространство. Данный метод имеет ряд преимуществ, а именно:
- Скорость доступа к физической памяти выше, нежели к IO портам.
- IO порты могут отображать не более 65535 байт регистров, в то время как размер ОЗУ современных компьютеров в разы больше.
- Читать регистры устройства из ОЗУ проще, нежели с помощью IO портов 🙂
Данные о том, какой диапазон IO портов или ОЗУ закреплен за устройством, хранятся в конфигурационном пространстве PCI, а именно в регистрах BAR0, BAR1, BAR2, BAR4, BAR5 [1].
Итак, существует два метода утилизации DMA: contiguous DMA и scatter/gather DMA.
Contiguous DMA
Данный метод очень прост и сейчас практически отжил свое, однако до сих пор используется для программирования звуковых контроллеров (к примеру Envy24HT). Его принцип следующий:
- Выделяется один буфер достаточно большого размера в оперативной памяти.
- Физический адрес (точнее сказать адрес на шине участка памяти, потому как physical address и bus address – равны в x86 архитектуре, но не равны в PPC) этого буфера записывается в регистр устройства.
- Во время того, как приходят данные на устройство, контроллер устройства инициирует DMA трансфер.
- После того, как буфер полностью заполнен, контроллер устройства инициирует прерывание, чтобы сообщить центральному процессору, что буфер следует передать операционной системе.
- Драйвер операционной системы обрабатывает прерывание, и передает полученные данные из буфера, далее по стеку устройств операционной системы.
Как видите все достаточно просто, и как только шина ISA обзавелась поддержкой DMA, данный метод нашел очень широкое применение. Например драйвера сетевых карт имели два таких DMA буфера: один на прием данных (rx), другой на отсылку (tx).
Scatter/gather DMA
С ростом скорости Ethernet адаптеров, contiguous DMA показал свою несостоятельность. В основном из-за того, что требовались области памяти достаточно большого размера, которые подчас невозможно было выделить, так как в современных системах фрагментация физической памяти достаточно высока. Во всем виноват механизм виртуальной памяти, без которого нынче никуда 🙂
Решение напрашивается само собой: использовать вместо одного большого участка памяти несколько, но в разных регионах этой самой памяти. Возникает вопрос, но как же сообщить контроллеру устройства, как инициировать DMA трансфер и по какому адресу писать данные? И тут нашли решение, использовать дескрипторы, чтобы описывать каждый вот такой участок в оперативной памяти.
Типичный дескриптор DMA буфера содержит следующие поля:
- Адрес участка ОЗУ (именно bus address), который предназначен для DMA трансфера.
- Размер описываемого участка ОЗУ.
- Опциональные флаги и другие специфические аргументы.
- Адрес следующего дескриптора в памяти.
Структура дескрипторов определяется конкретным производителем контроллера устройства, и может содержать какие-либо другие поля. Дескриптор также как и DMA буфер, размещается в оперативной памяти.
Алгоритм scatter/gather DMA следующий:
- Драйвер операционной системы выделяет и иницилизирует дескрипторы DMA буферов.
- Драйвер выделяет DMA буферы (участки ОЗУ для DMA трансфера) и записывает необходимую информацию о них в дескрипторы.
- Устройство по мере возникновения потребности, заполняет DMA буферы, и после того, как заполнен один или несколько буферов инициирует прерывание.
- Драйвер ОС просматривает все дескрипторы DMA буферов, определяет какие из них были заполнены контроллером устройства, пересылает данные из буфера далее по стеку устройств и помечает буфер как готовый к DMA трансферу.
Порядок в каком контроллер устройства заполняет DMA буферы, определяется производителем. Контроллер может писать в первый свободный DMA буфер, либо просто писать подряд (дескрипторы DMA буферов в данном случае образуют односвязный кольцевой список) во все буфера и т.д.
На сегодня пожалуй все, иначе информации станет слишком много. В следующей статье я покажу вам, как с этой уличной магией работает IOKit. Жду отзывов и дополнений 😉






