Главная » Ассемблер, Железо » Особенности реализации режима DMA на системных платах с шиной PCI

0

Режим прямого доступа к памяти (Direct Memory Access, сокращенно DMA) обеспечивает возможность обмена данными между периферийными устройствами и оперативной памятью компьютера без непосредственного участия процессора. В первую очередь он необходим в том случае, если используемые периферийные устройства имеют небольшие встроенные буферы памяти (такие устройства нуждаются в немедленном обслуживании и не могут ждать, пока процессор освободится от выполнения задач с более высоким приоритетом). Кроме того, в некоторых случаях режим DMA обеспечивает более высокую скорость передачи данных, чем режим РЮ.

К сожалению, у современных персональных компьютеров прямой доступ к памяти реализован довольно заумным образом. Проблема DMA имеет исторические корни: при разработке архитектуры компьютеров с дешевыми 8-разрядными процессорами режим прямого доступа пытались вообще исключить из системы с целью снижения ее себестоимости. При переходе на микропроцессоры с 16-разряд- ной, а затем 32-разрядной архитектурой возникла потребность в режиме DMA, и инженерам пришлось использовать разнообразные ухищрения, чтобы не потерять совместимость со старым программным обеспечением.

Работа с жестким диском на персональных компьютерах, совместимых с IBM AT, изначально осуществлялась через процессор, то есть только в режиме РЮ, так как канал DMA шины ISA вообще функционирует с недостаточно высокой скоростью, а для работы с диском был зарезервирован 8-разрядный канал. После того, как контроллер дисков был интегрирован в системную плату и подсоединен к шине PCI, появилась возможность использования канала DMA этой шины при работе с дисками. PCI DMA обеспечивает некоторый выигрыш по скорости по сравнению с РЮ не только за счет собственно прямого доступа к памяти, но и за счет большей разрядности передаваемого слова (в режиме РЮ — 16 разрядов, в режиме PCI DMA – 32 разряда).

Контроллер PCI IDE может работать в одном из двух режимов — в режиме совместимости или в режиме чистой PCI. В режиме совместимости размещение регистров и распределение линий прерывания полностью совпадает с тем, которое принято для шины ISA (см. табл. 6.27 и 6.28).

В режиме PCI имеется возможность произвольным образом задавать адреса групп регистров каналов IDE и номера выделенных им прерываний. При этом местоположение регистров хранится в конфигурационном пространстве PCI в 32-разрядных регистрах со следующими смещениями:

•        смещение 10h — адрес блока регистров команды первичного канала;

•       смещение 14h — адрес блока регистров контроля первичного канала;

•        смещение 18h — адрес блока регистров команды вторичного канала;

•        смещение ICh — адрес блока регистров контроля вторичного канала.

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

Работать с контроллером PCI IDE можно при помощи функций PCI BIOS, описанных в главе 3 «Особенности работы с устройствами, подключенными к шине РС1». Чтобы получить доступ к конфигурационному пространству контроллера PCI IDE, нужно определить его координаты на шине PCI, а сделать это можно либо по коду изделия и коду изготовителя, либо по коду класса контроллера. Первый способ пригоден только в том случае, если программное обеспечение ориентировано на какой-либо чипсет определенного изготовителя. Второй способ более универсален, но требует перебора нескольких возможных вариантов значения младшего байта (байта интерфейса) кода класса (оба старших байта кода содержат значения Olh). Разряды байта интерфейса кода класса (см. рис. 3.4 в главе 3 «Особенности работы с устройствами, подключенными к шине РС1») контроллера PCI IDE имеют следующее назначение:

•        бит 0 — режим работы первичного канала (0 — режим совместимости, 1 — режим чистой PCI). Содержимое данного разряда имеет значение только в том случае, если значение бита 1 равно нулю;

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

•       бит 2 — режим работы вторичного канала (0 — режим совместимости, 1 — режим чистой PCI). Содержимое данного разряда имеет значение только в том случае, если значение бита 3 равно нулю;

•        бит 3 — признак поддержки вторичным каналом обоих режимов работы (0 — поддерживается только режим, определяемый битом 2, 1 — поддерживаются оба режима);

•        биты 4-6 — не используются (должны быть установлены в 0);

•        бит 7 — признак поддержки режима Bus Master (0 — режим не поддерживается, 1 — режим поддерживается).

Для того чтобы можно было работать с дисками в режиме DMA, контроллер PCI должен иметь возможность захватывать шину, то есть должен поддерживать режим Bus Master IDE. Так как контроллеры современных материнских плат поддерживают по обоим каналам одинаковые режимы, значение байта интерфейса может быть равно 80h, 85h или 8Ah. Соответственно поиск контроллера нужно проводить по трем возможным кодам класса: 010180h, 010185h и 01018Ah.

С регистрами конфигурационного пространства PCI программист обычно не работает — программирование контроллера PCI IDE и моста PCI-to-IS А возлагается на операционную систему. На современных системных платах настройку временных параметров циклов РЮ и DMA для установленных в системе дисков осуществляет при включении компьютера процедура начальной загрузки BIOS.

Однако, кроме регистров шины PCI, у контроллера имеется также набор обычных регистров ввода-вывода — через них осуществляется настройка контроллера PCI DMA на область оперативной памяти, с которой диск должен осуществлять обмен данными. Описание блока регистров ввода-вывода PCI IDE приведено в табл. 6.46 (все регистры доступны как для записи, так и для считывания информации). Адрес блока регистров хранится в регистре базового адреса, размещенном в конфи1урационном пространстве PCI IDE со смещением 20h (разряды 4-15 этого регистра хранят разряды 4-15 базового адреса блока, а разряды 0-3 базового адреса всегда равны 0; базовый адрес может принимать значения от 300h до FFFOh). Чтобы определить базовый адрес блока регистров, нужно прочитать значение (16-разрядное слово) из конфигурационного регистра со смещением 20h и выделить адрес командой AND со значением FFFOh.

Таблица 6.46. Блок регистров ввода-вывода PCI IDE

Смещение

Размер

Мнемони

Назначение

от базового

 

ческое обо

 

адреса

 

значение

 

OOh

BYTE

BMICP

Командный регистр первичного

 

 

 

канала IDE

01h

BYTE

Зарезервирован

02h

BYTE

BMISP

Регистр состояния первичного

 

 

 

канала IDE

03 h’

BYTE

Зарезервирован

04h

DWORD

BMIDTPP

Указатель на таблицу дескрип

 

 

 

торов первичного канала IDE

OBh

BYTE

BMICS

Командный регистр вторичного

 

 

 

канала IDE

09h

BYTE

Зарезервирован

OAh

BYTE

BMISS

Регистр состояния вторичного

 

 

 

канала IDE

OBh

BYTE

Зарезервирован

OCh

DWORD

BMIDTPS

Указатель на таблицу дескрип

 

 

 

торов вторичного канала IDE

Формат командного регистра канала показан на рис. 6.20. Разряды регистра имеют следующее назначение:

•         бит 0 — управление работой Bus Master (пуск/останов: 1 — начать передачу в режиме DMA, 0 — остановить передачу);

•        биты 1 и 2 — зарезервированы (должны быть установлены в 0);

•         бит 3 — направление передачи данных (0 — чтение данных, 1 — запись данных);

•        биты 4-7 — зарезервированы (должны быть установлены в 0).

Рис. 6.20. Формат командного регистра канала PCI IDE

Формат регистра состояния канала приведен на рис. 6.21. Назначение разрядов регистра:

•        бит 0 — признак активности Bus Master IDE (этот разряд принимает значение 1, если установлен бит 0 командного регистра);

•        бит 1 — признак ошибки передачи данных (устанавливается в 1 при возникновении ошибки; сбрасывается программно путем записи в этот разряд единицы);

•        бит 2 — признак прерывания (устанавливается в 1 при поступлении прерывания от устройства IDE; сбрасывается программно путем записи в этот разряд единицы);

•        биты 3 и 4 — зарезервированы (должны быть установлены в 0);

•        бит 5 — индикатор способности диска 0 работать в режиме DMA (данный разряд программно устанавливается в 1 драйвером диска или BIOS при выполнении самотестирования в процессе начальной загрузки системы, если Master-диск поддерживает режим DMA и параметры канала оптимизированы на максимальную скорость передачи);

•        бит 6 — индикатор способности диска 1 работать в режиме DMA (данный разряд программно устанавливается в 1 драйвером диска или BIOS при выполнении самотестирования в процессе начальной загрузки системы, если Slave-диск поддерживает режим DMA и параметры канала оптимизированы на максимальную скорость передачи);

•        бит 7 — признак симплексного режима (0 — первичный и вторичный каналы независимы друг от друга и могут работать одновременно; 1 — в каждый момент времени допускается работа только одного из каналов).

Регистр указателя на таблицу дескрипторов канала должен содержать линейный (абсолютный) 32-разрядный адрес таблицы. Значение адреса выравнивается на двойное слово, то есть два младших разряда регистра обязательно содержат нули.

Рис. 6.21. формат регистра состояния канала PCI IDE

Чтобы контроллер мог осуществлять передачу данных, необходимо указать ему область оперативной памяти, с которой должна выполняться эта операция. Область памяти задается при помощи таблицы дескрипторов физических областей памяти PRDT (Physical Region Descriptor Table). Таблица состоит из одного или нескольких 8-байтных дескрипторов PRD (Physical Region Descriptor), описывающих используемые при передаче данных участки памяти. Адрес таблицы должен быть выровнен на двойное слово (младшие два бита адреса всегда нулевые); размер таблицы не должен превышать, 64 Кбайт, то есть таблица может содержать до 8192 элементов. Формат дескриптора PRD приведен в табл. 6.47. Физический адрес участка памяти выравнивается на слово, то есть должен быть четным 32-разрядным числом. Счетчик байт должен быть четным 16-разрядным числом. В слове признака конца таблицы используется только старший разряд (остальные разряды зарезервированы и должны быть установлены в 0), который устанавливается в 1 у последнего элемента таблицы, а у остальных элементов равен 0. Суммарный размер всех описанных в таблице PRDT областей не должен быть меньше объема данных, передача которых задана командой, посланной диску. Более детально формат дескриптора изображен на рис. 6.22.

Назначение

Таблица 6.47. Формат дескриптора PRD (элемента таблицы PRDT)

Смещение Размер

OOhDWORD физический адрес участка памяти

04hWORDРазмер участка памяти (счетчик байтов)

06hWORDПризнак конца таблицы

Рис. 6.22. Формат дескриптора PRD

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

Рис. 6.23. Адресация памяти при помощи таблицы PRDT

В поле счетчика байт может находиться любое четное число от О до FFFEh, причем 0 соответствует значению lOOOOh, то есть можно задавать размер участка памяти от 2 байт до 64 Кбайт. На практике значение счетчика байтов выбирается равным размеру 16-разрядного сегмента (64 Кбайт), размеру страницы свопинга (4 Кбайт) или размеру одной из дисковых структур (сектора или кластера жесткого диска). Размер всех используемых участков, как правило, одинаковый.

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

1.    Подготовить таблицу PRD в оперативной памяти.

2.     Загрузить адрес таблицы PRD в регистр указателя на таблицу дескрипторов соответствующего канала (канала, к которому подключен диск).

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

г

4.     Стереть бит прерывания и бит ошибки в регистре состояния используемого канала.

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

6.    Включить режим Bus Master путем установки в 1 бита управления режимом работы в командном регистре соответствующего канала.

7.     Ожидать завершения передачи данных между диском и памятью (после завершения передачи диск выдает сигнал прерывания, что приводит к установке в 1 бита признака прерывания в регистре состояния).

8.     Отключить режим Bus Master, сбросив в 0 бит управления режимом в командном регистре.

9.    Проверить значения в регистрах состояния контроллера и диска, чтобы удостовериться в успешном завершении операции.

В листинге 6.12 приведен пример программы IDE_DMA_Test, осуществляющей считывание в режиме DMA загрузочного сектора Master- Диска канала 1 (программа рассчитана на стандартный способ подключения жесткого диска к персональному компьютеру). Кроме процедур ввода-вывода общего назначения, описанных в данной главе и главе 1 «Работа с клавиатурой», программа использует также следующие подпрограммы:

• подпрограмма SearchBusMasterlDEContr осуществляет поиск контроллера PCI IDE по коду класса, а затем определяет адрес блока регистров ввода-вывода PCI DMA;

•         подпрограмма HDD_Presence_Test проверяет, подключен ли диск О к каналу 1;

•         подпрограмма ReadBootSector подготавливает канал к работе в режиме DMA, посылает диску команду считывания сектора в режиме DMA, а затем отображает сектор на экран в ASCII-коде;

•         подпрограмма Fatal Error осуществляет вывод на экран сообщения об ошибке, ожидает нажатия любой клавиши, а затем выполняет аварийное завершение работы программы.

Листинг 6.12. Считывание загрузочного сектора Master-дискэ канала 1 в режиме DMA

IDEAL

Р386 LOCALS

MODEL MEDIUM 1

; Подключить файл мнемонических обозначений : кодов управляющих клавиш и цветовых кодов

Include "1istl_03.inc"

; Подключить файл макросов

Include "1istl_04.inc"

DATASEG

; Текстовые сообщения TxtO

DB LIGHTCYAN.О,17

DB "ТЕСТИРОВАНИЕ РЕЖИМА DMA MASTER-ДИСКА КАНАЛА 1",0

DB YELLOW.5.8,"Содержимое загрузочного сектора "

DB "Master-дискэ канала 1:",0 АпуК

DB YELLOW.24.29,"Нажмите пюбую клавишу",О

; Сообщения об отсутствии компонентов системы,

; необходимых для запуска примера NoPCI

DB LIGHTRED.12,18

DB "Система не поддерживает интерфейс PCI BIOS",О NoIDEC

DB LIGHTRED,12.26

DB "Контроллер PCI IDE не найден",О BadReg

DB LIGHTRED.12.28,"Неверный номер регистра",О NoHDD

DB 12,22,"Master-диск на канале 1 не обнаружен",О NoLBA

DB 12.25,"Диск не поддерживает режим LBA",0 : Сообщения об ошибках при выполнении считывания DErrl

DB 12.8,"Тайм-аут: превышена допустимая "

DB "длительность выполнения операции",О DErr2

DB 12,25,"Неверный код режима адресации",О DErr3

DB 12,27,"Неправильный номер канала".О DErr4

DB 12,27,"Неправильный номер диска",О DErr5

DB 12,26,"Неправильный номер головки".О DErr6

DB 12,17,"Ошибка при выполнении "

DB "команды жестким диском.",О

; Адрес блока регистров контроллера PCI IDE

IDEContrRegsBaseAddr DW ?

ENDS

; Буфер для работы с диском в режиме DMA SEGMENT DMAJ3UF para public ‘DATA’

DB 8000h DUP(?)

ENDS

; Буфер для таблицы PRD SEGMENT PRD_Table para public ‘DATA"

DB 1024 DUP(?)

ENDS

SEGMENT sseg para stack ‘STACK’

DB 400h DUP(?)

ENDS

CODESEG

;*****************************

;* Основной модуль программы * ;*****************************

PROC IDE_DMA_Test

mov AX.DGROUP

mov DS.AX

mov [CS:MainDataSeg],AX

; Установить текстовый режим и очистить экран

mov АХ.З int 10h

; Скрыть курсор • убрать за нижнюю границу экрана

mov [ScreenString],25

mov [ScreenColumn],0 call SetCursorPosition : Вывести заголовок на экран MShowColorText 2,TxtO : Задать номер канала и номер диска

mov [Channel Number],1

mov [HDDNumber],0 : Проверить наличие и работоспособность диска

call HDD_Presence_Test : Найти контроллер PCI IDE

call SearchBusMasterlDEContr : Создаем таблицу PRD, состоящую из одной записи

mov АХ, PRDTabl е

mov ES.AX

: Вычислить и записать адрес области данных

xor ЕАХ.ЕАХ

mov AX,DMA_BUF

shl ЕАХ,4

mov [ES:0].EAX

Листинг 6.12 (продолжение)

 Записать количество передаваемых байтов данных

mov [word ptr ES:4],512 : Установить признак последней строки таблицы

mov [word ptr ES:6].8000h

; Загрузить физический адрес таблицы PRD в

; соответствующий регистр контроллера PCI IDE

; Вычислить абсолютный адрес PRDT (умножить

: номер сегмента PRDTable на 16)

хог ЕАХ.ЕАХ

mov АХ. PRDTable

shl ЕАХ.4

; Вычислить адрес регистра контроллера

mov DX,[IDEContrRegsBaseAddr]

add DX.04h

: Записать адрес PRD в регистр out DX.EAX

; Прочитать загрузочный сектор диска в режиме DMA call ReadBootSector

; Переустановить текстовый режин и очистить экран

mov АХ,3 int 10h

; Выход в DOS

mov AH,4Ch int 21h ENDP IDE DMA Test

• A A * A A ??? Аг А А A A" A A? it Аг Аг А А Аг А А А А A? A A ^A А A? A A ^A A ???? A? A A A A W A? A A W A A

;* НАЙТИ КОНТРОЛЛЕР PCI IDE И ОТОБРАЗИТЬ НА ЭКРАН * ;* СОДЕРЖИМОЕ РЕГИСТРОВ КОНФИГУРАЦИОННОГО ПРОСТРАНСТВА *

PROC SearchBusMasterlDEContr near pushad

; Проверить наличие PCI BIOS

mov AX.OBlOlh int lAh

jc №PCIBIOSNotFound cmp EDX,20494350h jne

@@PCIBI OSNotFound

: Найти контроллер Bus Master IDE no коду класса

movAX,0B103h

movECX,010180h ;первый вариант кода

movSI,О

intlAh

jne

@@ReadPCIRegisters -.устройство найдено

mov AX,0B103h

movECX,010185h ;второй вариант кода

movSI.О

intlAh

jne@@ReadPCIRegisters устройство найдено

movAX,0B103h

movECX,01018Ah ;третий вариант кода

movSI,0

intlAh

; Устройство найдено?

jc@@DeviceNotFound ;устройство не найдено

: Устройство обнаружено, его координаты на шине PCI : находятся в регистре ВХ POReadPCIRegi sters .-

; Получить базовый адрес блока регистров контроллера IDE

mov AX.OBlOAh ;читать двойное слово

mov DI,20h ;смещение слова int lAh

jc

@@BadRegisterNumber

and CX.OFFFOh ;сбросить младшие 4 разряда

mov [IDEContrRegsBaseAddr],CX

popad

ret

; Обработка ошибок

@@BadRegisterNumber:

MFatalError BadReg ;неверный номер регистра

@@DeviceNotFound:

MFatalError NoIDEC ;не найден контроллер IDE P@PCIBIOSNotFound:

MFatalError NoPCI ;не поддерживается PCI BIOS ENDP Sea rchBusMa sterIDEContr

;* ПРОВЕРИТЬ ПРИСУТСТВИЕ ДИСКА И НАЛИЧИЕ ПОДДЕРЖКИ LBA *

. ********** А А А А А А А ***********A A A A A A A к*******************

PROC HDDPresenceJest near pusha

; Опросить Master-диск канала 1 call ReadHDDID

; Диск подключен? cmp [HDDErrorCode],О jne

@@DiskNotFound

; Режим LBA поддерживается? cmp [dword ptr SectorDataBuffer+60*2],0

je

@@LBANotSupported popa ret

; Обработка ошибок

@@DiskNotFound:

MFatalError NoHDD ;диск не найден

@@LBANotSupported:

MFatalError NoLBA ;не поддерживается LBA

Листинг 6.12 (продолжение) ENDP HDD_Presence_Test

. А"А А А А А ************* А А А А А * А *************** А А А А

;* ПРОЧИТАТЬ ЗАГРУЗОЧНЫЙ СЕКТОР В РЕЖИМЕ DMA * ;*********************************************

PROC ReadBootSector near pushad

; Сбросить разряды ошибки и прерывания в регистре

; состояния канала 1

mov DX,[IDEContrRegsBaseAddr]

add DX,02h

mov AL.llOb out DX.AL

; Настроить контроллер ОМА на запись данных в память

; по каналу 1

; Загрузить адрес управляющего регистра канала 1

mov DX.[IDEContrRegsBaseAddr]

; Сбросить управляющий регистр

mov AL,О out DX.AL

: Установить бит направления передачи данных

mov AL,1000b out DX.AL

; Послать команду чтения сектора 0 (загрузочного)

; Подготовить параметры команды

mov [ATAAddressMode],1 ;режим LBA

mov [dword ptr SectorAddress],0 ;сектор 0

mov [dword ptr ATASectorNumber],0

mov [ATAFeatures],0

mov [ATASectorCount],1 ;прочесть один сектор

mov EAX.[SectorAddress]

; Послать команду диску

mov [ATAConmand].0CBh ;чтение в режиме DMA call SendCommandToHDD

; Проверить код ошибки cmp [HDDErrorCode],0 ;имелась ошибка? jne

@@Errorобработка ошибки

; Активизировать канал 1 контроллера DMA

mov DX,[IDEContrRegsBaseAddr]

mov AL.1001b out DX.AL

; Ожидать готовности данных HDD

mov AX.O

mov ES.AX

mov DX,[HDDBasePortAddr]

add DX.7 ;адрес регистра состояния

(agWaitCompleet:

; Проверить время выполнения команды

mov ЕАХ,[ES:046Ch] sub ЕАХ,[HDDTime] cmp ЕАХ,MaxHDDWa i tTi me ja

@@Errl ;ошибка тайм-аута

; Проверить готовность in AL.DX

test AL,88h состояние сигнала BSY и DRQ jnz

@@WaitCompleet

; Ожидать комца цикла DMA

mov DX,[IDEContrRegsBaseAddr]

add DX,02h (aeWaitDMAOperationEnd: in AL.DX test AL.lOOb jnz

@@Wai tDMAOperati onEnd

: Сбросить управляющий регистр канала 1 контроллера DMA

mov DX,[IDEContrRegsBaseAddr]

mov AL.O out DX.AL

: Отобразить на экран содержимое прочитанного сектора

; в ASCII-кодах

push DS

mov AX,DMA_BUF

mov DS.AX

mov AX,0B800h

mov ES.AX

mov DI,7*160+8*2 xor SI,SI

; Задать светло-голубой цвет и синий фон

mov АН,LIGHTCYAN+BLUЕ*1б

; Цикл по строкам

mov DX.B ;счетчик строк

@@OutNextString: : Цикл по символам строки

mov СХ.64 :счетчик символов в строке PPOutNextChar: lodsb stosw

1oop

@@OutNextChar

add DI,16*2 dec DX

jnz

@@OutNextString pop DS

‘ Ожидать нажатия любой клавиши и выйти из процедуры MShowColorString AnyK call GetChar popad

Листинг 6.12 (продолжение)

ret

; Обработка ошибок

@@Error:

cmp [HDDErrorCode],1

je @PErrl cmp [HDDErrorCode].2

je @PErr2 cmp [HDDErrorCode].3

je @PErr3 cmp [HDDErrorCode],4

je @PErr4 cmp [HDDErrorCode],5

je PPErr5 cmp [HDDErrorCode],б

je @PErr6

@@Errl: MFatalError DErrl №Err2: MFatal Error DErr2

@@Err3: MFatalError DErr3

@@Err4: MFatalError DErr4

@@Err5: MFatalError DErr5

@@Err6: MFatalError DErr6 ENDP ReadBootSector ENDS

; Подключить процедуры вывода данных на экран

Include "1istl._02.inc"

; Подключить процедуру непосредственного считывания

; сектора с жесткого диска

Include "1ist6_07.inc"

END

ПРИМЕЧАНИЕ

Для успешного запуска программы необходимо, чтобы жесткий диск, способный работать в режиме UDMA, был подключен к каналу 1 в качестве Master-дискэ. Кроме того, контроллер PCI сиотемной платы должен поддерживать режим Bus Master, а система BIOS должна обеспечивать начальную установку временных параметров цикла DMA в процессе начальной загрузки системы.

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии