ФЭНДОМ


ОписаниеПравить

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


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

  • Жёсткие диски (IDE, ATA, SCSI).
  • Приводы для гибких магнитных накопителей (FDD).
  • Оптические приводы (CD, DVD).
  • Звуковые карты (DSP, MIDI).
  • Различные мультимедиа-устройства.

PCI DMA - любое PCI устройство может обращаться к памяти компьютера, минуя ЦП. Программирование зависит от конкретного железа, подробнее PCI Bus Master.

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

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

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

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

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

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

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

ПортыПравить

Микросхема контроллера DMA (i8237A) содержит четыре независимых друг от друга канала, каждый из которых имеет свой набор регистров:

  • CAR (Current Address Register) - регистр текущего адреса ячейки памяти, используемой в данный момент для выполнения операции обмена данными.
  • CWR (Current Word Register) - регистр счётчика слов, подлежащих передаче минус один.
  • PAR (Page Address Register) - регистр адреса страницы, служит для задания старших разрядов адресов (4 бита для DMA-1 и 8 бит для DMA-2).
  • BAR (Base Address Register) - регистр базового адреса буфера (смещение), с которым осуществляется обмен данными. Служит для начальной загрузки значения в регистр CAR.
  • BWCR (Base Word Count Register) - регистр базового числа циклов DMA (общее число передаваемых слов минус единица), служит для начальной загрузки значения в регистр CWR.

Фактически, регистр CAR имеет тот же адрес, что и BAR, а CWR - тот же, что BWCR. Отличие cостоит в том, что доступ к CAR и CWR осуществляется только при чтении данных из портов, а к BAR и BWCR - только при записи данных в порты.

Весь список портов регистров DMA для каналов можно представить следующей таблицей:

Номер канала BAR(w)/CAR(r) BWCR(w)/CWR(r) PAR(rw)
00x000x010x87
10x020x030x83
20x040x050x81
30x060x070x82
40xc00xc2n/a
50xc40xc60x8a
60xс80xca0x89
70xcc0xce0x8b

Помимо этого, у каждого контроллера DMA есть свой набор регистров только для записи:

DMA-1 DMA-2 Описание
0x080xd0управляющий регистр контроллера DMA
0x090xd2регистр программного запроса контроллера DMA
0x0a0xd4регистр маскирования канала
0x0b0xd6регистр установки режима работы канала
0x0c0xd8сброс триггера байтов
0x0d0xdaсброс контроллера
0x0e0xdcсброс регистра маски контроллера
0x0f0xdeрегистр для одновременной записи масок всех каналов контроллера

Управляющий регистр CR (Command Register) задаёт параметры работы контроллера DMA, общие для всех каналов микросхемы. Регистр представляет собой следующую структуру:

  • бит 7 - уровень сигнала подтверждения DACK (1 - высокий, 0 - низкий).
  • бит 6 - уровень сигнала подтверждения DREQ (1 - высокий, 0 - низкий).
  • бит 5 - цикл записи (1 - расширенный, 0 - задержанный).
  • бит 4 - приоритеты (1 - циклически меняются, 0 - фиксированы).
  • бит 3 - сжатие цикла по времени.
  • бит 2 - управление работой контроллера (1 - запрещена, 0 - разрешена).
  • бит 1 - разрешение захвата канала 0 для режима память/память.
  • бит 0 - режим работы (0 - обычный, 1 - память/память).

Регистр программного запроса RR (Request Register) имеет вид:

  • биты 7-3 - не используются.
  • бит 2 - запрос на DMA (0 - сбросить, 1 - установить).
  • биты 1-0 - номер канала.

Регистр маскирования канала CMR (Channel Mask Register) позволяет временно блокировать сигнал запроса на обслуживание (DREQ) для определённого канала. Содержимое регистра представляется следующим образом:

  • биты 7-3 - не используются (должны быть равны нулю).
  • бит 2 - запрос на DMA (0 - сбросить, 1 - установить).
  • биты 1-0 - номер канала.

Регистр установки режима работы MR (Mode Register) позволяет задать режим работы канала:

  • биты 7-6 - режим обслуживания:
    • 00 - передача по требованию.
    • 01 - одиночная передача.
    • 10 - блочная передача.
    • 11 - каскадирование.
  • бит 5 - способ приращения адреса (0 - увеличение, 1 - уменьшение).
  • бит 4 - разрешение автоинициализации.
  • биты 3-2 - тип цикла DMA:
    • 00 - тарификация.
    • 01 - запись.
    • 10 - чтение.
    • 11 - запрещённая комбинация.
  • биты 1-0 - номер канала.

Регистр сброса триггера байтов предназначен для сброса переключателя младший/старший разряд для чтения или записи 16-битных значений из/в 8-битные порты 0x00-0x08. Очередной байт, переданный в эти порты, будет счиаться младшим, а следующий за ним - старшим.

Регистр сброса контроллера предназначен для сброса контроллера DMA, который осуществляется при записи любого значения в соответствующий ему порт.

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

Регистр одновременной записи всех масок каналов WAMR (Writa All Mask Register) предназначен для одновременного изменения масок всех каналов контроллера. Регистр имеет вид:

  • биты 7-4 - зарезервированы (0).
  • бит 3 - маскирование канала 3.
  • бит 2 - маскирование канала 2.
  • бит 1 - маскирование канала 1.
  • бит 0 - маскирование канала 0.

Регистр состояния SR (Status Register) имеет те же номера портов, что и регистр CR, но доступен только для чтения. Формат регистра следующий:

  • бит 7 - обслуживание канала 3 разрешено.
  • бит 6 - обслуживание канала 2 разрешено.
  • бит 5 - обслуживание канала 1 разрешено.
  • бит 4 - обслуживание канала 0 разрешено.
  • бит 3 - конечный отсчёт по каналу 3 достигнут.
  • бит 2 - конечный отсчёт по каналу 2 достигнут.
  • бит 1 - конечный отсчёт по каналу 1 достигнут.
  • бит 0 - конечный отсчёт по каналу 0 достигнут.

ФункцииПравить

Пример маскирования канала DMA:

int DMAMasks; // В DMAMasks хранится информация о маскировании всех 8 каналов DMA
 
void SetDMAMask(int channel)
{
    DMAMasks |= (1<<channel); 
    if (channel>=4)
        outportb(0xde, DMAMasks>>4); // используется WAMR DMA-2
    else
        outportb(0x0f, DMAMasks&0x0f); // используется WAMR DMA-1
}

Размаскирование канала:

void ClearDMAMask(int channel)
{
    DMAMasks &= (~(1<<channel));
    if (channel>=4)
        outportb(0xde, DMAMasks>>4);
    else
        outportb(0x0f, DMAMasks&0x0f);
}

Сброс триггера байтов:

void ClearDMAByteTrigger(int channel)
{
    if (channel<4)
        outportb(0x0c, 0xaa); // всё равно какое значение писать
    else
        outportb(0xd8, 0xaa); // всё равно какое значение писать
}

Установка режима работы DMA:

void SetDMAWorkMode(int channel, int mode)
{
    int chan=channel&0x07; // chan - номер канала, mode - режим
 
    if (chan<4)
        outportb(0x0b, ((mode&0xfc)|(chan&0x3)));
    else
        outportb(0xd6, ((mode&0xfc)|(Chan&0x3)));
}

Пример записи адреса буфера для канала 2 контроллера DMA-1:

void SetDMABufferAddress_ch2(int address)
{
    // триггер байтов должен быть сброшен
    outportb(0x04, address);
    outportb(0x04, address>>8);
    outportb(0x81, address>>16);
}

Пример установки счётчика слов для канала 2 контроллера DMA-1:

void SetDMACycles_ch2(int cycles)
{
    // триггер байтов должен быть сброшен
    int counter=cycles-1;
    outportb(0x05, counter);
    outportb(0x05, counter>>8);
}

Пример инициализации канала DMA контроллера FDC для чтения:

    // подготовка канала 2 к приёму данных от FDC
    SetDMAMask(2); // маскировать канал на время операций
    ClearDMAByteTrigger(2); // сбросить триггер байтов для канала 2
    SetDMAWorkMode(2, 0x44); // установить режим работы - запись в буфер
    SetDMABufferAddress_ch2(0x20000); // буфер находится по физическому адресу 0x20000
    SetDMACycles_ch2(512); // 512 = размер сектора диска
    ClearDMAMask(2); // размаскировать канал 2
    // подача команды контроллеру на чтение сектора

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

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