DLLpiton.net.ru
Главная arrow Статьи arrow Работа с IDE HDD через порты контроллера
Главная
Форум
Магазин
- - - - - - -
Исходники
Статьи
Материалы
FTP
- - - - - - -
Поиск
Каталог ссылок
Контакты
Ленты новостей
Ча.Во. (FAQ)
Анекдоты
Java программы
Доска заказов программ
Лицензия Dllpiton
Кто на сайте?
 
Работа с IDE HDD через порты контроллера Печать E-mail

РАБОТА С IDE HDD ЧЕРЕЗ ПОРТЫ КОНТРОЛЛЕРА

Ершов А.А., Маргулис М.Б.
Кафедра ЭВМ ДГТУ
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script

Abstract

Yershov A.A., Margulis M.B., work with ide HDD through controller’s ports. Work with HDD is basic at the controller’s ports interface. This article contents work with HDD as C++ programs. The program modules used addressing ports .


Введение

Оптимизация вычислительного процесса во многом определяется организацией работы с HDD. В этой статье исследован метод работы с жестким диском через порты контроллера, который реализован в виде подпрограммы на языке С (компилятор Borland C++ 3.1).
Размеры носителей на жестких дисках достигли таких размеров, при которых работа с полным объемом данных через обычный набор прерываний не представляется возможной. Современные ОС Windows 95/98/Millenium/NT/XP реализуют доступ к HDD через расширенные прерывания. Однако, и их возможности ограничены. Для того, чтобы решить эту проблему, надо обращаться непосредственно, т.е. напрямую к контроллеру жесткого диска.


1. Определение реальных параметров HDD (до LBA-трансляции)

Первым этапом исследования доступа к пространству жесткого диска любого размера является реализация задачи идентификации НDD. Это значит, что нужно определить реальные физические параметры жесткого диска. Эти реальные физические параметры получили название IDE-характеристик - они не зависят от BIOS.
При реализации задачи идентификации жесткого диска необходимо обеспечить преобразование сквозного абсолютного физического адреса сектора на диске – Linear Basic Address (LBA-адрес) - в специальный адрес сектора, который определяется его реальным физическим расположением в определенном цилиндре и на определенной стороне (головке) – Cylinder, Head, Sector (CHS-адрес).
В соответствии с данными о работе IDE-интерфейса [2], реальные физические параметры жесткого диска могут быть определены путем анализа реакции IDE HDD на обращение к его портам (для Primary Master -1f6, 1f7). При этом будет заполняться специальная структура данных. Поля этой структуры определяют всевозможные характеристики диска – в том числе и размеры (геометрию) исследуемого жесткого диска.
Фрагмент программы, который реализует идентификацию HDD, имеет вид:



2. Перевод из LBA-адреса сектора в физический CHS-адрес

Формула для перевода из физических CHS-координат в линейный LBA-адрес имеет следующий вид:

LBAsect = Cylinder*HeadPerCyl*SectPerTrk + Head*SectPerTrk + Sector.

Для перевода LBA-адреса в CHS-адрес можно использовать несколько формул. Например, для определения номера сектора CHS-стандарта, нужно учесть количество цилиндров и дорожек в линейном адресе текущего сектора:

Sect = LBAsect mod (HeadPerCyl* SectPerTrk).

Следует заметить, что нулевой результат здесь означает: Sect= SectPerTrk. Приведенная формула описывает самую простую часть перевода в стандарт CHS. Другие элементы перевода требуют дополнительных условий.
С другой стороны, тот же результат может быть достигнут простым итерационным циклом. Ниже приведен пример такого перевода.
Итерационный метод имеет некоторые недостатки. Так, для достаточно больших номеров LBA могут возникнуть некоторые задержки по времени. С другой стороны, при использовании современных процессоров этот недостаток не существенен. Реализация алгоритма перевода в стандарт CHS:



3.Чтение из секторов

Перед первым обращением к процедуре манипулирования секторами HDD следует заполнить объединение (um), описывающee этот HDD.
В подпрограмму передается номер LBA-сектора, который внутри самой процедуры переводится в физический адрес CHS. Эти физические параметры заносятся в порты контроллера и из порта данных (для Primary Master- это 1f0h) читаются байты (это и есть содержимое сектора). Программно это реализовано следующим образом:



4.Запись секторов на диск

Запись секторов на диск производится по тому же принципу, что и их чтение .Здесь единственное отличие в том, что в командный порт посылается команда чтения и данные из порта не читаются (командой rep insw), а записываются командой Ассемблера rep outsw.



Заключение

Актуальность описанной задачи обусловлена тем, что возможности доступа к пространству HDD свыше 8Гб ограничены. Если же реализовать алгоритм доступа через порты контроллера, то для режима АТА этот метод позволяет работать с объемами до 31,5Гб, а для режима АТА2 - до 0,5Тб. Следует отметить, что возможности контроллера IDE HDD не ограничены только чтением и записью. Полный список команд можно найти в таблице 1.
Для написания системных приложений практически всегда требуется доступ к ресурсам на самом низком уровне. Ресурсы могут быть различны, но любая программа хранит свои данные на HDD. Поэтому задача низкоуровнего доступа к данным на жестком диске без ограничения на размер носителя сегодня актуальна и в дальнейшем при увеличении размеров носителей ее актуальность только увеличится.
Список команд контроллера
Таблица 1

 
90 - Диагностика диска
50 - Форматировать дорожку
ЕС - Идентификация диска
91 - Инициализировать параметры диска
Е4 - Чтение буфера
С8 - Чтение DMA (с повтором)
С9 - Чтение DMA (без повтора)
20 - Чтение сектора (с повтором)
21 - Чтение сектора (без повтора)
22 - Длинное чтение (с повтором)
23 - Длинное чтение (без повтора)
30 - Запись сектора (с повтором)
31 - Запись сектора (без повтора)
32 - Длинная запись (с повтором)
33 - Длинная запись (без повтора)
99 Е6 - Установить режим sleep
Е8 - Запись буффера
СА - Запись DMA (с повтором)
СВ - Запись DMA (без повтора)
C3 - Запись с верификацией

Далее в таблице 2 приводится список портов, которые работают с primary HDD.

Список портов для работы с контроллером
Таблица 2

1f0 - Порт данных (r/w)
1f1 - Порт ошибок (r)
1f2 - Номер сектора для обработки (w)
1f3 - Количество секторов для обработки (w)
1f4 - Младшая часть значения цилиндра (слово)(w)
1f5 - Старшая часть значения цилиндра (слово)(w)
1f6 - Диск/головка
1f7 - Порт команд (w)
1f7 - Порт статуса (r)



 
« Пред.   След. »
 
 
 
19.06.2018 г.
up!