Работа с ide hdd через порты контроллера
Скачать 98 Kb.
|
РАБОТА С IDE HDD ЧЕРЕЗ ПОРТЫ КОНТРОЛЛЕРА Ершов А.А., Маргулис М.Б. Кафедра ЭВМ ДГТУmargulis@cs.dgtu.donetsk.ua AbstractYershov 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); Чтение из секторов Перед первым обращением к процедуре манипулирования секторами 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 } Запись секторов на диск Запись секторов на диск производится по тому же принципу, что и их чтение .Здесь единственное отличие в том, что в командный порт посылается команда чтения и данные из порта не читаются (командой 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
Далее в таблице 2 приводится список портов которые работают с primary HDD. Список портов для работы с контроллером Таблица 2
Литература Фролов А.В. Фролов Г.В. “Библиотека системного программиста”. М: Диалог МИФИ 1999. – 254 с. http://mirrors.usaaa.ru:8000/hardware/bookide/bookide5.stml http://citforum.vrs.ru/hardware/bookide/bookide5.stml http://azx.8m.com/betadisk.html |