Для обеспечения поддержки новых возможностей устройств внешней памяти (> 2,2 Тб) в набор функций Int 13h были введены дополнительные функции (BIOS Extensions). Дополнительные функции имеют номера 41h - 49h и 4Eh. Порядок работы с этими функциями существенно отличается от принятого для стандартных функций прерывания Int 13h :
• вся адресная информация передается через буфер в оперативной памяти, а не через регистры;
• соглашения об использовании регистров изменены (для обеспечения передачи новых структур данных);
• для определения дополнительных возможностей аппаратуры (параметров) используются флаги.
Фундаментальной структурой данных для дополнительных функций прерывания Int I3h является так называемый «Пакет дискового адреса» (Disk Address Packet). Получив пакет дискового адреса, прерывание Int 13h преобразует содержащиеся в нем данные в физические параметры, соответствующие используемому носителю информации. Формат пакета дискового адреса описан в табл. 1.
Таблица 1. Формат пакета дискового адреса
Смещение |
Размер поля |
Назначение поля |
00h |
BYTE |
Размер пакета в байтах |
01h |
BYTE |
Зарезервировано (имеет значение 0) |
02h |
BYTE |
Число передаваемых блоков (0-7Fh) или признак передачи большого массива данных (FFh) |
03h |
BYTE |
Зарезервировано (имеет значение 0) |
04h |
DWORD |
Адрес буфера данных в оперативной памяти в режиме «сегмент:смещение» или признак линейной адресации памяти (FFFF: FFFFh) |
08h |
QWORD |
Абсолютный номер начального блока (LBA-адрес) данных на диске |
10h |
QWORD |
64-разрядный линейный адрес буфера передачи |
18h |
DWORD |
Число передаваемых блоков при передаче большого массива данных |
1Ch |
DWORD |
Зарезервировано (имеет значение 0) |
Рассмотрим назначение отдельных полей пакета дискового адреса более подробно. Байт со смещением 00h содержит размер пакета дискового адреса в байтах. Размер должен составлять 16 и более байт: если значение данного поля меньше 16, то функция завершается аварийно (устанавливается CF = 1, АН = 01h). Байт со смещением 01h зарезервирован для последующих версий стандарта и должен содержать значение 0.
Байт со смещением 02h содержит число блоков (секторов) данных, подлежащих передаче. Значение числа передаваемых блоков не должно превышать 127 (7Fh), в противном случае функция завершается аварийно (устанавливается CF = 1, АН = 01h).
Если поле содержит значение 0, то при выполнении функции передача данных не производится. Если поле содержит значение FFh, то используется 64-разрядная адресация данных: адрес буфера задается не двойным словом со смещением 04h, а квадрасловом со смещением 10h; число передаваемых блоков задается двойным словом со смещением 18h. Байт со смещением 03h зарезервирован для последующих версий стандарта и должен содержать значение 0. Двойное слово со смещением 04h содержит адрес буфера в оперативной памяти, который используется при работе с диском. Адрес должен быть представлен в формате «сегмент/смещение», то есть буфер должен находиться в пределах первого мегабайта адресного пространства процессора. Если данное поле содержит значение FFFF: FFFFh, то для обращения к буферу применяется линейный адрес, который задается квадрасловом со смещением 10h. Квадраслово со смещением 08h содержит абсолютный 64-разрядный номер начального блока (LBA-адрес) данных на диске. Если устройство поддерживает режим LBA, то данный адрес передается ему непосредственно, без каких-либо модификаций. Если устройство не может работать в режиме LBA, то производится преобразование линейного адреса в формат CHS. Все перечисленные поля пакета дискового адреса присутствуют в стандарте с момента появления его первой версии. В новых версиях размер пакета был увеличен вдвое (32 байта вместо 16), так как возникла необходимость в поддержке 64-разрядной адресации данных, которая будет применяться в компьютерах с новыми (64-разрядными) моделями процессоров. Квадраслово со смещением 10h содержит 64-разрядный линейный адрес буфера передачи, то есть буфера в оперативной памяти, который используется при выполнении операций записи и считывания. Данное поле имеет значение только в том случае, если байт со смещением 02h содержит значение FFh или двойное слово со смещением 04h содержит значение FFFF: FFFFh. Двойное слово со смещением 18h задает число передаваемых блоков, но используется только в том случае, если байт со смещением 02h содержит значение FFh. Двойное слово со смещением ICh зарезервировано для последующих версий стандарта (должно содержать значение 0).
При вызове прерывания дополнительным функциям BIOS передаются через регистры процессора следующие данные:
• в АН — номер вызываемой функции;
• в DL — номер диска;
• в DS: SI — адрес буфера, содержащего пакет дискового адреса. Передача остальных параметров, как было уже указано выше, производится через пакет дискового адреса.
Дополнительные функции BIOS предназначены только для жестких дисков и дисководов сменных дисков большой емкости, причем функции рассчитаны на использование не более четырех устройств. Передаваемый функции номер диска, таким образом, должен находиться в диапазоне 80h-83h.
После выполнения функции в регистре АН выдается код состояния (статус возврата). Кроме принятого для классических функций BIOS стандартного набора кодов возврата, для дополнительных функций введено еще несколько кодов (табл. 2).
Таблица 2. Стандартные коды состояния (для жестких дисков)
Код |
Состояние дисковода |
|
00h |
Успешное завершение операции, ошибок нет |
|
01h |
Недопустимый номер функции или параметр |
|
02h |
Не найден адресный маркер |
|
04h |
Сектор не найден |
|
05h |
Сброс в исходное состояние не выполнен |
|
07h |
Повреждена таблица параметров дисковода |
|
0Ah |
Обнаружен дефектный сектор |
|
10h |
При чтении по контрольному коду обнаружена неисправимая ошибка |
|
Код |
Состояние дисководе |
|
11h |
При чтении по контрольному коду была обнаружена и исправлена ошибка |
|
20 h |
Отказ контроллера |
|
40 h |
Сбой при выполнении поиска |
|
80h |
Диск не отвечает (тайм-аут) |
|
AAh |
Дисковод не готов |
|
BBh |
Неизвестная ошибка |
|
CCh |
Ошибка при записи |
|
E0h |
Ошибка регистра состояния |
|
Дополнительные коды состояния дисковода |
||
Код |
Состояние дисководе |
|
B0h |
Том не заперт |
|
B1h |
Том заперт в дисководе |
|
B2h |
Том является неперемещаемым |
|
B3h |
Том используется |
|
B4h |
Счетчик запирания переполнен |
|
B5h |
Команда извлечения носителя не выполнена |
|
B6h |
Носитель присутствует, но защищен от записи |
Дополнительные функции условно разделены на три подгруппы:
• функции для доступа к диску;
• функции для блокировки доступа и смены носителей;
• функции внутреннего назначения.
Функции первой группы применяются при работе с дисками всех типов, функции второй группы — при работе со сменными носителями информации, функции третьей группы используются для внутренних нужд BIOS. В группу функций доступа к диску входят:
• функция 41h — проверка наличия поддержки дополнительных функций;
• функция 42h — расширенное чтение;
• функция 43h — расширенная запись;
• функция 44h — верификация секторов;
• функция 47h — расширенный поиск;
• функция 48h — чтение параметров диска.
В группу функций блокировки доступа и смены носителей входят:
• функция 41h — проверка наличия поддержки дополнительных функций;
• функция 45h — блокировка/разблокирование диска;
• функция 46h — извлечение диска;
• функция 48h — чтение параметров диска;
• функция 49h — получение расширенного статуса смены диска. В группу функций EDD входят:
• функция 41h — проверка наличия поддержки дополнительных функций;
• функция 48h — чтение параметров диска;
• функция 4Eh — установка конфигурации аппаратуры.
Как видно из вышеизложенного, проверка наличия поддержки дополнительных функций является обязательной и входит во все три подгруппы. Если после вызова функции 41h флаг CF имеет значение 1, а регистр АН содержит код 01h, то дополнительные функции не поддерживаются BIOS и не могут использоваться прикладной программой.
Функция выполняет проверку наличия в BIOS компьютера поддержки дополнительных дисковых функций прерывания Int 13h.
Перед вызовом прерывания требуется записать в регистры следующие значения:
• в АН — значение 41h;
• в ВХ — значение 55AAh;
• в DL — номер дисковода.
Если после завершения выполнения функции флаг CF сброшен, то в регистрах находится следующая информация:
• в АН — номер версии дополнения;
• в AL — информация, предназначенная для внутренних целей BIOS;
• в ВХ — значение 55AAh;
• в СХ — битовая карта свойств используемого интерфейса. Возвращаемая в регистре СХ битовая карта позволяет определить, какое подмножество дополнительных функций реализовано в BIOS. Назначение разрядов битовой карты следующее (если интерфейс обладает определенным свойством, то соответствующий разряд устанавливается в единицу):
• бит 0 — признак поддержки группы функций доступа к диску;
• бит 1 — признак поддержки операций блокировки и смены носителя;
• бит 2 — признак поддержки группы функций EDD;
• бит 3 — признак поддержки 64-разрядных расширений;
• биты 4-15 зарезервированы (должны быть установлены в 0).
Если после завершения выполнения функции флаг CF установлен, то дополнительные функции в BIOS не реализованы. В этом случае в регистре АН будет возвращен код состояния Olh.
Функция осуществляет передачу секторов с заданной области диска в буфер памяти.
Перед вызовом прерывания требуется записать в регистры следующие значения:
• в АН — значение 42h;
• в DL — номер дисковода;
• в DS: SI — пакет дискового адреса.
После завершения операции функция возвращает в регистре АН состояние дисковой системы. В случае аварийного завершения выполнения функции поле счетчика блоков в пакете дискового адреса содержит число блоков, которые были успешно прочитаны (прочитаны до того, как произошла ошибка).
Рис. 1. Программа чтения BOOT-сектора (LBA = 3F)
Функция осуществляет передачу секторов из буфера памяти в заданную область диска. Запись данных проводится в режиме верификации, то есть после записи выполняется проверка секторов.
Перед вызовом прерывания требуется записать в регистры следующие значения:
• в АН — значение 43h;
• в AL — код режима записи (0 или 1 — запись без верификации, 2 — запись с верификацией);
• в DL — номер дисковода;
• в DS: SI — пакет дискового адреса.
После завершения операции функция возвращает в регистре АН состояние дисковой системы. В случае аварийного завершения выполнения функции поле счетчика блоков в пакете дискового адреса содержит число блоков, которые были успешно записаны (записаны до того, как произошла ошибка). Причиной аварийного завершения , данной функции может быть отсутствие у заданного устройства поддержки команды записи данных с верификацией. Проверить наличие поддержки записи с верификацией можно при помощи функции 48h.
Функция осуществляет проверку секторов на диске по их контрольным суммам (без передачи информации между диском и оперативной памятью).
Перед вызовом прерывания требуется записать в регистры следующие значения:
• в АН — значение 44h;
• в DL — номер дисковода;
• в DS : SI – пакет дискового адреса.
После завершения операции функция возвращает в регистре АН состояние дисковой системы. В случае аварийного завершения выполнения функции поле счетчика блоков в пакете дискового адреса содержит число блоков, которые были успешно верифицированы (проверены до того, как произошла ошибка).