пользующими сменный носитель информации : носитель (например,
гибкий диск) может быть заменен. При замене дискеты или ее экви-
валента формат новой дискеты может отличаться от предыдущего, а
уж содержимое новой дискеты несомненно будет другим.
При замене дискеты MS-DOS должна настроиться на новую структу-
ру диска : размер сектора, количество секторов и т.п. MS-DOS хра-
нит формат текущего диска в BPB и при смене носителя MS-DOS по-
требуется копия нового BPB.
Даже если дискета заменена на имеющую тот же формат, MS-DOS
должна знать о том, что замена диска произошла. Каждый раз при
смене носителя директории и файлы новой дискеты наверняка будут
отличаться от содержимого предыдущей дискеты, и MS-DOS должна бу-
дет решать: что делать с теми данными, которые хранятся в буфе-
рах, подготовленных для записи на предыдущий носитель.
Для разрешения всех этих вопросов MS-DOS выдает драйверу ко-
манду MEDIA CHECK, спрашивая его о том, был ли заменен носитель.
Драйвер должен вернуть на этот вопрос один из трех ответов: "Да"
(состояние носителя -1), "Нет" (состояние носителя 1) или "Не
знаю" (состояние носителя 0).
Важность этого вопроса отражается в том действии, которое
MS-DOS предпринимает при получении ответа на него. Если драйвер
- 6-33 -
отвечает "Нет, носитель НЕ БЫЛ заменен", MS-DOS продолжает рабо-
тать так, как и планировала, не проверяя, изменилось содержимое
дискеты или нет. Если драйвер отвечает "Да, носитель БЫЛ изме-
нен", MS-DOS "выбрасывает" все хранящиеся в буферах данные и за-
прашивает у драйвера параметры нового носителя. Наконец, если
драйвер отвечает что он сам не знает - была замена или нет,
MS-DOS берет решение на себя. Если есть какие-либо данные, подго-
товленные для записи на диск, MS-DOS делает предположение о том,
что это тот же самый диск. В противном случае она делает предпо-
ложение о том, что произошла смена диска и продолжает работать
так, как если бы драйвер вернул ответ "Носитель БЫЛ изменен".
Для оказания помощи драйверу в решении вопроса о смене носите-
ля MS-DOS передает драйверу текущий Media Descriptor Byte (байт
описателя носителя), сокращенно MDB. Этот байт входит в группу
параметров, называемую BPB (блок параметров BIOS), которая возв-
ращается MS-DOS командами драйвера INIT и BUILD BPB. Каждому уни-
кальному формату диска должен соответствовать свой описатель, хо-
тя это и не всегда возможно (в разделе, описывающем команду BUILD
BPB, этот вопрос обсуждается более подробно).
Описатель носителя хранится в первом байте, находящемся на
диске FAT (таблицы размещения файлов). Кроме того, младший байт
значения типа диска (см. табл.11.5) представляет собой не что
иное, как MDB. Подробнее о FAT и типах дисков Вы можете узнать,
прочитав 11 главу.
При решении вопроса о том, была ли замена носителя, драйвер
может использовать следующую логику :
1. Если устройство не поддерживает возможность смены носителя
(например, если это жесткий диск или RAM-диск), то драйвер
должен ответить "Нет, замены носителя не было". В противном
случае переход к шагу 2.
2. Фирма Microsoft утверждает, что на замену дискеты требуется
не менее двух секунд. Принимая этот факт во внимание, драй-
вер должен проверить системные часы и, если с момента преды-
дущего обращения к диску прошло менее двух секунд, вернуть
ответ "Нет, замены носителя не было". Конечно, этот метод
требует,чтобы драйвер всегда сохранял время обращения к дис-
ку. Если прошло более двух секунд, то переход к шагу 3. Оче-
видно, что если нет возможности считывать системное время,
то данный шаг можно опустить.
3. Иногда сам дисковод может иметь возможность информирования
драйвера о происшедшей замене носителя. Некоторые дисководы
оборудованы электронной схемой, подающей сигнал, если дверца
дисковода открывалась с момента последнего обращения к дис-
ку. Если драйвер обслуживает именно такой дисковод и послед-
ний сообщает, что дверца не открывалась, то драйвер должен
ответить "Нет, замены носителя не было". Если дверца была
открыта, то переход к шагу 4.
Бывают дисководы, в которых двигатели включаются только
при обращении к дискете и выключаются, выдержав некоторый
временной интервал. Если такой дисковод позволяет считывать
состояние двигателя и двигатель еще работает с момента пос-
леднего обращения, то это позволяет сделать вывод о том, что
дискета не заменялась и драйвер должен ответить "Нет, замены
носителя не было". Однако, встречаются дисководы, двигатели
которых включаются в тот момент, когда вставляется дискета,
что может сделать результаты данной проверки некорректными.
- 6-34 -
4. Драйвер должен прочесть с диска описатель носителя. Если
этот MDB отличается от переданного драйверу при вызове ко-
манды MEDIA CHECK описателя, то драйвер должен ответить
"Да, была замена носителя". В противном случае переход к ша-
гу 5.
5. Драйвер должен прочесть с диска идентификатор тома. Если он
отличается от того, который хранится драйвером с момента
последней команды BUILD BPB, то драйвер должен ответить "Да,
была замена носителя". Иначе переход к шагу 6.
6. Драйвер должен ответить "Не знаю, была ли замена носителя".
Может случиться так, что невозможно реализовать некоторые эта-
пы описанного алгоритма. Если по каким-либо причинам Вы не можете
определить, произошла ли замена дискеты, то лучшим ответом будет
"Не знаю, была ли замена носителя". Конкретный метод определения
замены носителя будет зависеть как от особенностей дисковода, так
и от квалификации программиста.
Если драйвер работает с MS-DOS версии 3.0 или выше, то команда
MEDIA CHECK может вернуть еще некоторую информацию. В том случае,
когда драйвер поддерживает команды OPEN/CLOSE/REMOVABLE MEDIA
(установлен бит 11 в слове атрибутов драйвера) и команда MEDIA
CHECK собирается ответить "Да, была замена носителя" (состояние
носителя : -1), тогда драйвер обязан вернуть указатель на имя то-
ма предыдущего диска (см. главу 11 для получения сведений о фор-
мате и расположении имени тома). Если драйвер не знает имя тома
предыдущего диска (например, если обращение к команде MEDIA CHECK
Команда BUILD BPB
ЙНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН»
є Команда BUILD BIOS PARAMETER BLOCK (2) є
є є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ є
є +00 : 22 Длина ¦ X ¦ Блок. драйверы є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ є
є +01 : номер # Устройство ЪДДД¬ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ¦ ¦ Симв. драйверы є
є +02 : 02 Команда АДДДЩ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД є
є +03 : Статус є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЧТЕНИЕ ЗАПИСЬ є
є Зарезервировано є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ЪДДД¬ ДДДДД ЪДДД¬ ДДДД є
є +13 : Описатель носителя ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДД є
є +14 : Указатель на FAT ¦ X ¦ ¦ ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД ГДДДґ ДДДДД ГДДДґ ДДДД є
є +18 : Указатель на BPB ¦ ¦ ¦ X ¦ є
є ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД АДДДЩ ДДДДД АДДДЩ ДДДД є
є є
є Поле по смещению 14 от начала блока запроса содержит указатель нає
є FAT для IBM-стандартных устройств (бит 13 в слове атрибутов равенє
є нулю) или указатель на "мусор" для NONIBM/NONFAT устройств (битє
є 13 слова атрибутов равен 1). є
ИННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННј
- 6-35 -
происходит впервые), то драйвер должен вернуть указатель на стро-
ку "NO NAME" оканчивающуюся нулевым байтом (т.е. "NO", пробел,
"NAME", четыре пробела, ноль).
Команда BUILD BPB (построить блок параметров BIOS) всегда вы-
полняется блоковыми драйверами и никогда не используется для
драйверов символьных устройств. Во всех случаях, когда MS-DOS
проинформирована или решила сама, что носитель заменен, она долж-
на получить параметры нового носителя. Выдавая команду BUILD BPB,
MS-DOS просит драйвер вернуть указатель на блок параметров BIOS,
содержащий новые значения (содержимое полей BPB показано на
рис.6-6).
Существует важное различие между адресом BPB, возвращаемым ко-
мандой BUILD BPB и указателем таблицы BPB, возвращаемым командой
INIT. В то время, как команда BUILD BPB возвращает указатель на
сам блок параметров BIOS, команда INIT возвращает адрес таблицы
указателей на BPB. Хотя различие между указателем и указателем на
указатели очевидно, оно может быть источником ошибок.
Подобно команде MEDIA CHECK, команда BUILD BPB может иметь де-
ло с идентификатором тома. В MS-DOS версии 3.0 и выше драйверы,
поддерживающие возможность замены носителя и имеющие атрибут OCRM
(бит 11 слова атрибутов равен 1), должны считывать и сохранять
имя тома. Это имя позже будет возвращаться последующими обращени-
ями к команде MEDIA CHECK.
Получение команды BUILD BPB может восприниматься драйвером как
заявление системы о том, что по ее мнению произошла замена носи-
теля. Если драйвер поддерживает счетчик количества "открываний" и
"закрываний", выполненных для устройства командами OPEN DEVICE и
CLOSE DEVICE, то пришла пора обнулить его.
Получение блока параметров BIOS
Не рассматривая механизма возврата BPB, мы должны решить за-
дачу определения содержимого блока параметров BIOS. Описываемые
методы применимы не только к команде BUILD BPB, но и к команде
INIT. В простейшем случае драйвера устройства, поддерживающего
только один тип носителя (например драйвер RAM-диска), содержимое