_WELCOMETO Radioland

Главная Схемы Документация Студентам Программы Поиск Top50  
Поиск по сайту



Навигация
Главная
Схемы
Автоэлектроника
Акустика
Аудио
Измерения
Компьютеры
Питание
Прог. устройства
Радио
Радиошпионаж
Телевидение
Телефония
Цифр. электроника
Другие
Добавить
Документация
Микросхемы
Транзисторы
Прочее
Файлы
Утилиты
Радиолюб. расчеты
Программирование
Другое
Студентам
Рефераты
Курсовые
Дипломы
Информация
Поиск по сайту
Самое популярное
Карта сайта
Обратная связь

Студентам


Студентам > Курсовые > Драйвер жесткого диска

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

Страница: 4/6

 і   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- это имя программы)