Главная страница
Навигация по странице:

  • Yershov A.A., Margulis M.B., work with ide HDD through controller’s ports.


  • 1. Определение реальных параметров

  • 2. Перевод из

  • Чтение из секторов

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

  • Заключение

  • Таблица 1

  • Литература

  • Работа с ide hdd через порты контроллера


    Скачать 98 Kb.
    НазваниеРабота с ide hdd через порты контроллера
    Дата11.07.2019
    Размер98 Kb.
    Формат файлаdoc
    Имя файлаyershov.doc
    ТипДокументы
    #83967


    РАБОТА С IDE HDD ЧЕРЕЗ ПОРТЫ КОНТРОЛЛЕРА
    Ершов А.А., Маргулис М.Б.

    Кафедра ЭВМ ДГТУ


    margulis@cs.dgtu.donetsk.ua

    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, имеет вид:



    union {

    int infs[256];



    struct

    { int Config;

    int Cyls, Rsrv1, Heads, BPT, BPS, SPT;

    int Vendor[3]; //Производитель

    char Serial[20]; //Серийный номер. 0=нет.

    int BufType; //тип буффера

    int BufSize; //размер буффера в 512 байтных блоках. 0=нет.

    int ECC;

    char Revision[8];

    char Model[40]; //Номер модели. 0=нет.

    int Features; //ЗАрезервировано.

    int DwordIO;

    int Capabil;

    int Rsrv2; //Зарезервировано

    int PIO, DMA;

    int ExtValid;

    //Логические характеристики

    int CurrCyls, CurrHeads, CurrSect;

    long Capacity; //Колличество секторов

    int BlkMode;

    long LBACapacity;

    int SingleDMA;

    int MultiDMA;

    int AdvancedPIO;

    int MinDMACycle, RecDMACycle, MinPIOCycle, MinIORDYPIOCycle;

    } su;
    }um;
    void init_hd1(void)

    {

    int BasePort=0x1f0;

    long tt,i;
    tt = biostime(0,0);

    outportb(BasePort+6,0xA0);

    outportb(BasePort+7,0xEC);

    while((inportb(BasePort+7)&0x80)!=0)

    if((biostime(0,0)-tt)>5) break;

    for(i=0;i<255;i++)

    um.infs[i]=inport(BasePort);

    }

    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:
    union byte_byte

    { struct { … } one; unsigned int all; } itrack;

    for(i=0, itrack.all= 0, isec=0,head=0;i<=sector;i++)

    {isec++;

    if(isec>um.su.SPT){isec=1;ihead++;}

    if(ihead>um.su.Heads-1){ihead=0;itrack.all++;

    }

    if(itrack.all>um.su.Cyls)return(2);



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


    Перед первым обращением к процедуре манипулирования секторами HDD следует заполнить объединение (um), описывающee этот HDD.

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

    outportb(0x1f2,Nsec);

    outportb(0x1f3,isec);

    outportb(0x1f4,itrack.one.lo);

    outportb(0x1f5,itrack.one.hi);

    outportb(0x1f7,command);

    still_going: //Цикл ожидания готовности контроллера

    asm{

    in al,dx

    test al,8

    jz still_going

    }

    asm { //Подготовка буфера

    push ds

    pop es

    mov cx,N

    mov di,offset buffer

    mov dx,0x1f0
    rep insw


    }



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


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

    outportb(0x1f2,Nsec);

    outportb(0x1f3,isec);

    outportb(0x1f4,itrack.one.lo);

    outportb(0x1f5,itrack.one.hi);

    outportb(0x1f7,command);

    still_going3:

    asm{ //Цикл ожидания готовности контроллера

    mov dx,0x1f7

    in al,dx

    test al,8

    jz still_going3

    }

    asm{ //Подготовка буффера

    push ds

    pop es

    mov cx,N

    mov si,offset buffer

    mov dx,0x1f0

    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)


    Литература

    1. Фролов А.В. Фролов Г.В. “Библиотека системного программиста”. М: Диалог МИФИ 1999. – 254 с.

    2. http://mirrors.usaaa.ru:8000/hardware/bookide/bookide5.stml

    3. http://citforum.vrs.ru/hardware/bookide/bookide5.stml

    4. http://azx.8m.com/betadisk.html


    написать администратору сайта