____ ______________________________________________________________________
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. Описываемые методы применимы не только к команде BUILDBPB, но и к команде 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), обязан получить идентификатор тома данного диска. Найти его можно, обратившись к корневому директорию.
Вкратце, последовательность обработки команды BUILDBPB следующая :
1. Драйвер должен прочитать блок начальной загрузки (обычно на-
ходящийся в первом логическом секторе диска - сектор #0) и
проверить его на наличие блока параметров BIOS. Если BPB об-
наружен, то переход к шагу 3, иначе переход к шагу 2.
2. Драйвер должен прочитать первый сектор FAT для того, чтобы
получить байт описателя носителя. Полагаясь на этот MDB,
драйвер должен сконструировать соответствующий BPB.
3. Если устройство поддерживает замену носителя (установлен бит
11 слова атрибутов), драйвер должен получить из корневого
директория идентификатор тома и сохранить его.
Для выполнения этого алгоритма, драйвер должен иметь буфера
для хранения копии BPB и имени тома, а также буфер, предназначен-