Разработать загружаемый драйвер жесткого диска. Техническое задание 1 Содержание 2 Введение 3 Основная часть
Скачать 313 Kb.
|
Инициализация драйвераЭта функция выполняется только один раз при загрузке драйвера и подключении его к операционной системе. Функция инициализации должна поддерживаться любым драйвером, так как она сообщает операционной системе сведения, необходимые DOS для правильного подключения и использования драйвера. Приведем формат запроса для команды инициализации:
При инициализации драйвер символьного устройства сохраняет в своей внутренней области данных параметры инициализации, используя адрес 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:
Приведем фрагмент исходного текста драйвера, возвращающего при инициализации указатель на массив 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 1f1H Write: Write Precompensation register. Turn on write precompensation. Read: Error register. Contains bits for last error. +7-6-5-4-3-2-1-0+ ¦ ¦ ¦0¦ ¦0¦ ¦ ¦ ¦ +---------------+ bit ¦ ¦ ¦ ¦ ¦ +- 0: Data Address Mark not found ¦ ¦ ¦ ¦ +--- 1: Track 0 Error ¦ ¦ ¦ +----- 2: Command was aborted ¦ ¦ +--------- 4: Sector ID not found ¦ +------------- 6: ECC Error: Uncorrectable data error +--------------- 7: Bad block 1f2H Sector count. Read/Write count of sectors for operation 1f3H Sector number. Read/Write current/starting logical sector number 1f4H Cylinder high (bits 0-1 are bits 8-9 of 10-bit cylinder number) Получение блока параметров BIOS Не рассматривая механизма возврата BPB, мы должны решить задачу определения содержимого блока параметров BIOS. Описываемые методы применимы не только к команде BUILD BPB, но и к команде INIT. В простейшем случае драйвера устройства, поддерживающего только один тип носителя (например драйвер RAM-диска), содержимое BPB может быть закодировано в теле самого драйвера. К несчастью, при работе с реальными дисками, включая жесткие диски, не все так просто и драйвер обязан определять содержимое BPB. Как правило, BPB является частью блока начальной загрузки, как показано на рис.6-7. В этом случае драйвер должен найти и прочитать этот блок, выбрать оттуда блок параметров BIOS и возвратить адрес последнего. Практически во всех случаях блок начальной загрузки располагается в самом первом логическом секторе диска (т.е. сектора, имеющего номер 0). Преобразование номера логического сектора в координаты физического сектора зависит от характеристик устройства и должно быть описано в документации по этому устройству. Драйвер должен проверить структуру этого сектора, чтобы убедиться, что он действительно содержит блок начальной загрузки. Если первый логический сектор не содержит корректного блока начальной загрузки, например, как в дисках, отформатированных в MS-DOS версий до 2.0,то драйвер должен считать первый сектор таблицы размещения файлов (FAT). К счастью, MS-DOS версий до 2.0 поддерживали только несколько форматов, каждый из которых определялся в первом секторе FAT второго логического сектора диска. Самый первый байт первого сектора FAT содержит байт описателя носителя, который можно использовать для определения соответствующего содержимого BPB, возвращаемого к MS-DOS. Версии MS-DOS до 2.0 используют описатели 0FEH и 0FFH. СМЕЩЕНИЕ СОДЕРЖАНИЕ РАЗМЕР (hex) ┌───────────────────────────────────────╖ +00 │ Команда перехода на код загрузчика ║ 3 байта ├───────────────────────────────────────╢ +03 │ Имя и версия изготовителя ║ 8 байт ╓─ ├───────────────────────────────────────╢ ║ +0B │ Размер сектора в байтах ║ Слово ║ ├───────────────────────────────────────╢ ║ +0D │ Количество секторов в кластере ║ Байт ║ ├───────────────────────────────────────╢ ║ +0E │ Количество зарезервированных секторов ║ Слово БЛОК ║ ├───────────────────────────────────────╢ ║ +10 │ Количество таблиц FAT ║ Байт ПАРАМЕТРОВ ─╢ ├───────────────────────────────────────╢ ║ +11 │ Количество элементов директория ║ Слово BIOS ║ ├───────────────────────────────────────╢ ║ +13 │ Количество логических секторов ║ Слово ║ ├───────────────────────────────────────╢ ║ +15 │ Описатель носителя ║ Байт ║ ├───────────────────────────────────────╢ ║ +16 │ Количество секторов в одной FAT ║ Слово ╙─ ├───────────────────────────────────────╢ +18 │ Количество секторов на дорожке ║ Слово ├───────────────────────────────────────╢ +1A │ Количество головок чтения/записи ║ Слово ├───────────────────────────────────────╢ +1C │ Количество скрытых секторов ║ Слово ╘═══════════════════════════════════════╝ Рисунок 6-7. Содержимое первых 30 байт блока начальной загрузки Выполняя этот процесс, Вам следует помнить, что просто чтение диска не может гарантировать правильных результатов. Если устройство и драйвер поддерживают несколько форматов (например, с различными размерами сектора), то драйверу может потребоваться несколько попыток чтения с разными форматами для того, чтобы об- наружить корректный формат. После того, как сформирован BPB и оп ределен формат данного диска драйвер, поддерживающий устройство со сменным носителем (имеющий атрибут OCRM), обязан получить идентификатор тома данного диска. Найти его можно, обратившись к корневому директорию. Вкратце, последовательность обработки команды BUILD BPB следующая : 1. Драйвер должен прочитать блок начальной загрузки (обычно на- ходящийся в первом логическом секторе диска - сектор #0) и проверить его на наличие блока параметров BIOS. Если BPB об- наружен, то переход к шагу 3, иначе переход к шагу 2. 2. Драйвер должен прочитать первый сектор FAT для того, чтобы получить байт описателя носителя. Полагаясь на этот MDB, драйвер должен сконструировать соответствующий BPB. 3. Если устройство поддерживает замену носителя (установлен бит 11 слова атрибутов), драйвер должен получить из корневого директория идентификатор тома и сохранить его. Для выполнения этого алгоритма, драйвер должен иметь буфера для хранения копии BPB и имени тома, а также буфер, предназначен- ный для считывания туда сектора с диска. Мы опустили из рассмотрения параметры, которые передаются драйверу при обращении к нему с командой BUILD BPB. Игнорируйте их. Один из этих параметров - это описанный ранее описатель носителя, который в данной ситуации не имеет никакого значения, так как данная команда возвращает MS-DOS новое его значение. Второй параметр - это адрес буфера, который либо не содержит ничего су- щественного (если бит 13, NONIBM атрибут, равен 1), либо содержит копию первого сектора FAT (если бит 13 сброшен). В последнем слу- чае, т.е. если там содержится FAT, этот буфер никоим образом не должен быть модифицирован, а так как драйвер обязан иметь свой буфер, куда будет считываться блок начальной загрузки, то на бу- фер, передаваемый при вызове команды BUILD BPB можно не обращать внимания. Напоследок представляется важным отметить, что в отличие от BPB описатель носителя не обеспечивает однозначного определения формата диска. Однако, MS-DOS версии 3.0 и выше не будут обновлять свои внутренние структуры, ассоциированные с данным дисководом, до тех пор, пока байт описателя носителя не станет отличным от предыдущего MDB. Даже несмотря на то, что MS-DOS версии 3.0 и выше не обращают внимание на действительное значение MDB, драйвер должен вернуть новый MDB при смене формата дискеты. Подключение драйвера Он устанавливается путем включения имени готовой программы в файл конфигурации системы. DEVICE=[d:][path]filename[.ext][ parameters] где (заключенные в квадратные скобки элементы не являются обязательными): d: - идентификатор дисковода, path - путь к драйверу, filename - имя файла, содержащего драйвер, ext - расширение имени файла, parameters - параметры для драйвера. Для установки драйвера следует поместите в файл CONFIG.SYS строку DEVICE = myHDD.sys. (myHDD.sys- это имя программы) Затем перезагрузить систему для установки драйвера. |