Андрей Смирнов
Время чтения: ~23 мин.
Просмотров: 1

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

Сведения о вопросе

1. Создайте снимок экрана, на котором видна Ваша проблема при помощи клавиши на клавиатуре Print Screen , так, как указано здесь .

2. Запустите программу Paint ( Пуск — Все программы — Стандартные ) и в ней нажмите сочетание клавиш Ctrl-V или выберите пункт Вставить в меню Правка вверху.

3. В программе появится снимок экрана, который вы сделали на этапе 3. После этого сохраните снимок в файл, нажав Ctrl-S или выбрав в меню Файл команду Сохранить .

4. Повторяя шаги 1-3, создайте столько снимков, сколько требуется для полного описания ситуации — если возникает одна ошибка или появляется одно сообщение, достаточно одного, иногда двух-трёх снимков. Если нужно больше снимков экрана, к примеру, для описания процедуры повторения ошибки, последовательно создайте столько, сколько требуется и сохраните в отдельные файлы.

5. После этого зайдите на веб-узел http://skydrive.live.com ( если там всё на английском, справа вверху выберите Options — Language , Русский ).

6. После смены языка увидите папку Общедоступные — выбирайте ее, нажмите Добавить файлы .

7. Перетащите файлы со снимками экрана на форму на сайте. После того, как перетащили — нажимайте Передать .

8. После завершения передачи перейдите в папку Общедоступные , скопируйте её адрес из адресной строки и вставьте сюда. Мы сможем получить доступ к этим файлам и проанализировать ситуацию более подробно.

Захват шины (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-системах размещена и логика DMA-контроллера 8237 (оригинального для IBM PC). В реализации используется два запроса: первый запрос от устройства к мосту PCI-ISA, второй — от моста к оперативной памяти ПК.

Кроме упомянутых реализаций Sound Blaster, практически никакие устройства PCI не используют понятие «номер входа DMA-контроллера», как и 8237 вообще.

Регистры блока DMA

Описание регистров в принципе понятно, как и назначение бит

Остановлюсь только на тех нюансах, на которые не сразу обращаешь внимание. Полное описание регистров — в спецификации

Особое внимание следует уделить параметрам ReadOnly (RO) и WriteOnly (WO). Там где ниже атрибуты не указаны, доступ разрешен и на запись и на чтение — Read-Write (RW).

Большинство регистров блока DMA существую в двух вариантах — с суффиксами SET и CLR. Запись нулей ни в SET, ни в GET никак не влияют на состояние регистра.

  1. Регистр SET: — RW, запись 1-ниц выставляет биты в реальном регистре.
  2. Регистр CLR: — RO, запись 1-ниц стирает биты в реальном регистре.

Чтобы не отвлекаться на SET и GET, в таблице ниже я укажу только название реального регистра. А обозначением (S/C), помечу что доступ обеспечивается через регистры-маски SET и GET.

Регистр Описание
STATUS Отражает состояние контроллера, RO
CFG Бит Master_enable — включает работу блока DMA. Но весь регистр WO, при чтении возвращается 0.
CTRL_BASE_PTR Задает указатель на массив первичных и вторичных управляющих структур каналов.
ALT_CTRL_BASE_PTR Возвращает указатель на массив альтернативных управляющих структур каналов, RO. Значение высчитывается из CTRL_BASE_PTR и количества каналов в блоке DMA.
WAITONREG_STATUS Состояние сигналов запроса на обработку к каналам DMA, RO
CHNL_SW_REQUEST Запись 1 в бит канала вызывает программный запрос на обработку канала, WO.
CHNL_USE_BURTS (S/C) Бит канала: 0 — обработка запросов sreq и req, 1 — только req.
CHNL_REQ_MASK (S/C) Бит канала: 0 — Канал разрешен, 1 — Работа канала запрещена.
CHNL_ENABLE (S/C) Запись 1 в бит канала запускает работу канала. После окончания цикла, бит аппаратно сбрасывается в 0! (Подозреваю, что этот регистр является dma_done[].)
CHNL_PRI_ALT (S/C) Бит канала: 0 — Канал использует первичную структуру, 1 — Альтернативную. Можно указать вручную. В режимах использующих обе структуры бит переключается аппаратно.
CHNL_PRIORITY (S/C) Бит канала: 0 — обычный приоритет, 1 — повышенный.
ERR_CLR Бит 0: Возвращает наличие ошибки при работе DMA. Запись 1 сбрасывает ошибку. В каком канале была ошибка надо искать по dma_done[]. (Не понял как — спецификация «Индикация ошибок»)

Регистры DMA

Для работы с прерываниями отведено два регистра. Устроены они аналогично, однако первый, , служит для индикации, т.е. его можно только считывать, а второй, для сброса.

  • сокращение от Transfer Error, т.е. отвечает за событие ошибки передачи.
  • сокращение от Half Transfer, т.е. отвечает за событие половинной передачи.
  • сокращение от Transfer Complete, т.е. отвечает за событие окончания передачи.
  • сокращение от Global, т.е. сообщает, что одно из трёх событий в принципе произошло.

Следующая группа регистров () позволяет настроить режим работы канала.

  • — включение () или отключение () режима Память-Память.
  • — установка приоритета канала: низкий (); средний (); высокий (); или очень высокий ().
  • — размер данных в памяти: 8 бит (); 16 бит (); или 32 бит ().
  • — размер данных в периферии: 8 бит (); 16 бит (); или 32 бит ().
  • — разрешает () или запрещает () инкрементировать адрес памяти.
  • — разрешает () или запрещает () инкрементировать адрес периферии.
  • — разрешает () или запрещает () циклический режим работы.
  • — задаёт направление передачи: чтение из периферии; чтение из памяти.
  • — разрешает () или запрещает () прерывание ошибки передачи.
  • — разрешает () или запрещает () прерывание по передачи половины.
  • — разрешает () или запрещает () прерывание по окончанию передачи.
  • — включает () или отключает () канал.

Группа регистров задаёт количество передаваемых данных для каждого канала, которое должна находиться в диапазоне от 0 до 65535.

И последние два регистра и задают начальный адрес (32 бита) периферии и памяти соответственно.

Назад |
Оглавление |
Дальше

1 Два DMA доступны только в high-density МК, а относится к medium-density.

DMA и IDE/ATA, Ultra DMA[править | править код]

Первоначальный контроллер жёсткого диска компьютера IBM PC/AT не поддерживал DMA, и требовал передачи всех данных дискового ввода-вывода инструкциями REP INSW/REP OUTSW через порт 0x1f0.

В начале 1990-х годов диски MFM/RLL вышли из употребления («вымерли»), сменившись дисками IDE, но регистровый интерфейс ПО к контроллеру не изменился.

Низкая производительность такого контроллера стала серьёзной проблемой, особенно на системах PCI. Помимо требования нескольких циклов PCI на передачу каждых двух байт данных, это приводило к загрузке процессора дисковым вводом-выводом.

Для решения проблемы ряд компаний, в том числе 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 NT 4 и требовала на большинстве систем ручного редактирования реестра для задействования.

В ОС Windows 2000 это требование исчезло, но появилось требование обязательного внесения в список и выставления режима DMA в BIOS даже не-загрузочных дисков. Эти настройки становились видимы ядру ОС через технологию ACPI, и ОС не позволяла включить DMA для диска, не внесённого в список дисков BIOS. Для сравнения: ОС Windows NT 4 поддерживала и произвольный размер диска и DMA без внесения диска в список BIOS.

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

DMA и виртуальная память, IOMMU и AGP GART[править]

В операционных системах со страничной виртуальной памятью, таких, как Windows и семейство UNIX, непрерывный регион виртуальных адресов может быть реализован разрывно расположенными физическими страницами.

Исполнение DMA по такому региону представляет собой довольно сложную задачу. Также сложной задачей является исполнение DMA по отгружаемой памяти.

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

Задача исполнения DMA по таковому списку может быть решена одним из следующих способов.

  1. Выделение подряд идущей физической памяти в ядре операционной системы и промежуточное копирование всех данных туда/оттуда (так называемый «буфер отскока» — англ. bounce buffer).

Поддерживается всеми ведущими операционными системами. Для активации поддержки в ОС Windows требуется вызов с параметром , установленном в .

Недостатки:
  • трата времени процессора на копирование;
  • потребление крайне ограниченного ресурса непрерывной физической памяти;
  • занятие места в ограниченной части памяти, к которой есть доступ у DMA (первый гигабайт на x86).
  1. Разбиение операции на подоперации по границам элементов SGL, с прерыванием в конце каждой операции.

Использовалось в старых 8-битовых SCSI-контроллерах, поставляемых со сканерами типа HP ScanJet.

Недостатки:

большое количество прерываний.

  1. Поддержка SGL самим устройством, с требованием копирования SGL, преобразованного в формат, специфичный для устройства, в устройство через многочисленные обращения к регистрам устройства.
Недостатки:
  • крайне высокая сложность устройства;
  • невысокая производительность большого числа записей в регистры.
  1. Поддержка SGL самим устройством, с требованием размещения SGL, преобразованного в формат, специфичный для устройства, в физически непрерывном регионе основной памяти.

Устройство читает SGL тем же механизмом DMA с захватом шины, что и собственно данные, тем самым реализуя функциональность некоего процессора, читающего и исполняющего свою собственную «программу», реализованную как список дескрипторов SGL. Данная архитектура называется «цепной DMA» (англ. chain DMA), реализована в практически всем стандартном оборудовании современного компьютера — Intel IDE (англ. integrated drive electronics) (в примитивном виде), , , , а также в большинстве PCI-адаптеров, Ethernet и SCSI (даже в устаревшем AIC78xx). Хороший пример реализации данной архитектуры в очень сложном и развитом виде дан в спецификации оборудования . По некоторым сведениям, данная архитектура под названием «канальные программы» использовалась ещё в IBM 360, известных в СССР как ЕС ЭВМ.

Недостатки:

высокая сложность устройства, хотя и меньшее количество транзисторов, чем в предыдущем варианте. Например, контроллер USB UHCI (согласно спецификации на сайте Intel) требует около 5000 транзисторов.

  1. Поддержка SGL в межшинном оборудовании, при которой представление физически разрывного буфера для стороны устройства выглядит физически непрерывным.

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

Недостатки:

требование сложной логики уже не в устройстве, а в платформе.

Ошибка DMA c запросами от SSP, зацикливание прерывания

При работе с блоком DMA во всех микроконтроллерах с блоками SSP есть один аппаратный дефект. Баг связан с тем, что при включении МК, со стороны SSP к NVIC стоит активный сигнал запроса прерывания. Поэтому при включении блока DMA начинают непрерывно генерироваться прерывания DMA. Даже если все каналы DMA выключены. Дальнейшее исполнение программы при этом не происходит. Ядро не может выйти из обработчика прерывания — при выходе из обработчика исполнение тут же возвращается обратно в обработчик, поскольку прерывание активно.

При разрешении тактирования SSP сигнал запроса к DMA приходит в состояние, согласованное с регистром SSP, в котором запрос на прерывание по умолчанию выключен. Поэтому включение тактирования SSP помогает избавиться от лишних прерываний от DMA.

ИСПРАВЛЕНИЕ

Оказалось, что это не ошибка! Если внимательней читать спецификацию о работе DMA, то выясняется следующее:

  • Для того чтобы выключить канал DMA, он должен быть разрешен в регистре CHNL_ENABLE=1, но обработка запросов от него должна быть выключена в регистре CHNL_REQ_MASK=1!
  • При этом сам блок DMA должен быть затактирован и включен в регистре CFG.master_enable! Иначе, например, если сразу после входа в main() включить прерывание DMA в NVIC то исполнение сразу свалится в обработчик прерывания DMA_HandleIRQ().

Тогда становится не важно, есть ли активный запрос к DMA от выключенных SSP или ADC, к генерации прерывания это не приведет!

Шины и DMA

Все данные передаются по шинам (англ. bus), которые пересекаются в матрице (англ. bus matrix). В STM32 модуль DMA и ядро Cortex-M3 используют одну и ту же шину, поэтому работа DMA может тормозить работу ядра. С одной стороны, это существенный недостаток, а с другой такой подход позволяет делать микроконтроллеры дешёвыми.

Диаграмма шин данных, документ AN2548, стр. 7.

Когда ядро считывает инструкции из flash-памяти, а DMA работает с периферией, они не мешают друг другу.

Матрица шин реализует алгоритм round-robin для распределения нагрузки. Проще говоря шина циклически перебирает всех потребителей и даёт им доступ по очереди.

Здесь сразу же может возникнуть вопрос, — «А что если несколько каналов DMA захотят работать одновременно?» Ответ довольно прост: они не смогут этого сделать. Каждому «объекту» (периферии) программно задаётся приоритет (очень высокий, высокий, средний и низкий), ориентируясь на который специальная схема-арбитр (англ. arbiter) позволит работать тому или иному каналу. В случае, если программные приоритеты равны у разных каналов, арбитр смотрит на их номера. Чем меньше номер, тем выше приоритет. Если одновременно нужно забрать данные с и считать символ с , то последний будет ожидать освобождения шины первым каналом.

После возникновения события, периферия отправляет сигнал контроллеру ПДП. Контроллер, ориентируясь на приоритетность выбирает самый срочный запрос и отправляет сигнал одобрения (англ. acknowledge), в ответ периферия сбрасывает запрос и контроллер забирает или отсылает данные.

PIO и DMA

В этой статье мы рассмотрим причины по которым операционная система может перевести устройства в более медленный режим работы PIO и как их устранить. Данный вопрос возник у моего друга, когда его устроили на работу системным администратором на предприятие, где ощущалась острая необходимость обновления компьютерного парка, конечно начальство этого делать не собиралось и пришлось выкручиваться самим. В основном компьютеры были не новые, но со своими обязанностями справлялись. Что интересно, два из них работали в режиме PIO и их надо было как-то переводить в режим DMA. 

На первом же системном блоке работающем в режиме PIO, мы увидели, что хард подключен с помощью 40-жильного интерфейсного кабеля, для работы DMA нужен 80-жильный шлейф IDE, заменяем и вопрос решается. На другом компьютере, стоял новый жесткий диск, Western Digital интерфейса подсоединения SATA 250 GB и на нём находилась операционная система Windows XP, вторым Seagate Barracuda 80GB, старого интерфейса IDE и оба работали в режиме PIO. Стоило убрать устаревший винчестер IDE и новый SATA работал в режиме DMA.

В принципе старый хард можно было убрать, но вопрос бы остался нерешённым. Прежде чем переустанавливать драйвера на материнскую плату или саму Windows, удалять первичные и вторичные каналы IDE, можно сказать плясать с бубном, я стал вспоминать что где-то, читал о подобной проблеме и о том, как её решили.
А решили её банально, умные люди. Два жёстких диска, нового образца SATA и старого IDE будут работать вместе, в режиме DMA, если они одного производителя.

У меня дома был хард Western Digital, интерфейса IDE, на 40GB, мы установили его в системный блок вместо прежнего и они оба заработали в режиме DMA, вот так был решён конфликт устройств. Что ещё можно предпринять в случае если Windows XP перевела работу ваших устройств в более медленный режим PIO, в принципе все методы, которые можно применить, описаны в нашей статье Тормозит жесткий диск, кроме одного, это редактирование реестра, его и рассмотрим сейчас.


Вообще метод рисковый, можно не загрузиться, поэтому сделайте лучше всего бэкап системы, например в Acronis.
Нам нужен куст HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdfs\, далее создаём ключ ErrorControl со значением равным 0 и перезагружаемся и удаляем в диспетчере устройств в пункте IDE ATA/ATAPI контроллеры, все Первичные и Вторичные каналы IDE.
Далее следующий куст
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}, тут нам нужны папки0000 –  сам контролер;0001 –  Secondary IDE Chanell;0002 –  Primary IDE Chanell;
Заходим в папки, каждая из них отвечает за нужный нам канал, здесь нам нужны ключи.
MasteDeviceTimingModeAllowed
SlaveDeviceTimingModeAllowed
Присваиваем им значение 0хffffffff.
Далее ещё ключи
MasterDeviceTimingMode
SlaveDeviceTimingMode
Согласно поддерживаемому UDMA-режиму:
UDMA Mode 2 – 0×2010
UDMA Mode 4 – 0×8010
UDMA Mode 5 – 0×10010
UDMA Mode 6 – 0xffff
Перезагрузка.

Буферы для DMA в 1986ВЕ1Т/1986Е3Т

Следует обратить внимание, что в отличие от 1986ВЕ9х, в микроконтроллерах 1986ВЕ1Т и 1986ВЕ3Т не вся память ОЗУ доступна для DMA. Необходимо при размещении массивов в ОЗУ указывать их расположение в памяти, начинающейся с адреса 0х2010_0000

Расположение массива, помеченного каким-либо аттрибутом, указывается в линкере через подключение модифицированного скаттер файла. Скаттер файл создается автоматически при сборке проекта если в опциях стоит галочка Linker — Use Memory Layout from Target Dialog. Файл создается в поддиректории Objects и называется именем проекта с расширением *.sct. (Из-за такого расширения, в частности, не проходят проекты через почтовые службы, даже в архивах.)

Чтобы этот файл не обновлялся при каждой сборке, галочку после создания файла необходимо снять, а в сам файл дописать строку с аттрибутом буферов.

//  Если буфер объявлен так
  uint32_t DestBuf __attribute__((section("EXECUTABLE_MEMORY_SECTION")));

//  То секция RW_IRAM2 в *.sct должна выглядеть так
  RW_IRAM2 0x20100000 0x00004000  {
   *.o (EXECUTABLE_MEMORY_SECTION)
   .ANY (+RW +ZI)
  }

Более наглядные картинки про получение и модификацию скаттер файла можно найти в этой статье .

У меня этот файл мигрирует из проекта в проект со всей папкой brd_src, но можно подключить его и просто скопировав в свой проект. Поскольку раскладка памяти в 1986ВЕ1Т и 1986ВЕ3Т одинакова, то этот файл подойдет и для 1986ВЕ3Т.

Windows 7 — DMA

Запустите диспетчер устройств. ‌ При появлении запроса пароля администратора или подтверждения введите пароль или предоставьте подтверждение.

Дважды щелкните узел IDE ATA/ATAPI контроллеры .

В узле IDE ATA/ATAPI контроллеры щелкните правой кнопкой мыши элемент, у которого слово канал (Channel) является частью названия, и затем в контекстном меню выберите пункт Свойства .

Перейдите на вкладку Дополнительные параметры . В разделе Свойства устройства установите или снимите флажок Задействовать DMA и нажмите кнопку ОК .

но не нахожу » элемент, у которого слово канал (Channel) является частью названия»

Описание работы

Если требуется заполнить ячейки памяти, расположенные по подряд идущим адресам, используется «пакетный» (англ. burst) режим работы шины:

  • размер данных записывается в регистр контроллера DMA;
  • первый цикл используется для передачи адреса первой ячейки;
  • последующие циклы используются для пересылки данных указанного размера.

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

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

Контроллер DMA может получать доступ к системной шине независимо от ЦП и имеет несколько регистров. Регистры контроллера DMA доступны ЦП для чтения и записи и используются для задания:

  • номера порта, который должен быть использован для передачи данных;
  • вида операции (чтение или запись);
  • единицы переноса (побайтно или пословно);
  • размера данных, которые следует перенести, в байтах.

Рассмотрим процесс чтения данных с устройства. ЦП записывает значения в регистры контроллера DMA, отправляет устройству (например, диску) команду на чтение данных. Устройство читает данные (например, с диска) и записывает в свою внутренную память (буфер). Контроллер DMA устанавливает на адресную шину адрес памяти ПК, отправляет устройству запрос на чтение данных из внутренней памяти (буфера) устройства. Устройство получает запрос и при этом даже не знает, пришёл ли запрос от ЦП или от контроллера DMA. Устройство пересылает очередное слово из своей внутренней памяти (буфера) в оперативную память ПК по адресу, находящемуся на адресной шине. Затем устройство посылает контроллеру DMA сигнал, сообщающий об окончании записи. Контроллер DMA увеличивает адрес памяти ПК и выставляет его на адресную шину, уменьшает значение своего счётчика байтов, снова отправляет запрос на чтение данных из внутренней памяти (буфера) устройства. Цикл повторяется, пока значение счётчика не станет равно нулю. После окончания цикла устройство инициирует прерывание процессора, сообщающее о завершении переноса данных.

Контроллер DMA, способный выполнять несколько операций параллельно, называется многоканальным.

Как включить режим Ultra DMA, выключить PIO. Hardware Interrupts грузит систему

Компьютер сильно тормозит, работать вообще не возможно. При этом индикатор доступа к HDD постоянно мигает, диспетчер задач показывает загрузку ЦП, а движения никакого? Если включить сторонний диспетчер, например Process Explorer то видно, что процесс Hardware Interrupts грузит систему на 50% и больше. Скорее всего ваш жесткий диск перешел в режим PIO. Это значит, что при чтении с диска после 6-и ошибок истечения времени ожидания Windows переводит скорость подключения контроллера IDE/ATAPI (HDD) с быстрого режима UDMA на медленный PIO и все начинает тормозить. Как обратно включить режим Ultra DMA? Как включить режим Ultra DMA

1. Чтобы узнать, в каком режиме винт, заходим в диспетчер устройств — IDE/ATAPI контроллеры — первичный(вторичный) канал и в дополнительных параметрах смотрим режим передачи — если PIO, то это он все тормозит и процесс Hardware Interrupts загружает процессор (у меня было 40-50%). Пробуем поставить режим «DMA если доступно» (причем это проделать во всех первичных и вторичных каналах) и перезагрузить систему. Немного поработать и проверить опять режим IDE/ATAPI контроллера. Если опять стоит режим PIO, то проверить шлейф винчестера и питание. Если не помогло, то решение простое — поменять винчестер или вариант 2:

2. Отключить контроль ошибок.

Заходим в реестр(меню Пуск-выполнить-regedit), далее в раздел HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass.

В подразделах 0001 и 0002 делаем так:

1. В меню правка Создать, параметр DWORD. 2. Введите строку ResetErrorCountersOnSuccess и нажмите клавишу ВВОД. 3. 2 раза щелкнуть по созданому параметру и ввести значение 1. Нажать Ок.

В этих же разделах проверить

Далее, проверьте, чтобы в этих же разделах параметры MasterDeviceTimingModeAllowed и SlaveDeviceTimingModeAllowed у вас имели значеие ffffffff (в шестнадцатиричной системе). И соответствующему параметру MasterDeviceTimingMode или SlaveDeviceTimingMode присвойте одно из значений: 0x10010 — соответствует режиму UDMA Mode 5 (ATA100). 0x8010 — UDMA Mode 4 (ATA66). 0x2010 — UDMA Mode 2 (ATA33). 0x0410 — Multi-Word DMA Mode 2

Перезагрузите систему. Вот и все! По идее, у вас должен всегда стоять режим Ultra DMA.

Но, если вы точно не знаете, в каком режиме должен работать винт и если вы всё сделали правильно, но после перезагрузки ничего не поменялось (маловероятно, но вдруг…), то В этом случае, сначала удалите из списка устройств IDE-контроллер, и перезагрузитесь. Windows заново найдёт и переустановит драйвер IDE-контроллера, при этом все устройства встанут в нужные DMA-режимы (MasterDeviceTimingMode и SlaveDeviceTimingMode сами примут нужное значение).

После этого лезте в реестр и проделайте все шаги, кроме изменения параметров MasterDeviceTimingMode и SlaveDeviceTimingMode, и перезагрузитесь ещё раз. Теперь все точно должно заработать.

Но (еще одно но ), я вам рекомендую важную информацию копировать на другие носители, так как с HDD у вас проблемы.

Теперь о процессе Hardware Interrupts — процесс прерываний самого железа. Когда плохой винчестер, то он постоянно сообщает об ошибках чтения, вот и получаются эти прерывания. Процессор начинает заниматься исправлением этих ошибок, а не вашей задачей и начинаются тормоза.

Такое возможно и не только через винчестер. Можно в БИОСе попробовать поменять номера прерываний, но это отдельная история.

Описание

DMADirect Memory Access, механизм, использующийся для непосредственного обмена данными между устройством и оперативной памятью компьютера, минуя центральный процессор.

Контроллер DMA — Используется для уменьшения нагрузки на центральный процессор в случае длительного обмена большим потоком данных с устройствами. К таким устройствам могут быть причислены:

  • Различные мультимедиа-устройства.

ISA DMA — старый контроллер DMA, который описан ниже.

В современные ПК устанавливаются два контроллера DMA:

  • 8-битный (каналы 0, 1, 2, 3).
  • 16-битный (каналы 4, 5, 6, 7).

В данном случае разрядность контроллера указывает режим передачи данных (8-битный, 16-битный).

Среди этих восьми каналов наиболее часто используются:

  • Канал 3 — для работы с жёсткими дисками.
  • Канал 4 — для каскадирования двух контроллеров DMA (к 4 каналу контроллера DMA-2 подключается контроллер DMA-1).

Контроллер DMA-1 позволяет выполнять чтение или запись блока данных с физического адреса, записываемого как 20-битное число (в пределах первого мегабайта оперативной памяти), в то время как контроллер DMA-2 позволяет работать с 24-битными адресами (в пределах первых 16 мегабайт оперативной памяти).

По крайней мере «Ultra»?

Прежде, чем пойдем дальше, давайте проясним заблуждение. Эти 33 и 66 MB/сек
максимальная скорость передачи (burst transfer rate), а это встречается
не очень часто. Вот кусок из UDMA.txt:

Быстрый (burst) (немедленный) режим передачи предполагает от 16.6МБ/сек
(PIO режим 4) до 16.6МБ/сек (DMA режим 2) и до 33МБ/сек (UDMA).
Kim-Hoe Pang в своем патче ядра 2.1.55 логически проверил скорость передачи
в максимальном режиме UDMA: 60 нс/слово, что означает 33МБ/сек.

Замечу, что скоростной (burst) режим передачи влияет только на данные,
передаваемые из кэша EIDE винчестера (476Кб на IBM 6.4Гб),
а это IMHO не особенно актуально для большинства пользователей Linux.

Ядро Linux использует для кэширования доступа к винчестеру столько
оперативной памяти, насколько это возможно, и если данные не находятся в
кэше ядра, то мало шансов, что они будут в меньшем по размеру кэше
винчестера.

Намного большее значение имеет устойчивая скорость передачи (sustained
transfer rate)
— скорость, на которой данные передаются с винчестера в
память. Проще всего использовать hdparm, чтобы измерить устойчивую скорость
передачи, например «hdparm -t /dev/hda«, для измерения скорости первого IDE
диска.

Вот некоторые данные, собранные после большого количества испытаний, с
использованием утилиты hdparm (Mark Lord):

PIO в режиме 4 под Linux дает скорость передачи:   +/- 5.2MB/s

DMA в режиме 2 под Linux дает скорость передачи:   +/- 7.2MB/s

UDMA в режиме 2 под Linux дает скорость передачи:  +/- 9.8MB/s

Как вы можете видеть, UDMA все еще в два раза быстрей обычного EIDE, и все еще значительно быстрей Bus Master DMA. Большинство современных UDMA-дисков дают от 10 до 15 МБ/сек с использованием UDMA в режиме 2 (33 MB/s) или 4 (66 МБ/сек).

Арбитраж каналов DMA

На картинке ниже я попытался представить все выше сказанное про арбитраж и каналы DMA.

По картинке видно следующее:

  • Всего есть 32 канала DMA
  • Приоритет каналов убывает от 0-го канала к 31-му.
  • Каналы передают данные блоками по 2R_power, между которыми осуществляется арбитраж — смена канала.
  • DMA передача — это передача одного слова данных заданной размерности.
  • Цикл DMA — это общее количество данных, которое необходимо передать. Задается параметром N_minus_1.
  • Для передачи следующей порции данных необходим запрос на обслуживание канала DMA — DMA Request. По этой причине более приоритетный канал С-1 отдает управление каналу С — ведь запрос к С-1 еще не установлен к моменту арбитража. Поэтому исполнение переходит к каналу С, и только на следующем арбитраже канал С-1 передаст оставшееся слово.

  • Под DMA Request подразумевается запрос по сигналам sreq, req или программный запрос.
  • Каждый канал управляется своей структурой, состоящей из 4-х 32-битных слов.
    • Последнее слово резервное и не используется.
    • Два слова в структуре задают адрес источника и приемника данных
    • Все настройки обмена задаются в слове Control.
      • Общее количество передач задается полем N_minus_1 на при запуске. Далее это значение используется для вычисления текущего адреса передаваемых данных и уменьшается контроллером DMA при передаче каждого слова.
      • Младшие 3 бита Control задают режим работы канала. При окончании цикла DMA, это поле сбрасывается контроллером в 0, что означает режим STOP — канал работу закончил.

По поводу программных каналов DMA стоит отметить, что если не выставить режим «Авто запрос», то необходимо в цикле программно вызывать DMA Request, чтобы канал участвовал в арбитраже и имел возможность передать следующую порцию данных. Ведь в данном случае нет аппаратных сигналов req и sreq, которые бы выставляли DMA Request.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации