BPB может быть закодировано в теле самого драйвера. К несчастью,
при работе с реальными дисками, включая жесткие диски, не все так
просто и драйвер обязан определять содержимое BPB.
Как правило, BPB является частью блока начальной загрузки, как
показано на рис.6-7. В этом случае драйвер должен найти и прочи-
тать этот блок, выбрать оттуда блок параметров BIOS и возвратить
адрес последнего. Практически во всех случаях блок начальной заг-
рузки располагается в самом первом логическом секторе диска (т.е.
сектора, имеющего номер 0). Преобразование номера логического
сектора в координаты физического сектора зависит от характеристик
устройства и должно быть описано в документации по этому устройс-
тву. Драйвер должен проверить структуру этого сектора, чтобы убе-
диться, что он действительно содержит блок начальной загрузки.
Если первый логический сектор не содержит корректного блока
начальной загрузки, например, как в дисках, отформатированных в
MS-DOS версий до 2.0,то драйвер должен считать первый сектор таб-
лицы размещения файлов (FAT). К счастью, MS-DOS версий до 2.0
поддерживали только несколько форматов, каждый из которых опреде-
лялся в первом секторе FAT второго логического сектора диска. Са-
мый первый байт первого сектора FAT содержит байт описателя но-
- 6-36 -
СМЕЩЕНИЕ СОДЕРЖАНИЕ РАЗМЕР
(hex)
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД·
+00 ¦ Команда перехода на код загрузчика є 3 байта
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
+03 ¦ Имя и версия изготовителя є 8 байт
ЦД ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +0B ¦ Размер сектора в байтах є Слово
є ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +0D ¦ Количество секторов в кластере є Байт
є ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +0E ¦ Количество зарезервированных секторов є Слово
БЛОК є ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +10 ¦ Количество таблиц FAT є Байт
ПАРАМЕТРОВ Д¶ ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +11 ¦ Количество элементов директория є Слово
BIOS є ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +13 ¦ Количество логических секторов є Слово
є ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +15 ¦ Описатель носителя є Байт
є ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
є +16 ¦ Количество секторов в одной FAT є Слово
УД ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
+18 ¦ Количество секторов на дорожке є Слово
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
+1A ¦ Количество головок чтения/записи є Слово
ГДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¶
+1C ¦ Количество скрытых секторов є Слово
ФНННННННННННННННННННННННННННННННННННННННј
Рисунок 6-7. Содержимое первых 30 байт блока начальной загрузки
сителя, который можно использовать для определения соответству-
ющего содержимого BPB, возвращаемого к MS-DOS. Версии MS-DOS
до 2.0 используют описатели 0FEH и 0FFH. В главе 11 представлен
список различных значений типов дисков, из которых берется MDB.
Выполняя этот процесс, Вам следует помнить, что просто чтение
диска не может гарантировать правильных результатов. Если уст-
ройство и драйвер поддерживают несколько форматов (например, с
различными размерами сектора), то драйверу может потребоваться
несколько попыток чтения с разными форматами для того, чтобы об-
наружить корректный формат. После того, как сформирован BPB и оп-
ределен формат данного диска драйвер, поддерживающий устройство
со сменным носителем (имеющий атрибут OCRM), обязан получить
идентификатор тома данного диска. Найти его можно, обратившись к
корневому директорию, как описано в главе 11.
Вкратце, последовательность обработки команды BUILD BPB следу-
ющая :
1. Драйвер должен прочитать блок начальной загрузки (обычно на-
ходящийся в первом логическом секторе диска - сектор #0) и
проверить его на наличие блока параметров BIOS. Если BPB об-
наружен, то переход к шагу 3, иначе переход к шагу 2.
2. Драйвер должен прочитать первый сектор FAT для того, чтобы
получить байт описателя носителя. Полагаясь на этот MDB,
- 6-37 -
драйвер должен сконструировать соответствующий 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 при смене формата дискеты.
Команды INPUT, OUTPUT и OUTPUT & VERIFY (команды 4, 8 и 9 -
"Ввод", "Вывод" и "Вывод с проверкой", соответственно) всегда
требуются для всех драйверов. При помощи этих команд выполняется
передача данных между MS-DOS и устройством.
Команды IOCTL INPUT и IOCTL OUTPUT (коды 3 и 12 - "Ввод команд
управления" и "Вывод команд управления", соответственно) являются
дополнительными, требующимися только при установленном IOCTL ат-
рибуте (бит 14 слова атрибутов драйвера). Эти команды применяются
как с блоковыми так и с символьными драйверами и обеспечивают пе-
редачу данных между MS-DOS и драйвером.
Команда OUTPUT UNTIL BUSY (код 16 - "Вывод пока не занято")
является необязательной командой и используется исключительно для
символьных драйверов, имеющих атрибут NONIBM/OTB (бит 13). Эта
команда обеспечивает передачу данных от MS-DOS к устройству. За-
метьте также, что эта команда не документирована в IBM Technical
Reference Manual для PC-DOS версии 3.30.
Команды OUTPUT и OUTPUT & VERIFY устанавливаются комбинацией
пятого бита IOCTL (бит 5 - подготовленный/неподготовленный режим)
и опцией VERIFY. Если установлен режим проверки, то весь вывод
данных обеспечивается командой OUTPUT & VERIFY. Если режим провер-
ки не установлен, то используется обычная команда OUTPUT. Перевод
драйвера в неподготовленный режим (при установке IOCTL бита 5)
позволяет осуществлять многобайтные передачи.
Существует комбинация режимов, которая должна была бы вызвать
использование команды OUTPUT UNTIL BUSY, но не делает этого. Эта
комбинация включает режим без проверки (так что команда OUTPUT &
- 6-38 -
Команды INPUT и OUTPUT
~~~~~~~~~~~~~~~~~~~~~~~~
ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
є є
є Команды INPUT и OUTPUT (3,4,8,9,12,16) є
є є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ є
є +00 : 22 Длина ¦ X ¦ Блок. драйверы є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ є
є +01 : номер # Устройство ЪДДД¬ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ¦ X ¦ Симв. драйверы є
є +02 : команда Команда АДДДЩ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД є
є +03 : Статус ЪДДДДДДДДДДДДДДДДДДДДДДДДДД¬є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ¦ Команды : ¦є
є Зарезервировано ¦ ¦є
є ¦ 03 : IOCTL INPUT ¦є
є ¦ 04 : INPUT ¦є
є ¦ 08 : OUTPUT ¦є
є ¦ 09 : OUTPUT & VERIFY ¦є
є ¦ 12 : IOCTL OUTPUT ¦є
є ¦ 16 : OUTPUT UNTIL BUSY ¦є
є АДДДДДДДДДДДДДДДДДДДДДДДДДДЩє
є є
є ЧТЕНИЕ ЗАПИСЬ є
є є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ ДДДДД ЪДДД¬ ДДДДДє
є +13 : Описатель носителя ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
є +14 : Адрес буфера ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
є +18 : Количество байтов/секторов ¦ X ¦ ¦ X ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
є +20 : Начальный сектор ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДДДє
є +22 : Указатель на имя тома ¦ ¦ ¦ X ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ ДДДДД АДДДЩ ДДДДДє