Драйвер жесткого диска

Страница: 10/17

ГДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДЕДДДДДДДДДДДДДДДДДДДДДДДДДДДДДґ

і 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 является частью блока начальной загрузки, как

Реферат опубликован: 19/01/2009