Главная » Ассемблер, Железо » Прерывания BIOS для работы с дисками на низком уровне

0

Функции BIOS были разработаны для дисков старого типа, использовавших режим адресации цилиндр-головка-сектор (CHS),

а современные жесткие диски работают в режиме линейной адресации (LBA). Хотя у современных дисков есть механизм эмуляции режима CHS, использование этого механизма нежелательно — большая часть дискового пространства может оказаться недоступной для работы из-за ограничений, накладываемых на число цилиндров и секторов диска форматом параметров функций BIOS.

Прерывания BIOS нужны программисту в тех случаях, когда невозможно использовать функции DOS: для работы с гибкими дисками нестандартного формата и для восстановления поврежденной файловой структуры или стертых файлов. В отличие от DOS, функции BIOS предназначены для работы с физическими дисками, а не с их разделами (логическими дисками) — не забудьте об этом, задавая номер диска.

Для вызова дисковых функций BIOS используется прерывание Int 13h. После выполнения операции:

•       в случае успешного завершения флаг переноса CF сбрасывается, в регистр АН заносится значение 0;

•       в случае неудачи флаг CF устанавливается, а в регистр АН заносится код состояния дисковода, возможные значения которого приведены в табл. 6.11.

ПРИМЕЧАНИЕ

При выполнении операций с гибкими дисками ошибки могут возникать из- за того, что в момент обращения к диску мотор дисковода выключен либо не успел разогнаться до номинальной скорости (функции BIOS не имеют встроенного контроля скорости вращения диска). Операции чтения, записи, поиска и форматирования для гибкого диска в случае ошибки следует повторить трижды, каждый раз выполняя сброс. Если ошибка не устранена, то нужно выдать пользователю предупреждение и прервать выполнение операции.

Таблица 6.11. Значения кодов состояния дисковода


Код

Состояние дисковода

 

00h

Успешное завершение операции, ошибок нет

 

01 h

Недопустимый номер функции или параметр

 

02h

Не найден адресный маркер

 

03h

Диск защищен от записи’

 

04h

Сектор не найден

 

05h

Сброс в исходное состояние не выполнен2

 

06h-

Произошла смена диска’

 

Код

Состояние дисковода

07h

Повреждена таблица параметров дисковода2

08h

Выход за границу ПДП1

09h

Попытка выполнить ПДП через границу 64 Кбайт

OAh

Обнаружен дефектный сектор2

OBh

Обнаружена дефектная дорожка2

OCh

Нестандартный формат носителя или дорожки

ODh

В команде форматирования задано недопустимое число секторов

OEh

Обнаружена адресная метка контрольных данных2

OFh

Уровень арбитража ПДП вышел из диапазона2

10h

Неисправимая ошибка при чтении (по контрольному коду ЕСС

 

или CRC)

11 h

Ошибка данных, исправленная по контрольному коду2

20h

Отказ контроллера

40h

Сбой при выполнении поиска

80h

Диск не отвечает (тайм-аут)

Aah

Дисковод не готов2

BBh

Неизвестная ошибка2

CCh

Ошибка при записи2

EOh

Ошибка регистра состояния2

FFh

Ошибка при выполнении операции опознавания2

Индекс 1 в таблице означает, что код относится только к гибким дискам; индекс 2 — только к жестким дискам.

Прерывание Int 13h, функция OOh: сброс дисковой системы

Функция предназначена для выполнения сброса (перевода в исходное состояние) контроллера диска и подключенных к нему дисководов. Ее необходимо вызывать после сбоев при выполнении операций чтения, записи, верификации или форматирования на гибком диске — перед повторением операции.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•            в АН — значение OOh;

•       DL — номер дисковода (00h-7Fh — гибкий диск, 80h-FFh — жесткий диск).

После завершения операции функция возвращает в регистре АН состояние дисковой системы.

ПРИМЕЧАНИЕ

При установленном бите 7 регистра DL выполняется общий сброс всех гибких и жестких дисков.

Прерывание Int 13h, функция 01 h: определить текущее состояние дисковой системы

Функция возвращает код завершения последней операции, выполненной на указанном дисководе.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•            в АН — значение Olh;

•       в DL — номер дисковода (0Qh-7Fh — гибкий диск, 80h—FFh — жесткий диск).

После завершения операции функция возвращает в регистре АН состояние дисковой системы.

Прерывание Int 13h, функция 02h: читать сектор

Функция выполняет операцию считывания в заданную область оперативной памяти информации из одного или нескольких секторов диска.

ПРИМЕЧАНИЕ

При использовании жестких дисков старшие два бита 10-разрядного номера цилиндра помещаются в старшие два бита регистра CL.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•            в АН — значение 02h;

•            в AL — число считываемых секторов (должно быть больше 0);

[1]в СН — номер цилиндра;

•           в CL — номер начального сектора;

•           в DH — номер головки;

•       в DL — номер дисковода (00h-7Fh — гибкий диск, 80h-FFh — жесткий диск);

•       в ES ВХ — указатель на адрес буфера, в который производится считывание информации.

После завершения операции функция возвращает в регистре АН состояние дисковой системы. В случае успешного завершения операции будет возвращена следующая информация:

•           в AL — число прочитанных секторов;

•           в буфере — прочитанная с диска информация.

Прерывание Int 13h, функция 03h: записать сектор

Функция переписывает данные из заданной области оперативной памяти в один или несколько указанных секторов диска. Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 03h;

•           в AL — число записываемых секторов (должно быть больше 0);

•            в СН — номер цилиндра;

•           в CL — номер начального сектора;

•           в DH — номер головки;

•       в DL — номер дисковода (00h-7Fh — гибкий диск, BOh-FFh — жесткий диск);

•       в ES • ВХ — указатель на адрес буфера, из которого производится считывание информации.

ПРИМЕЧАНИЕ

При использовании жестких дисков старшие два бита 10-разрядного номера цилиндра помещаются в старшие два бита регистра CL.

После завершения операции функция возвращает в регистре АН состояние дисковой системы. В случае успешного завершения операции в AL будет находиться число записанных секторов.

Прерывание Int 13h, функция 04h: проверить правильность записи

Функция предназначена для контроля правильности выполнения записи данных на диск путем считывания данных и проверки контрольного кода CRC.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 04h;

•           в AL — число проверяемых секторов (должно быть больше 0);

•           в СН — номер цилиндра;

•           в CL — номер начального сектора;

•           в DH — номер головки;

•       в DL — номер дисковода (00h-7Fh — гибкий диск, 80h-FFh — жесткий диск);

•       в ES: ВХ — указатель на адрес буфера, в который производится считывание информации.

ПРИМЕЧАНИЕ

При использовании жестких дисков старшие два бита 10-разрядного номера цилиндра помещаются в старшие два бита регистра CL.

После завершения операции функция возвращает в регистре АН состояние дисковой системы, а в регистре AL — число проверенных секторов.

Прерывание Int 13h, функция 05h: форматировать дорожку гибкого диска

Функция предназначена для форматирования дорожек, то есть подготовки поверхности диска к выполнению операций чтения/записи данных.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 05h;

•           в СН — номер цилиндра (дорожки);

•           в DH — номер головки;

•           в DL — номер дисковода (00h-7Fh);

• в ES: ВХ — указатель на адрес буфера, в котором содержится список адресных полей. Список состоит из 4-байтных элементов (формат которых описан в табл. 6.12) — по одному элементу на каждый создаваемый сектор. После завершения операции функция возвращает в регистре АН состояние дисковой системы.

ВНИМАНИЕ

Нельзя применять функцию форматирования при работе с жесткими дисками: она устарела, и ее использование может либо привести к повреждению поверхности диска (часть дорожек станет нечитаемой), либо вообще полностью вывести диск из строя.

Таблица 6.12. Формат элемента списка адресных полей

Смещение

Размер

Описание

OOh

BYTE

Номер дорожки

01 h

BYTE

Номер головки

02h

BYTE

Номер сектора

03h

BYTE

Размер сектора (байт):

 

 

0—128;

 

 

1 – 256;

 

 

2-512;

 

 

3—1024

Прерывание Int 13h, функция 08h: получить параметры дисковода

Функция предназначена для определения параметров дисководов. Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 08h;

•       в DL — номер дисковода (00h-7Fh — гибкий диск, 80h-FFh — жесткий диск).

После завершения операции функция возвращает в регистре АН состояние дисковой системы.

В случае успешного завершения операции функция возвращает в регистрах следующую информацию:

•       в BL — код типа дисковода (код выдается только для гибких дисков, возможные значения кода описаны в табл. 6.13);

•             в СН — младшие 8 разрядов максимального номера цилиндра;

•       в CL — максимальный номер сектора (разряды 0-5) и два старших бита максимального номера цилиндра (разряды 6-7);

•             в DH — максимальный номер головки;

•             в DL — общее число дисководов в системе;

•       в ES: DI — указатель на таблицу параметров гибкого диска (выдается только для гибких дисков).

Таблица 6.13. Значения кодов типа дисковода

Код

Тип дисковода

1

5,25", 360 Кбайт, 40 дорожек

2

5,25", 1,2 Мбайт, 80 дорожек

3

3,5", 720 Кбайт, 80 дорожек

4

3,5", 1,44 Мбайт, 80 дорожек

Прерывание Int 13h, функция ODh: i сброс контроллера жесткого диска

Функция выполняет инициализацию контроллера жесткого диска, не затрагивая (в отличие от функции OOh) контроллер гибких дисков. Головки заданного дисковода перемещаются при этом на нулевую дорожку.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•             в АН — значение ODh;

•             в DL — номер жесткого диска (80h-FFh).

После завершения операции функция возвращает в регистре АН состояние дисковой системы.

Вызывать данную функцию следует при возникновении ошибок в работе контроллера (см. табл. 6.11 кодов состояния системы).

Прерывание Int 13h, функция 10h: проверить готовность жесткого диска к работе

Функция определяет готовность диска к выполнению операций ввода-вывода.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 10h;

•           в DL — номер жесткого диска (80h-FFh).

После завершения операции функция возвращает в регистре АН состояние дисковой системы.

Прерывание Int 13h, функция 11 h: рекалибровка жесткого диска

Функция выполняет перемещение головок заданного дисковода на нулевую дорожку.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение llh;

•           в DL — номер жесткого диска (80h-FFh).

После завершения операции функция возвращает в регистре АН состояние дисковой системы.

Вызывать данную функцию следует в случае возникновении сбоев в работе диска (см. табл. 6.11).

Прерывание Int 13h, функция 16h: проконтролировать смену гибкого диска

Функция предназначена для обеспечения целостности данных на диске, то есть для защиты прикладной программы от внезапной смены пользователем гибкого диска. В дисковых дупликаторах (специальных программах, предназначенных для копирования гибких дисков) и инсталляторах (программах, обеспечивающих установку на компьютер прикладных пакетов) данная функция, наоборот, обеспечивает замену уже использованного гибкого диска на следующий. Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 16h;

•           в DL — номер дисковода гибких дисков (00h-7Fh).

После завершения операции функция возвращает в регистре АН результат проверки (значение 0 — диск не менялся, значение 06h — диск был заменен).

Прерывание Int 13h, функция 18h: установить тип носителя для форматирования

Функция позволяет установить основные параметры, используемые при форматировании диска. Эту функцию необходимо вызвать перед началом работы с функцией 05h, чтобы система BIOS могла установить корректное значение скорости передачи данных для используемого дисковода.

Перед вызовом прерывания требуется записать в регистры следующие значения:

•           в АН — значение 18h;

•           в СН — число цилиндров;

•           в CL — число секторов на дорожке;

•           в 0L — номер дисковода (00h-7Fh).

После завершения операции функция возвращает в регистре АН состояние дисковой системы.

В случае успешного завершения операции функция возвращает в ES:DI указатель на таблицу параметров гибкого диска.

Векторы параметров дисководов

Несколько ячеек в таблице векторов прерываний хранят указатели на таблицы параметров дисководов (вместо адресов процедур обработки прерываний). Вектор lEh (то есть 32-разрядное слово, расположенное в оперативной памяти по адресу 0000:0078h) хранит таблицу параметров гибких дисков для дисковода (табл. 6.14). Векторы 41h (адрес 0000:0104h) и 46h (адрес 0000:0124h> хранят таблицы параметров жестких дисков (для диска 0 и диска 1 соответственно), формат которых показан в табл. 6.15.

Таблица 6.14. Формат таблицы параметров гибких дисков


Смещение

Размер

Описание

 

OOh

BYTE

Первый байт спецификации:

 

 

 

биты 0-3 — время разгрузки головок;

 

 

 

биты 4-7 — длительность шага головок

 

01 h

BYTE

Второй байт спецификации:

 

 

 

бит 0 — флаг режима ПДП;

 

 

 

биты 1-7 — время загрузки головок

 

Смещение

Размер

Описание

02h

BYTE

Задержка перед выключением мотора (в «тиках» системных часов)

03 h

BYTE

Размер сектора (байт): 0—128; 1 – 256;

2-                   512;

3—                  1024

04h

BYTE

Число секторов на дорожке

05h

BYTE

Длина межсекторного промежутка для операций чтения и записи

06h

BYTE

Длина области данных

07h

BYTE

Длина межсекторного промежутка для операции форматирования

08 h

BYTE

Байт-заполнитель для форматирования

09 h

BYTE

Время установки головок в миллисекундах

OAh

BYTE

Время запуска мотора в 1/8 с

Таблица 6.15. формат таблицы параметров жесткого диска

Смещение

Размер

Описание

OOh

WORD

Число цилиндров

02 h

BYTE

Число головок

03h

WORD

Не используется(всегда 0)

05h

WORD

Номер начального цилиндра предкомпенсации

07h

BYTE

Максимальная длина блока коррекции ошибок ЕСС

08 h

BYTE

Байт контроля:

биты 0-2 — не используются (всегда 0);

бит 3 — установлен, если число головок больше 8;

бит 4 — не используется (всегда 0);

бит 5 — установлен, если изготовитель разместил

карту дефектов на цилиндре с номером

«максимальный рабочий цилиндр + 1»;

бит 6 — запрет повторного контроля ЕСС;

бит 7 — запрет контроля ЕСС

09h

BYTE

Не используется (всегда 0)

OAh

BYTE

Не используется (всегда 0)

OBh

BYTE

Не используется (всегда 0)

OCh

WORD

Номер цилиндра зоны парковки

OEh

BYTE

Число секторов на дорожке

OFh

BYTE

Зарезервировано

ВНИМАНИЕ

Значения в этих таблицах устанавливаются функциями BIOS в процессе работы. Во избежание сбоев в работе компьютера не рекомендуется что- либо изменять в них непосредственно. Информацию из таблиц можно только читать, причем для современных жестких дисков эта информация вообще бесполезна (они работают в режиме линейной адресации секторов).

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии