Стандартные драйверы дисковых функций 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-дисков) |
+ |
- |
- |
+ |
- |
¹ Только для фиксированных дисков.
Читать дальше