На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 6 / Получение блока параметров BIOS Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Получение блока параметров 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. В главе 11 представлен список различных значений типов дисков, из которых берется MDB.


                  СМЕЩЕНИЕ              СОДЕРЖАНИЕ                РАЗМЕР
                   (hex)
                        ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД·
                    +00 і  Команда перехода на код загрузчика   є 3 байта
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                    +03 і       Имя и версия изготовителя       є 8 байт
                  ЦД    ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +0B і        Размер сектора в байтах        є Слово
                  є     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +0D і    Количество секторов в кластере     є Байт
                  є     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +0E і Количество зарезервированных секторов є Слово
         БЛОК     є     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +10 і         Количество таблиц FAT         є Байт
      ПАРАМЕТРОВ Д¶     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +11 і    Количество элементов директория    є Слово
         BIOS     є     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +13 і    Количество логических секторов     є Слово
                  є     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +15 і          Описатель  носителя          є Байт
                  є     ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                  є +16 і    Количество секторов в одной FAT    є Слово
                  УД    ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                    +18 і    Количество секторов на дорожке     є Слово
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                    +1A і   Количество головок чтения/записи    є Слово
                        ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
                    +1C і      Количество скрытых секторов      є Слово
                        ФНННННННННННННННННННННННННННННННННННННННј

          Рисунок 6-7. Содержимое первых 30 байт блока начальной загрузки

Выполняя этот процесс, Вам следует помнить, что просто чтение диска не может гарантировать правильных результатов. Если устройство и драйвер поддерживают несколько форматов (например, с различными размерами сектора), то драйверу может потребоваться несколько попыток чтения с разными форматами для того, чтобы обнаружить корректный формат. После того, как сформирован BPB и определен формат данного диска драйвер, поддерживающий устройство со сменным носителем (имеющий атрибут OCRM), обязан получить идентификатор тома данного диска. Найти его можно, обратившись к корневому директорию, как описано в главе 11.


Вкратце, последовательность обработки команды BUILD BPB следующая :


1. Драйвер должен прочитать блок начальной загрузки (обычно находящийся в первом логическом секторе диска - сектор #0) и проверить его на наличие блока параметров BIOS. Если BPB обнаружен, то переход к шагу 3, иначе переход к шагу 2.


2. Драйвер должен прочитать первый сектор FAT для того, чтобы получить байт описателя носителя. Полагаясь на этот MDB, драйвер должен сконструировать соответствующий BPB (см. главу 11 о соответствии между 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 при смене формата дискеты.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz