INT 13h - это сокращение для вызова прерывания BIOS 13 в шестнадцатеричном формате , 20-го вектора прерывания в компьютерной системе на базе x86 (потомки IBM PC). BIOS , как правило , устанавливает реальный режим прерывания обработчика в этом векторе , который обеспечивает посекторное жесткий диск и флоппи - диск сервисы чтения и записи с помощью головки блока цилиндров-сектор (CHS) адресацию. BIOS современных ПК также включает функции расширения INT 13h, разработанные IBM и Microsoft в 1992 году, которые предоставляют те же услуги доступа к диску с использованием 64-битной адресации LBA ; с небольшими дополнениями, они были квазистандартизированы Phoenix Technologies и другими как EDD (Enhanced Disk Drive ) расширения BIOS.
INT - это инструкция x86, которая запускает программное прерывание , а 13 hex - это номер вызываемого прерывания (в виде шестнадцатеричного значения).
Современные компьютеры поставляются с функциями BIOS INT 13h и UEFI, которые предоставляют те же услуги и многое другое, за исключением UEFI Class 3, который полностью удаляет CSM, поэтому в нем отсутствуют INT 13h и другие прерывания. Обычно драйверы UEFI используют LBA -адресацию вместо CHS-адресации.
Обзор [ править ]
См. Также: Адресация логических блоков § Расширенный BIOS
В операционных системах реального режима , таких как DOS , вызов INT 13h будет переходить в код ROM-BIOS компьютера для низкоуровневых дисковых служб , которые будут выполнять операции чтения или записи диска на основе физических секторов для программы. В DOS он служит низкоуровневым интерфейсом для встроенных драйверов блочных устройств для жестких дисков и гибких дисков . Это позволяет INT 25h и INT 26h предоставлять функции абсолютного чтения / записи на диск для логических секторов драйверу файловой системы FAT в ядре DOS, который обрабатывает запросы, связанные с файлами, через функции DOS API ( INT 21h ).
В операционных системах с защищенным режимом , таких как производные от Microsoft Windows NT (например, NT4, 2000, XP и Server 2003) и Linux с функцией dosmu , ОС перехватывает вызов и передает его встроенному механизму дискового ввода-вывода операционной системы. Windows 9x и Windows для рабочих групп 3.11 также обходят процедуры BIOS при использовании 32-разрядного доступа к диску . Помимо выполнения низкоуровневого доступа к диску, вызовы INT 13h и связанные структуры данных BIOS также предоставляют информацию о типах и емкости дисков (или других DASDустройства), подключенные к системе; при загрузке ОС в защищенном режиме она может использовать эту информацию из BIOS для перечисления дискового оборудования, чтобы оно (ОС) могло загрузить и настроить соответствующие драйверы дискового ввода-вывода.
Оригинальный интерфейс BIOS INT 13h в реальном режиме поддерживает диски размером до 8 ГБ с использованием того, что обычно называется физической адресацией CHS . Это ограничение связано с аппаратным интерфейсом дискового оборудования IBM PC / XT . BIOS использовал адрес сектора головки цилиндра (CHS), указанный в вызове INT 13h, и передавал его непосредственно на аппаратный интерфейс. Меньший предел, около 504 МБ, был наложен комбинацией ограничений адресации CHS, используемых BIOS, и жестких дисков ATA, которые не похожи друг на друга. Когда пределы адресации CHS как BIOS, так и ATA объединяются (т. Е. Когда они применяются одновременно), количество 512-байтовых секторов, которые могут быть адресованы, составляет в общей сложности около 504 МБ.
Ограничение в 504 МБ было преодолено с помощью трансляции CHS , метода, с помощью которого BIOS имитировал фиктивную геометрию CHS на интерфейсе INT 13h, при этом взаимодействуя с диском ATA, используя собственную логическую геометрию CHS. (К тому времени, когда приблизился барьер в 504 МБ, диски ATA задолго до этого перестали отображать свои реальные параметры физической геометрии на внешнем интерфейсе ATA.) Трансляция позволяет BIOS, все еще использующему адресацию CHS, эффективно адресовать диски ATA большего размера. ровно до 8064 МБ, что является естественной емкостью только интерфейса BIOS CHS. (Интерфейс ATA имеет гораздо большую емкость адресации CHS, поэтому, как только "вмешательство" ограничений CHS BIOS и ATA было устранено путем адресации, значительным было только меньшее ограничение BIOS.) Трансляция CHS иногда называется логической адресацией CHS., но на самом деле это неправильное название, поскольку ко времени разработки этой BIOS адреса ATA CHS уже были логическими, а не физическими. Предел 8064 МБ возникает из-за комбинации соглашения о вызовах на основе значения регистра, используемого в интерфейсе INT 13h, и цели поддержания обратной совместимости - диктуя, что формат или размер адресов CHS, передаваемых в INT 13h, не может быть изменен для добавления дополнительных битов. в одно из полей, например, в поле Номер цилиндра. Этот предел использует 1024 цилиндра, 256 головок, 63 сектора и 512 байтовых блоков, что позволяет адресовать ровно 7,875 ГиБ (1024 * 256 * 63 * 512 байтов). Вкратце было несколько BIOS, которые предлагали несовместимые версии этого интерфейса - например,AWARD AT BIOS и AMI 386sx BIOS были расширены для обработки до 4096 цилиндров путем помещения битов 10 и 11 номера цилиндра в биты 6 и 7 регистра DH, но в конечном итоге компьютерная промышленность стандартизировала интерфейс, разработанный в Microid Research ( «MR BIOS») в 1989 году.[ необходима цитата ]
Во всех версиях MS-DOS (включая MS-DOS 7 и Windows 95 ) есть ошибка, препятствующая загрузке дисков с 256 головками (значение регистра 0xFF), поэтому многие современные BIOS предоставляют сопоставления трансляции CHS с максимум 255 (0xFE) головками. , [1] [2], таким образом уменьшая общее адресное пространство точно до 8032,5 МиБ (примерно 7,844 ГиБ). [3]
Для поддержки адресации даже больших дисков IBM и Microsoft представили интерфейс, известный как INT 13h Extensions , который позже был переиздан и немного расширен Phoenix Technologies как часть BIOS Enhanced Disk Drive Services (EDD). [4] [5] Он определяет новые функции в службе INT 13h, все из которых имеют номера функций больше 40h, которые используют 64-битную адресацию логических блоков (LBA), что позволяет адресовать до 8 ЗиБ . (Диск ATA также может поддерживать 28-битный или 48-битный LBA, что позволяет использовать до 128 ГиБ или 128 ПиБсоответственно, при условии, что размер сектора / блока составляет 512 байт). Это «пакетный» интерфейс, потому что он использует указатель на пакет информации, а не соглашение о вызовах на основе регистров исходного интерфейса INT 13h. Этот пакет представляет собой очень простую структуру данных, которая содержит версию интерфейса, размер данных и LBA. Для обеспечения обратной совместимости программного обеспечения расширенные функции реализуются вместе с исходными функциями CHS, и вызовы функций из обоих наборов могут быть смешаны, даже для одного и того же диска, с оговоркой, что функции CHS не могут достигнуть более первых 8064 МБ диск.
Некоторые драйверы кэша сбрасывают свои буферы при обнаружении обхода DOS путем прямого ввода INT 13h из приложений. Фиктивное чтение через INT 13h может использоваться как один из нескольких методов принудительной очистки кеша для неизвестных кешей (например, перед перезагрузкой). [1] [2]
BIOS AMI примерно 1990–1991 годов удаляют невыровненные буферы слов. Некоторые программы DOS и TSR блокируют включение прерывания и регистрируют, поэтому PC DOS и MS-DOS устанавливают свои собственные фильтры для предотвращения этого. [6]
Список служб INT 13h [ править ]
Приводной стол
DL = 00ч
1-я дискета ("дисковод A:")
DL = 01ч
2-я дискета ("дисковод B:")
DL = 02ч
3-я дискета ("дисковод B:")
. . .
DL = 7Fh
128-я дискета
DL = 80ч
1-й жесткий диск
DL = 81 ч
2-й жесткий диск
DL = 82 ч
3-й жесткий диск
. . .
DL = E0h
CD / DVD [ ссылка ] или 97-й жесткий диск
. . .
DL = FFh
128-й жесткий диск
Таблица функций
AH = 00ч
Сбросить дисковую систему
AH = 01ч
Получить статус последней операции диска
AH = 02ч
Чтение секторов с диска
AH = 03ч
Запись секторов на диск
AH = 04ч
Проверить сектора
AH = 05ч
Форматировать трек
AH = 06ч
Форматировать дорожку Установить флаги плохого сектора
AH = 07ч
Форматировать диск, начиная с дорожки
AH = 08ч
Чтение параметров привода
AH = 09ч
HD
Инициализировать дисковый контроллер
AH = 0Ah
HD
Чтение длинных секторов с диска
AH = 0Bh
HD
Запись длинных секторов на диск
AH = 0Ch
HD
Переместить приводную головку к цилиндру
AH = 0Dh
HD
Сбросить диски
AH = 0Eh
PS / 2
Проверка чтения контроллера
AH = 0Fh
PS / 2
Тест записи контроллера
AH = 10ч
HD
Проверьте, готов ли диск
AH = 11ч
HD
Перекалибровать привод
AH = 12 часов
PS / 2
Тест ОЗУ контроллера
AH = 13ч
PS / 2
Тест драйв
AH = 14ч
HD
Диагностика контроллера
AH = 15 часов
Чтение типа привода
AH = 16ч
FD
Обнаружение смены носителя
AH = 17ч
FD
Установить тип носителя для формата (используется версиями DOS <= 3.1)
AH = 18ч
FD
Установить тип носителя для формата (используется версиями DOS> = 3.2)
AH = 19ч
Парковые головы
AH = 41ч
EXT
Проверьте, доступны ли расширения
AH = 42ч
EXT
Чтение секторов с диска
AH = 43ч
EXT
Запись секторов на диск
AH = 44ч
EXT
Проверить сектора
AH = 45 часов
EXT
Блокировать / разблокировать диск
AH = 46ч
EXT
Извлечь диск
AH = 47ч
EXT
Переместить привод в сектор
AH = 48ч
EXT
Чтение параметров привода
AH = 49ч
EXT
Обнаружение смены носителя
AH = 4Bh
EXT
Получить тип эмуляции диска
Если второй столбец пуст, функция может использоваться как для гибкого, так и для жесткого диска.
FD: только для гибких дисков.
HD: только для жесткого диска.
PS / 2: только для жесткого диска в системе PS / 2.
EXT: часть расширений INT 13h, которые были написаны в 1990-х годах для поддержки жестких дисков с объемом более 8 ГБ .
INT 13h AH = 00h : Сброс дисковой системы [ править ]
Параметры
AH
00ч
DL
Диск (установленный бит 7 означает сброс как жесткого, так и гибкого диска)
Полученные результаты
CF
Установить при ошибке
AH
Код возврата
INT 13h AH = 01h : получить статус последней операции привода [ редактировать ]
Параметры
AH
01ч
DL
Водить машину
Бит 7 = 0 для дисковода гибких дисков, бит 7 = 1 для фиксированного дисковода
Полученные результаты
AH
Код возврата
00ч
Успех
01ч
Неверная команда
02ч
Не удается найти адресную метку
03ч
Попытка записи на защищенный от записи диск
04ч
Сектор не найден
05ч
Сбросить сбой
06ч
Строка смены диска 'активна'
07ч
Ошибка действия параметра диска
08ч
DMA переполнение
09ч
Попытка DMA через границу 64 КБ
0Ач
Обнаружен плохой сектор
0Bh
Обнаружен неисправный цилиндр (гусеница)
0Ч
Тип носителя не найден
0Dh
Неверное количество секторов
0Eh
Обнаружена адресная метка управляющих данных
0Fh
DMA вне диапазона
10ч
Ошибка данных CRC / ECC
11ч
Ошибка данных с исправлением ECC
20ч
Сбой контроллера
40ч
Ищите неудачу
80ч
Время ожидания диска истекло, предполагается, что он не готов
AAh
Диск не готов
BBh
Неопределенная ошибка
CCh
Ошибка записи
E0h
Ошибка статуса
FFh
Ошибка операции Sense
CF
Установить при ошибке, очистить, если ошибок нет
INT 13h AH = 02h : чтение секторов с диска [ править ]
Параметры
AH
02ч
AL
Секторы для считывания подсчета
CH
Цилиндр
CL
Сектор
DH
Голова
DL
Водить машину
ES: BX
Указатель адреса буфера
Полученные результаты
CF
Установить при ошибке, очистить, если ошибок нет
AH
Код возврата
AL
Фактическое количество прочитанных секторов
Замечания [ править ]
Регистр CX содержит как номер цилиндра (10 битов , возможные значения от 0 до 1023), так и номер сектора (6 битов, возможные значения от 1 до 63). Биты цилиндра и сектора пронумерованы ниже:
CX: = ((цилиндр и 255) shl 8) или ((цилиндр и 768) shr 2) или сектор;цилиндр: = ((CX и 0xFF00) shr 8) или ((CX и 0xC0) shl 2)сектор: = CX и 63;
Адресация буфера должно гарантировать , что полный буфер находится внутри данного сегмента , то есть ( BX + size_of_buffer ) <= 10000h. В противном случае прерывание может завершиться ошибкой с некоторыми версиями BIOS или оборудования.
Пример [ править ]
Предположим, вы хотите прочитать 16 секторов (= 2000h байтов ), а ваш буфер начинается с адреса памяти 4FF00h. Используя сегментацию памяти , есть разные способы вычисления значений регистров, например:
ES = сегмент = 4F00hBX = смещение = 0F00hсумма = адрес памяти = 4FF00hбыло бы хорошим выбором, потому что 0F00h + 2000h = 2F00h <= 10000hES = сегмент = 4000 чBX = смещение = FF00hсумма = адрес памяти = 4FF00hбы не быть выбор хорошо , потому что FF00H + 2000h = 11F00h> 10000h
Функция 02h прерывания 13h может читать только секторы первых 16 450 560 секторов вашего жесткого диска, для чтения секторов, превышающих предел в 8 ГБ, вы должны использовать функцию 42h из INT 13h Extensions. Другой альтернативой может быть прерывание DOS 25h, которое читает секторы внутри раздела.
INT 13h AH = 03h : Запись секторов на диск [ править ]
Параметры
AH
03ч
AL
Секторы для записи подсчета
CH
Отслеживать
CL
Сектор
DH
Голова
DL
Водить машину
ES: BX
Указатель адреса буфера
Полученные результаты
CF
Установить при ошибке, очистить, если ошибок нет
AH
Код возврата
AL
Фактический письменный подсчет секторов
INT 13h AH = 04h : Проверить сектора с диска [ править ]
установите значение 0000h: 0000h, чтобы обойти некоторые ошибки в BIOS
Полученные результаты
CF
Установить при ошибке, очистить, если ошибок нет
AH
Код возврата
DL
количество жестких дисков
DH [7]
логический последний индекс голов = number_of - 1 (потому что индекс начинается с 0)
CX
[7: 6] [15: 8] [7] логический последний индекс цилиндров = number_of - 1 (поскольку индекс начинается с 0 )
[5: 0] [7] логический последний индекс секторов на дорожке = number_of (поскольку индекс начинается с 1)
BL [7]
тип привода (только дискеты AT / PS2)
ES: DI [7]
указатель на таблицу параметров привода (только для дискет)
Замечания [ править ]
Логические значения функции 08h могут / должны отличаться от физических значений CHS функции 48h.
Регистр результатов CX содержит значения как для цилиндров, так и для секторов / дорожек, см. Примечание к функции 02h.
INT 13h AH = 09h : Инициализация характеристик пары приводов [ редактировать ]
Параметры
AH
09ч
DL
Водить машину
Полученные результаты
CF
Установить при ошибке, очистить, если ошибок нет
AH
Код возврата
INT 13h AH = 0Ah: чтение длинных секторов с диска [ править ]
Единственная разница между этой функцией и функцией 02h (см. Выше) заключается в том, что функция 0Ah считывает 516 байт на сектор вместо 512. Последние 4 байта содержат код коррекции ошибок (ECC), контрольную сумму данных сектора.
INT 13h AH = 41h : Проверить наличие расширений [ править ]
Параметры
Регистры
Описание
AH
41h = номер функции для проверки расширений [8]
DL
индекс диска (например, 1-й жесткий диск = 80h)
BX
55ААч
Полученные результаты
Регистры
Описание
CF
Установить на "Нет", "Удалить", если есть
AH
Код ошибки или основной номер версии
BX
AA55h
CX
Битовая маска поддержки интерфейса:
1 - Доступ к устройству с использованием структуры пакета
2 - Блокировка и извлечение диска
4 - Расширенная поддержка дисковых накопителей (EDD)
INT 13h AH = 42h : расширенное чтение секторов с диска [ править ]
Параметры
Регистры
Описание
AH
42h = номер функции для расширенного чтения
DL
индекс диска (например, 1-й жесткий диск = 80h)
DS: SI
сегмент: смещение указателя на DAP, см. ниже
DAP: пакет адреса диска
диапазон смещения
размер
описание
00ч
1 байт
размер DAP (установите 10h)
01ч
1 байт
неиспользованный, должен быть нулевым
02ч..03ч
2 байта
количество секторов для чтения (некоторые BIOS Phoenix ограничены до 127 секторов)
04ч..07ч
4 байта
сегмент: указатель смещения на буфер памяти, в который будут перенесены секторы (обратите внимание, что x86 имеет прямой порядок байтов : если объявляется сегмент и смещение отдельно, смещение должно быть объявлено перед сегментом)
08h..0Fh
8 байт
абсолютный номер начала секторов для чтения (1-й сектор диска имеет номер 0) с использованием логической адресации блоков (обратите внимание, что нижняя половина идет перед верхней половиной) [9]
Полученные результаты
Регистры
Описание
CF
Установить при ошибке, очистить, если ошибок нет
AH
Код возврата
Как уже говорилось с int 13h AH = 02h, необходимо позаботиться о том, чтобы весь буфер находился внутри данного сегмента , т.е. (BX + size_of_buffer) <= 10000h
INT 13h AH = 43h : Расширенные секторы записи на диск [ править ]
48h = номер функции для extended_read_drive_parameters
DL
индекс диска (например, 1-й жесткий диск = 80h)
DS: SI
сегмент: смещение указателя на буфер результатов, см. ниже
Буфер результатов
диапазон смещения
размер
описание
00ч..01ч
2 байта
размер буфера результатов (установите значение 1Eh)
02ч..03ч
2 байта
информационные флаги
04ч..07ч
4 байта
физическое количество цилиндров = последний индекс + 1 (поскольку индекс начинается с 0)
08h..0Bh
4 байта
физическое количество голов = последний индекс + 1 (потому что индекс начинается с 0)
0Ch..0Fh
4 байта
физическое количество секторов на дорожку = последний индекс (поскольку индекс начинается с 1)
10ч..17ч
8 байт
абсолютное количество секторов = последний индекс + 1 (поскольку индекс начинается с 0)
18ч..19ч
2 байта
байтов на сектор
1Ah..1Dh
4 байта
необязательный указатель на параметры конфигурации Enhanced Disk Drive (EDD), который может использоваться для последующих вызовов прерывания 13h Extension (если поддерживается)
Полученные результаты
Регистры
Описание
CF
Установить при ошибке, очистить, если ошибок нет
AH
Код возврата
Замечание [ править ]
Физические значения CHS функции 48h могут / должны отличаться от логических значений функции 08h.
INT 13h AH = 4Bh: Получить тип эмуляции накопителя [ править ]
Параметры
Регистраторы
Описание
AH
4Bh = получить тип эмуляции диска
AL
01
DL
индекс диска (например, 1-й жесткий диск = 80h)
DS: SI
указывает на пустую структуру для результата. должен быть размером 13h
Полученные результаты
Регистры
Описание
CF
Установить при ошибке, очистить, если ошибок нет
ТОПОР
Код возврата
DS: SI
Указывает на структуру спецификации
Структура спецификации
Компенсировать
Размер (байт)
Описание
00ч
1
Размер пакетов в байтах (13h)
01ч
1
Тип загрузочного носителя:
Биты
0–3
0000b: без эмуляции
0001b: 1,2 МБ дискеты
0010b: дискета 1,44 МБ
0011b: дискета 2,88 МБ
0100b: жесткий диск
4-5
Зарезервированный
6
Изображение содержит драйвер ATAPI
7
Образ содержит драйвер SCSI
02ч
1
Номер диска (индекс диска)
03ч
1
Номер контроллера компакт-диска
04ч
4
Логический адрес блока (LBA) образа диска для эмуляции
08ч
2
Спецификация устройства:
бит 0: привод является ведомым, а не ведущим
биты 7-0: LUN и PUN
0Ач
2
Сегмент буфера размером 3К для кэширования чтения компакт-дисков
0Ч
2
Сегмент начального загрузочного образа, начиная с сегмента 7c0h
0Eh
2
Количество секторов (длиной 512 байт) для загрузки
10ч
1
Младший байт счетчика цилиндров (от int 8h)
11ч
1
Счетчик секторов (от int 8h)
12ч
1
Подсчет головы (от int 8h)
См. Также [ править ]
ИНТ 10H
Вызов прерывания BIOS
Сектор головки цилиндров
INT (инструкция x86)
DPMI (интерфейс защищенного режима DOS)
Список прерываний Ральфа Брауна
Спецификация расширенного диска BIOS
Ссылки [ править ]
^ a b Браун, Ральф Д. (2000-07-16). "Список прерываний Ральфа Брауна (v61 html)" . Проверено 3 ноября 2016 .
^ a b Браун, Ральф Д. (2000-07-16). «Архив списка прерываний x86 (исходный текст v61):« inter61a.zip », субфайл:« INTERRUP.B », заголовок:« B-1302 »(INT13, 02 Чтение), примечания» . Проверено 3 ноября 2016 .
^ Ограничения размера диска, ограничение 8,4 ГБ (и другие)
^ Стивенс, Кертис (1995-01-26). «Enhanced Disk Drive Specification 1.1 -DRAFT- Phoenix Technologies, см. 3.0 BIOS Extensions (требуется регистрация)» (PDF) . Проверено 3 ноября 2016 .
^ Landis, Hale (1995-02-11). «Типы BIOS, трансляция CHS, LBA и другие полезные сведения, см. BIOS Type 6, спецификация расширенного диска Phoenix. (Требуется регистрация)» (PDF) . Проверено 3 ноября 2016 .
^ ctyme.com - Список прерываний Ральфа Брауна, индексированный HTML, ДИСК - ПРОЧИТАЙТЕ СЕКТОРЫ В ПАМЯТЬ
^ a b c d e f ctyme.com - ДИСК - ПОЛУЧИТЬ ПАРАМЕТРЫ ДИСКА (ПК, XT286, CONV, PS, ESDI, SCSI)
^ ctyme.com - Расширения IBM / MS INT 13 - ПРОВЕРКА УСТАНОВКИ