Реферат: Драйвер жесткого диска
Драйвер состоит из одного сегмента кодов, поэтому для адресации данных используется сегментный регистр CS.
Запрос операционной системы к драйверу соcтоит из заголовка, имеющего фиксированный формат и длину 13 байт, и переменной части, размер и формат которой зависит от выполняемой функции.
Приведем формат заголовка запроса:
(0) 1 | size | Длина запроса в байтах (длина заголовка запроса плюс длина переменной части запроса) |
(+1) 1 | unit | Номер устройства (используется для блочных устройств, указывает, с каким именно устройством, обслуживаемым драйвером, будет работать операционная система) |
(+2) 1 | cmd | Код команды, которую требуется выполнить (может иметь значение от 0 до 18h) |
(+3) 2 | status | Слово состояния устройства, заполняется драйвером перед возвратом управления операционной системе |
(+5) 8 | reserved | Зарезервировано |
После вызова программы стратегии DOS передает управление программе прерывания (без параметров). Задача программы прерывания - выполнить команду, код которой находится в поле cmd заголовка запроса. Если драйвер блочного устройства обслуживает несколько логических устройств, то в поле unit находится номер устройства, для которого необходимо выполнить команду.
В зависимости от выполняемой команды запрос может содержать другую информацию, необходимую для выполнения команды.
Как результаты выполнения команды возвращаются DOS?
Данные (или адреса данных), полученные драйвером от физического устройства ввода/вывода, помещаются в область переменной части запроса. Кроме того, драйвер должен установить слово соcтояния устройства status в заголовке запроса в соответствии с результатами выполнения команды.
Приведем формат слова состояния устройства:
Бит | Назначение |
0-7 | Код ошибки устройства (если команда выполнена с ошибкой и драйвер установил признак ошибки (бит 15) в единицу, в это поле он должен записать код ошибки). |
8 | Команда выполнена. Этот бит всегда устанавливается драйвером перед тем, как он возвращает управление операционной системе. |
9 | Занято. Этот бит устанавливается обработчиком команды, когда физическое устройство занято выполнением предыдущей операции и поэтому не может выполнить требуемую команду. Этот бит используется также для передачи такой информации, как "буфер клавиатуры не пуст", "среда носителя данных заменяемая" (в команде проверки возможности замены среды носителя данных). |
10-14 | Зарезервировано. |
15 | Признак ошибки. Устанавливается драйвером, когда он не может обработать запрос или произошла физическая либо логическая ошибка при обработке правильного запроса. Биты 0-7 при этом должны содержать код ошибки. |
Приведем таблицу возможных кодов ошибок:
Код | Описание |
0 | Нарушение защиты от записи. Была предпринята попытка записи информации на защищенное от записи устройство. |
1 | Неизвестное устройство. |
2 | Устройство не готово. |
3 | Неизвестная команда. Затребованная команда не поддерживается драйвером. |
4 | Ошибка CRC. При выполнении команды обнаружена ошибка циклического кода проверки. |
5 | Неправильная длина запроса. Поле длины в заголовке запроса содержит неверное значение. |
6 | Ошибка при поиске дорожки (дорожка не найдена). |
7 | Неизвестный носитель данных. |
8 | Сектор не найден. |
9 | Нет бумаги в принтере. |
0Ah | Ошибка записи. |
0Bh | Ошибка чтения. |
0Ch | Общая ошибка. |
0Dh | Зарезервировано. |
0Eh | Зарезервировано. |
0Fh | Неразрешенная замена диска (только для DOS версии 3.0 и более поздних версий). |
Общая схема действий программы прерывания драйвера такова:
- получив управление от операционной системы, программа прерывания сохраняет содержимое всех регистров процессора и считывает номер команды из заголовка запроса;
- при необходимости программа считывает дополнительную информацию из области запроса;
- затребованная команда выполняется (если она поддерживается драйвером);
- если драйвер считывает какие-либо данные от обслуживаемого физического устройства для передачи их DOS, то сами данные или их адреса программа прерывания записывает в область запроса;
- программа прерывания устанавливает слово состояния устройства в соответствии с результатами выполнения команды (если драйвер не поддерживает затребованную команду, в слове состояния устройства устанавливаются биты 15 и в биты 0-7 записывается код ошибки 3 - неизвестная команда);
- восстанавливается содержимое регистров процессора, и управление возвращается операционной системе с помощью команды возврата из дальней процедуры.
Инициализация драйвера
Эта функция выполняется только один раз при загрузке драйвера и подключении его к операционной системе.
Функция инициализации должна поддерживаться любым драйвером, так как она сообщает операционной системе сведения, необходимые DOS для правильного подключения и использования драйвера.
Приведем формат запроса для команды инициализации:
(0) 13 | header | Заголовок запроса. |
(+13) 1 | n_units | Количество устройств, обслуживаемых драйвером. Это поле заполняется только блочным драйвером. |
(+14) 4 | end_addr | Конечный FAR-адрес резидентной части кода драйвера. В это поле драйвер записывает адрес байта памяти, следующего за той частью кода драйвера, которая должна стать резидентной. |
(+18) 4 | parm | FAR-адрес строки параметров инициализации драйвера из файла CONFIG.SYS. Эта строка содержит все, что находится в строке файла после команды 'DEVICE=', она заканчивается символами перевода строки и возврата каретки 0Ah, 0Dh. При возврате драйвер блочного устройства должен записать в это поле адрес массива указателей на блоки параметров BIOSBIOS (BPB), по одному указателю на каждое устройство, обслуживаемое драйвером. |
(+22) 1 | drive | Номер устройства. Для версии DOS 3.0 и более поздних версий в это поле при загрузке драйвера операционная система заносит номер, назначенный устройству, обслуживаемому драйвером. Например, для устройства А: это 0, для B: - 1 и т.д. |
При инициализации драйвер символьного устройства сохраняет в своей внутренней области данных параметры инициализации, используя адрес parm. Если параметры содержат числовые величины, программа инициализации может произвести их перекодировку и сохранить значения в двоичном формате.
Затем драйвер может выполнить инициализацию обслуживаемого физического устройства ввода/вывода, инициализацию своих внутренних переменных, вывести на экран какие-либо сообщения либо даже запросить у оператора дополнительные данные - функция инициализации может пользоваться для организации диалога с оператором и других действий функциями прерывания 21h с номерами от 01h до 0Ch, 25h, 30h, 35h и функциями BIOS.
Кроме этого, драйвер должен заполнить поле end_addr адресом конца резидентной части драйвера. Так как программа инициализации выполняется только один раз, обычно ее располагают в конце драйвера и для экономии памяти не оставляют резидентной.
Драйверы блочных устройств дополнительно должны возвратить DOS количество обслуживаемых устройств (в поле n_units) и указатель на массив указателей на блоки BPB (в поле parm).
Количество устройств используется DOS для определения логических имен устройств. Например, если Ваш драйвер обслуживает три логических устройства, и на момент его загрузки в системе имеются устройства A:, B: и C:, то устройства, обслуживаемые Вашим драйвером, получат имена D:, E: и F:. Количество устройств необходимо указывать также и в заголовке драйвера, в первом байте поля имени устройства dev_name.
Для каждого логического устройства драйвер должен содержать так называемый блок параметров BIOS (BIOS Parameter Block) BPB.
Блок BPB содержится в загрузочном секторе диска и содержит информацию, необходимую BIOS для работы с диском. Приведем формат BPB:
(0) 2 | sect_siz | Количество байтов в одном секторе диска. |
(+2) 1 | clustsiz | Количество секторов в одном кластере. |
(+3) 2 | res_sect | Количество зарезервированных секторов. |
(+5) 1 | fat_cnt | Количество таблиц FAT. |
(+6) 2 | root_siz | Максимальное количество дескрипторов файлов, содержащихся в корневом каталоге диска. |
(+8) 2 | tot_sect | Общее количество секторов на носителе данных (в разделе DOS). |
(+10) 1 | media | Байт-описатель среды носителя данных. |
(+11) 2 | fat_size | Количество секторов, занимаемых одной копией FAT. |
Приведем фрагмент исходного текста драйвера, возвращающего при инициализации указатель на массив BPB:
lea dx,bpb_ptr
mov es:[bx+18],dx
mov es:[bx+20],cs
. . . . . . . . . .
В этом примере предполагается, что ES:BX содержит адрес заголовка запроса.
Разметка диска ?????? ?? ??????? ???? ???????????? ? ????????. ??????? ????????????? ?? ????????. ????????? ??????? ?????????? ? ??????? ??????? ???????? (??? ??????????? ??????? ???????). ?????????? ??????? (??????) ? ???????, ??? ?? ??? ? ???????????? ????? ???????, ????? ?????????? ? ???????? ??????? ???????? ? ??????? ?? ???? ??????????? ??????????. ??????? ?????? ???????? ?? 8 ?? 26 ???????? ? ??? ??????? ??????????? ?????????? ????? ???????? ?? ??????? ?????????. ?????? ??????? ???????????? ???????? "??????", ??????? ???????????? ??????????? ??? ?????? ??????? ?????. ????? ??????? ?????? ?????? ???????. ?????? ?????? ????? ???????? ?? ??????? ?? ????? ????????, ?????? ???????? ??????? ??????????? ????? 1, ?????? ??? ?? ??????? ?? ? ?. ?. ????? ??????? ??? ??????? ??????????? ?????? 3, ??????? ?? 17-????????? ??????? ????? ????????????? ????????? ???????: ??????????????????????????????????????????????????Ŀ ? 1? 7?13?2 ?8 ?14?3 ?9 ?15?4 ?10?16? 5?11?17? 6?12? ??????????????????????????????????????????????????Ĵ ? ? ?????? ? ? ? ????-??? ? ? ?<--???????<------>? ?????? --> ? Формат сектора приведен в таблице. ??????????????????????????????????????????????????????????????Ŀ ????????????? ?????????? ?????? ? ? ? ?(????)? ??????????????????????????????????????????????????????????????Ĵ ? ?? ? ???????? ?????? ? 4 ? ? ???1 ? ???????? ? 9-12 ? ??????????????????????????????????????????????????????????????Ĵ ? ? ???? ?????????????: ? ? ? ????1 ? ?????????? ? 1 ? ? ???2 ? ???????? ? 2 ? ? ??? ? ???? ??? ????????? ? 1 ? ? ??? ? ??????? ???? ?????? ???????? ? 1 ? ? ??? ? ??????? ???? ?????? ???????? ? 1 ? ? ??? ? ????? ??????? ? 1 ? ? ???? ? ????? ??????? ? 1 ? ? ???? ? ???????? ???? ? 1 ? ? ???? ? ??????? ???? ? 1 ? ? ??1 ? ??????????? ????? ???? ????????????? ? 4 ? ??????????????????????????????????????????????????????????????Ĵ ? ???3 ? ???????? ? 16 ? ??????????????????????????????????????????????????????????????Ĵ ? ? ??????? ??????: ? ? ? ????2 ? ?????????? ? 1 ? ? ???4 ? ???????? ? 2 ? ? ?????? ? ???? ?????? ? 512 ? ? ??2 ? ??????????? ????? ???? ?????? ? 4 ? ??????????????????????????????????????????????????????????????Ĵ ? ???5 ? ???????? ? 43 ? ???????????????????????????????????????????????????????????????? ?????? ??????? ???????????? ??? ?????? ?????????? ??????????, ?????????? ???????? ????????. ???? ??????????, ???????????? ? ??????? ???1 - ???5, ??????????? ??????, ?????? ????? ???2 ? ???4 ????????? ? ????? 2 ??????, ? ?? ????? ??? ???1, ???3 ? ???5 ????? ????? ?????? ?????, ??????? ???????????? ?? ????????, ??????????? ? ???????. ??? ??? ????????? ????????????? ??? ?????????? ?????????? ? ?????????? (??????) ????????? ?? ??? ???????, ? ???????? ? ????? ??????????? ???, ??? ???????? ??????, ???? ????????????? ? ?????? ????? ???????????? ? ?????? ????? ?????? ????? ????????? ??????????, ??? ?? ???????????? ??????? ?????????? ?????????? ????? ?????????? ??????? ? ????? ????????? ?? ???? ????? ???????. ??????? ? ????? ????? ?????????? ????????? ???, ??? ??????????? ??????? ????? ????? ?????????? ???????????, ???????????? ?????????? ???????? ????????? ??????? ??????? ? ????????? ????????????? ??? ??????????? ???? ?? ??????. ???? ??? ????? ?????????? ???????? ??? ???? ???????? ? ???????????? ??? ???????? ???????????? ?????????? ???? ?????????????. ???????? ???? ???????? ????????? ??????????, ? ????????? ???????? ??????????? ???????, ???? ?? ?? ???????? ??? ??????. ??????????? ????? ?????? ??? ???????? ???????????? ?????????? ?????????? ?? ???? ????????????? ? ??????? ?????? ? ??????????? ??????????? ??????????? ????? ????????? ?????? (Error Correction Code, ECC) ? ???????????? ????????? 32-? ???????.Контроллер жестких дисков для АТ-подобных ПЭВМ IBM PC AT ?????????? ?? ???? ?????????? ??????? IBM PC ? ??????????? ???? ? ?????????: - ??????????? BIOS ???????????? ??????????? ?????? ??? ? ???????????? ?? ??????, ??? ? ? ???????????? ?? ??????? ??????; - ??????????? ??????? ? ?????? ?????? ??????????? ?? ????? ?????; - ?????? ?????? ?????-??????, ??????????????? ??? ?????????? ??????? ??????, ? ?????????? ?????? ????????? ?????????? ?? ??-???????? ????. ???????? ??????????? ? ?????? ???? ???? ??????? ??????. ?????? ???? ????? ???? ????? ?????? (1F0h-1F7h ??? ??????? ? 170h-177h ??? ???????). ???? ????? ??????? ????? ?????? ??????? ?????. ?????????? ?????? ??????? ????? ?????????? ???????. Описание портов ввода-вывода ???? 1F0h ???????????? ??? ?????? ??????? ? ?????????? ??? ???????????, ?????????? ????????????? ?????? ????? ??????????? ??????? ???? ? ???????????. ???? 1F1h. ??? ?????? ????? ???? ???? ????? ???????? ?????????? ? ????????? ????????? ??????: 7 6 5 4 3 2 1 0 ???????????????????????????????Ŀ ? ? ? 0 ? ? 0 ? ? ? ? ???: ????????????????????????????????? ???? ? ? ? ? ? ??>0: 1=???????? ?????? ?????? ?? ? ? ? ? ? ?????? ? ? ? ? ??????>1: 1=?????? ?? ??????? ??????? ? ? ? ??????????>2: 1=?????????? ??????? ??????- ? ? ? ???? ??????????, ??????? ? ? ? ?? ??????????? ? ? ??????????????????>4: 1=????????????? ??????? ?? ? ? ?????? ? ??????????????????????????>6: 1=???????????? ?????? ? ???- ? ???, ?????? ??????????? ? ????? ??????????????????????????????>7: 1=????????? ?????? ???? 1F2h. ??????/?????? ????? ???????? ??? ??????????? ????????. ???? 1F3h. ??????/?????? ????????? "????? ???????" ??? ??????????? ????????. ???? 1F4h. ??????/?????? ??????? ????? ?????? ???????? ??? ??????????? ???????? (???? 0 - 1 - ??? ???? 8 - 9 ? 10-??????? ?????? ????????). ???? 1F5h. ??????/?????? ??????? ?????? ????? ?????? ???????? ??? ??????????? ????????. ???? 1F6h. ??????/?????? ?????? ?????????? ? ??????? ??? ??????????? ????????. ???? 1F7h (??????). ????? ??????? ?? ?????????? ???????????. ???? 1F7h (??????). ?????? ????????? ?????????? ? ??????????? ?????????? ???????: 7 6 5 4 3 2 1 0 ???????????????????????????????Ŀ ? ? ? ? ? ? ? ? ? ???: ????????????????????????????????? ???? ? ? ? ? ? ? ? ??>0: 1=?????????? ??????? ?????- ? ? ? ? ? ? ? ?????? ? ??????? ? ? ? ? ? ? ??????>1: 1=?????? "??????" ? ? ? ? ? ??????????>2: 1=?????? ??? ?????????? ???- ? ? ? ? ? ?????? ???????? ???? ????- ? ? ? ? ? ??????????? ??? ?????? ? ? ? ? ? ????????? ECC ? ? ? ? ??????????????>3: 1=???? ??????? ?????? ??????? ? ? ? ??????????????????>4: 1=????? ???????? ? ? ??????????????????????>5: 1=?????? ?????? ? ??????????????????????????>6: 1=?????????? ?????? ??? ???- ? ???, ?????? ??? ?????? ??????????????????????????????>7: 1=?????????? ?????? ???????- ???? ??????? ( ????????? ???? ?? ????? ????????? ????????)Система команд ??? ??????? ????????? ? ???? 1F7h ????? ????, ??? ???????????? ??? ????????? ? ?????? 1F2h - 1F6h. ?????????? ??????? ?????????? ????? ????? ????????? ? ???? 1F7h ???? ???????. ??????? ??????? ?? ?????? ?????. ??????? 4 ???? ???????? ??? ????????? ????????, ??????? ???????? ?????????. ???????? ?????? ? ?????????? ?????????? ?????????? ???????? ? ???????. ??????????????????????????????????????????????????????????????Ŀ ? ??? ? ?????????? ? ????????? ? ?????????? ? ? ??????????????????????????????????????????????????????????????Ĵ ? 1 ? ????????????? (????? ? ?????? ????????? ??????? ? ? ? ??????? ?? ??????? 0) ? "???" ? ??????????????????????????????????????????????????????????????Ĵ ? 2 ? ?????? ???????? ? ????, ???????????? ????????-? ????????????????????????????????Ĵ ????? ????????? ????????? ? ? 3 ? ?????? ???????? ? ? ????? ? ????????? ??????? ? ????????????????????????????????Ĵ ?????????? ??? ??????? ? ? 4 ? ???????? ???????? ? ??????????? ????? ? ??????????????????????????????????????????????????????????????Ĵ ? 5 ? ?????????????? ???????? ???????? = 0 ? ??????????????????????????????????????????????????????????????Ĵ ? 7 ? ????? ???????? ? ?????? ????????? ??????? ? ? ? ? "???" ? ??????????????????????????????????????????????????????????????Ĵ ? 9 ? ??????????? ? ???????? = 0 ? ? ?????????????????????????????????????????????????????Ĵ ? ? ????????? ?????????? ? ???????? = 1 ? ? ? ?????????? (?????????-? ? ? ? ??? ????? ??????? ? ? ? ? ? ????????) ? ? ???????????????????????????????????????????????????????????????? ??? ????????? ?????????? ? ??????? ??????, ? ????? ?? ??????????????? ?????????? ??????????????? IDE ??????????. ??? ????, ????? ??????????? ???????? ????? ?????? ??? ????? ??? ????? ???????, ?????????? ?????????? ????????? ???????? ???????????????? IDE ???????????. ??????? ???? ?????/?????? ??? ??????? IDE ??????????? - 1F0h. ??? ? ??????????? ???? ???????? (3F6h) ??? ?????? ????????? ???????????. ??? ?????? ??????????? ?????? ??????? hd_reset(). ??? ??? ?????????? ?????????? ?????? ?? ?????????? IRQ14, ?? ???? ????????????? ? ???????, ????????? ?????????? ?? ???????????. ????? ???????? ?????? hd_wait(), ??? ????????????? ?????? ??????? ?? ??? ???, ???? ?? ?????????? ?????????? ?? ??????????? ??????? ?????? ??? ?? ??????? ????? ????????. ????????? ????????? ???????????? ??? ???????????? ? ????????? IRQ.???????????? ???????????? ?????????????? ????? ???? 1F7h, ? ???? ???????????? ??? ??????????????? ??????? ? ????? ?? ?????????? ? ??? ???????? ????????? ??????????. ????? ??????? ?????????????? ????? ???? 1F0h, ???? 1F1h ?????? ??? ?????? ??????, ??? ????????? ????? (1F2h-1F6h) ??? ??????? ?????????? ??????. ???, ????????, ????? ??????? ??????? ????????? ?????????? ? 5? ??? ????? 1F6h ????????? ????? ?????, ????????????? ? ??????? ???????????.
????? ???? ??? ? 1F7h ??????? ??????? ????????? ??????????, ?????????? ????????? ?????????? ?? ???????????, ??????? ?????? ?? ??, ??? ???? ???????? ?????????? ???????. ?????????? ?????????? ???????? ? ?????? ?????, ??????? ??????????? ????? ???? 1F0h. ??????, ???????????????, ????????????????????????.
Port Description
____ ______________________________________________________________________
1f0H Data register. Read/write data from/to controller sector buffer