Стандартные драйверы дисковых функций BIOS (включая и расширенный сервис) имеют однозадачное происхождение. Во время выполнения функции значительное процессорное время может затрачиваться на ожидание завершения операции устройством. Драйверы многозадачного режима построены иначе: у них есть вызывающая часть, инициализирующая начало операции, и обработчик аппаратного прерывания от контроллера, сообщающий операционной системе о выполнении операции и результате.
Традиционный сервис BIOS
Традиционный дисковый сервис работает в 16-разрядном режиме процессора, все параметры вызова передаются через регистры процессора. Адрес сектора задается в системе CHS и размещен весьма специфично. Сервис вызывается программным прерыванием Int 13h, при вызове принимаются следующие соглашения:
♦ номер функции задается в регистре АНи не должен превышать 3Fh;
♦ логический номер диска задается в регистре DL(бит 7 = 0 — признак обращения к НГМД);
♦ номер цилиндра (0-1023) задается в регистре СН(младшие 8 бит) и CL[7:6](старшие 2 бита);
♦ номер головки (0-255) задается в регистре DH;
♦ номер начального сектора (1-63) задается в регистре CL[5:0];
♦ количество секторов , участвующих в операции, 8 бит — в регистре AL(0-255);
♦ указатель на начало буфера оперативной памяти для считываемых и записываемых данных (address of buffer) — в регистрах ЕS:BX;
♦ результат выполнения операции определяется по флагу переноса: СF= 0 — успешное выполнение операции, CF= 1 — обнаружены ошибки (код состояния возвращается в регистре АН, код завершения последней операции с дискетами хранится по адресу 40:41h, с жесткими дисками — 40:74h);
♦ таблица параметров диска для дискет (DPT) задана указателем в памяти по адресу 0:78h, для жестких дисков (HDPT) — 0:104h или 0:118h.
Список функций традиционного сервиса приведен в табл. 12.7, подробнее они описаны в [4, 9]. Устройства могут не поддерживать некоторые функции, о чем драйверы должны «честно сообщить» кодом возврата 01h.
Таблица 12.7. Функции традиционного дискового сервиса
| Номер функции АН |
Назначение параметров |
Использование регистров указателей и таблиц |
| DL |
DH, CL, CH |
AL |
ES: BX |
DPT/HDPT |
| 00h |
Reset Disk System — сброс дисковой системы (всех контроллеров и устройств), позиционирование на нулевой цилиндр |
- |
- |
- |
- |
- |
| 01h |
Read Status of Last Operation — чтение состояния последней операции |
+ |
- |
- |
- |
- |
| 02h |
Read Sectors into Memory — чтение секторов с диска в память |
+ |
+ |
+ |
+ |
+ |
| 03h |
Write Sectors from Memory — запись секторов из памяти на диск |
|
+ |
+ |
+ |
+ |
| 04h |
Verify Sectors — верификация секторов (холостое чтение без записи в память и проверка CRC/ECC) |
+ |
+ |
+ |
- |
+ |
| 05h |
Format Desired Track — форматирование трека |
+ |
+ |
+ |
+ |
+ |
| 08h |
Get Drive Parameters — получение параметров диска |
+³ |
+³ |
+³ |
- |
+³ |
| 09h¹ |
Initialize Drive Parameters — инициализация таблиц параметров диска |
+ |
- |
- |
- |
+ |
| 0Ah¹ |
Read Long — «длинное» чтение (сектор и поле ЕСС) |
+ |
+ |
+ |
+ |
+ |
| 0Bh¹ |
Write Long — «длинная» запись (сектор и поле ЕСС) |
+ |
+ |
+ |
+ |
+ |
| 0Ch¹ |
Seek — поиск цилиндра |
+ |
+ |
- |
- |
- |
| 0Dh¹ |
Alternative Disk Reset — альтернативный сброс (не затрагивая контроллера дискет) |
+ |
- |
- |
- |
- |
| 10h¹ |
Test Drive Ready — проверка готовности |
+ |
- |
- |
- |
- |
| 11h¹ |
Recalibrate — рекалибровка (позиционирование на нулевой цилиндр) |
+ |
- |
- |
- |
- |
| 14h¹ |
Controller Internal Diagnostics — диагностика контроллера жестких дисков |
- |
- |
- |
- |
- |
| 15h |
Read DASD Туре — получение типа диска: АН=0 — нет диска; АН=1 — дискета, без датчика смены диска; АН=2 — дискета, с датчиком смены диска; АН=3 — жесткий диск; иные значения — код ошибки. CX: DX содержат число 512-байтных секторов на диске |
+ |
- |
- |
- |
- |
| 16h² |
Diskette Change Line Status — проверка статуса смены дискеты: CF=0: АН=0 — смены носителя не было; CF=1: AH=1 — недопустимый номер диска; АН=6 — была смена диска или определение смены не поддерживается; AH=80h — дисковод не готов или не установлен; иные значения — код ошибки |
+ |
- |
- |
- |
- |
| 17h² |
Set Diskette Type for Format — установка типа дискеты для форматирования (перед форматированием) |
+ |
|
+³ |
|
|
| 18h² |
Set Media Type for Format — установка типа носителя (для форматирования) |
+ |
+³ |
- |
- |
- |
| 20h² |
Get Media Type — получение типа установленного носителя |
+ |
- |
- |
- |
- |
| 24h¹ |
Set Multiple Mode — установка параметров режима многосекторного обращения (в AL — число секторов за операцию) |
+ |
- |
+ |
- |
- |
| 25h¹ |
Identify Drive ATA — идентификация накопителя (только для ATA-дисков) |
+ |
- |
- |
+ |
- |
¹ Только для фиксированных дисков.
Читать дальше