ИНТ 13H - INT 13H

INT 13h - это сокращение для вызова прерывания BIOS 13 в шестнадцатеричном формате , 20-го вектора прерывания в компьютерной системе на базе x86 (потомки IBM PC). BIOS , как правило , устанавливает реальный режим прерывания обработчика в этом векторе , который обеспечивает посекторное жесткий диск и флоппи - диск сервисы чтения и записи с помощью головки блока цилиндров-сектор (CHS) адресацию. BIOS современных ПК также включает функции расширения INT 13h, разработанные IBM и Microsoft в 1992 году, которые предоставляют те же самые услуги доступа к диску с использованием 64-битной адресации LBA ; с небольшими дополнениями они были квазистандартизированы Phoenix Technologies и другими как расширения BIOS EDD ( Enhanced Disk Drive ).

INT - это инструкция x86, которая запускает программное прерывание , а 13 hex - это номер вызываемого прерывания (в виде шестнадцатеричного значения).

Современные компьютеры поставляются с функциями BIOS INT 13h и UEFI, которые предоставляют те же услуги и многое другое, за исключением UEFI Class 3, который полностью удаляет CSM, поэтому в нем отсутствуют INT 13h и другие прерывания. Обычно драйверы UEFI используют LBA- адресацию вместо CHS-адресации.

Обзор

В операционных системах реального режима , таких как 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.

Во всех версиях MS-DOS (включая MS-DOS 7 и Windows 95 ) есть ошибка, препятствующая загрузке дисков с 256 головками (значение регистра 0xFF), поэтому многие современные BIOS предоставляют сопоставления трансляции CHS с максимум 255 (0xFE) головками. , таким образом уменьшая общее адресное пространство ровно до 8032,5 МБ (примерно 7,844 ГБ).

Для поддержки адресации даже больших дисков IBM и Microsoft представили интерфейс, известный как INT 13h Extensions , который позже был переиздан и немного расширен Phoenix Technologies как часть BIOS Enhanced Disk Drive Services (EDD). Он определяет новые функции в службе INT 13h, все из которых имеют номера функций больше 40h, которые используют 64-битную адресацию логических блоков (LBA), что позволяет адресовать до 8 ZiB . (Диск ATA также может поддерживать 28-битный или 48-битный LBA, что позволяет использовать до 128 ГиБ или 128 ПиБ соответственно, при условии, что размер сектора / блока составляет 512 байт). Это «пакетный» интерфейс, потому что он использует указатель на пакет информации, а не регистровое соглашение о вызовах исходного интерфейса INT 13h. Этот пакет представляет собой очень простую структуру данных, которая содержит версию интерфейса, размер данных и LBA. Для обеспечения обратной совместимости программного обеспечения расширенные функции реализованы вместе с исходными функциями CHS, и вызовы функций из обоих наборов могут быть смешаны, даже для одного и того же накопителя, с оговоркой, что функции CHS не могут достичь более первых 8064 МБ диск.

Некоторые драйверы кеширования сбрасывают свои буферы при обнаружении обхода DOS путем прямого ввода INT 13h из приложений. Фиктивное чтение через INT 13h может использоваться как один из нескольких методов для принудительной очистки кеша для неизвестных кешей (например, перед перезагрузкой).

AMI BIOS примерно 1990–1991 гг. Уничтожают невыровненные буферы слов. Некоторые программы DOS и TSR блокируют включение прерывания и регистрируют, поэтому PC DOS и MS-DOS устанавливают свои собственные фильтры для предотвращения этого.

Список сервисов 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ч   Park Heads
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 Обнаружен неисправный цилиндр (гусеница)
Тип носителя не найден
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 =       ---CH--- ---CL---
cylinder : 76543210 98
sector   :            543210

Примеры перевода:

CX := ( ( cylinder and 255 ) shl 8 ) or ( ( cylinder and 768 ) shr 2 ) or sector;
cylinder := ( (CX and 0xFF00) shr 8 ) or ( (CX and 0xC0) shl 2)
sector := CX and 63;

Адресация буфера должно гарантировать , что полный буфер находится внутри данного сегмента , то есть ( BX + size_of_buffer ) <= 10000h. В противном случае прерывание может завершиться ошибкой с некоторыми версиями BIOS или оборудования.

Пример

Предположим, вы хотите прочитать 16 секторов (= 2000h байтов ), а ваш буфер начинается с адреса памяти 4FF00h. Используя сегментацию памяти , есть разные способы вычисления значений регистров, например:

ES = segment         = 4F00h
BX = offset          =  0F00h
sum = memory address = 4FF00h
would be a good choice because 0F00h + 2000h = 2F00h <= 10000h
ES = segment         = 4000h
BX = offset          =  FF00h
sum = memory address = 4FF00h
would not be a good choice because FF00h + 2000h = 11F00h > 10000h

Функция 02h прерывания 13h может читать только секторы первых 16 450 560 секторов вашего жесткого диска, для чтения секторов, превышающих предел в 8 ГБ, вы должны использовать функцию 42h из INT 13h Extensions. Другой альтернативой может быть прерывание DOS 25h, которое считывает сектора внутри раздела.

Пример кода

   [ORG 7c00h]   ; code starts at 7c00h
   xor ax, ax    ; make sure ds is set to 0
   mov ds, ax
   cld
   ; start putting in values:
   mov ah, 2h    ; int13h function 2
   mov al, 63    ; we want to read 63 sectors
   mov ch, 0     ; from cylinder number 0
   mov cl, 2     ; the sector number 2 - second sector (starts from 1, not 0)
   mov dh, 0     ; head number 0
   xor bx, bx    
   mov es, bx    ; es should be 0
   mov bx, 7e00h ; 512bytes from origin address 7c00h
   int 13h
   jmp 7e00h     ; jump to the next sector
   
   ; to fill this sector and make it bootable:
   times 510-($-$$) db 0 
   dw 0AA55h

после этого раздела кода (с которого должен начинаться файл asm) вы можете написать код, и он будет загружен в память и выполнен.

обратите внимание, как мы не изменили dl (диск). Это связано с тем, что при первой загрузке компьютера dl устанавливается равным номеру диска, который был загружен, поэтому, предполагая, что мы хотим читать с диска, с которого мы загрузились, нет необходимости изменять dl.

INT 13h AH = 03h : запись секторов на диск

Параметры
AH 03ч
AL Секторы для записи подсчета
CH Отслеживать
CL Сектор
DH Голова
DL Водить машину
ES: BX Указатель адреса буфера
Полученные результаты
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата
AL Фактический письменный подсчет секторов

INT 13h AH = 04h : Проверить сектора с диска

Параметры
AH 04ч
AL Секторы для проверки подсчета
CH Отслеживать
CL Сектор
DH Голова
DL Водить машину
ES: BX Указатель адреса буфера
Полученные результаты
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата
AL Фактическое количество проверенных секторов

INT 13h AH = 05h : Форматировать дорожку

Параметры
AH 05ч
AL Секторы для форматирования счетчика
CH Отслеживать
CL Сектор
DH Голова
DL Водить машину
ES: BX Указатель адреса буфера
4-байтовое поле адреса
(применимо к PC / XT 286, AT, PS / 1 и PS / 2)
Байт Имея в виду Допустимые значения
1 Отслеживать
2 Голова
3 Сектор
4 Байт / сектор 0 = 128, 1-256, 2-512, 3-1024
Полученные результаты
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата

INT 13h AH = 06h : Форматирование дорожки устанавливает флаги плохого сектора

Параметры
AH 06ч
AL Чередование
CH Отслеживать
CL Сектор
DH Голова
DL Водить машину
Полученные результаты
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата

INT 13h AH = 07h : Форматирование диска, начиная с дорожки

Параметры
AH 07ч
AL Чередование
CH Отслеживать
CL Сектор
DH Голова
DL Водить машину
Полученные результаты
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата

INT 13h AH = 08h : чтение параметров привода

Параметры
Регистры
AH 08h = номер функции для read_drive_parameters
DL индекс диска (например, 1-й жесткий диск = 80h)
ES: DI установите значение 0000h: 0000h, чтобы обойти некоторые ошибки в BIOS
Полученные результаты
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата
DL количество жестких дисков
DH логический последний индекс голов = number_of - 1 (потому что индекс начинается с 0)
CX [7: 6] [15: 8] логический последний индекс цилиндров = number_of - 1 (поскольку индекс начинается с 0 )

[5: 0] логический последний индекс секторов на дорожке = number_of (поскольку индекс начинается с 1)

BL тип привода (только дискеты AT / PS2)
ES: DI указатель на таблицу параметров привода (только для дискет)

Замечания

  • Логические значения функции 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 = номер функции для проверки расширений
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) с использованием адресации логических блоков (обратите внимание, что нижняя половина идет перед верхней половиной)
Полученные результаты
Регистры Описание
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата

Как уже было сказано с int 13h AH = 02h, необходимо позаботиться о том, чтобы полный буфер находился внутри данного сегмента , то есть (BX + size_of_buffer) <= 10000h

INT 13h AH = 43h : расширенные секторы записи на диск

Параметры
Регистры Описание
AH 43h = номер функции для расширенной записи
AL
  • бит 0 = 0: закрыть проверку записи,
  • бит 0 = 1: открытая проверка записи,
  • бит 1-7: зарезервирован, установлен в 0
DL индекс диска (например, 1-й жесткий диск = 80h)
DS: SI сегмент: смещение указателя на DAP
Полученные результаты
Регистры Описание
CF Установить при ошибке, очистить, если ошибок нет
AH Код возврата

INT 13h AH = 48h : расширенное считывание параметров привода

Параметры
Регистры Описание
AH 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 указывает на пустую структуру для результата. должен быть размером 13 часов
Полученные результаты
Регистры Описание
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 Сегмент буфера 3K для кэширования чтения компакт-дисков
2 Сегмент начального загрузочного образа, начиная с сегмента 7c0h
0Eh 2 Количество секторов (длиной 512 байт) для загрузки
10ч 1 Младший байт счетчика цилиндров (от int 8h)
11ч 1 Счетчик секторов (от int 8h)
12ч 1 Подсчет головы (от int 8h)

Смотрите также

использованная литература

внешние ссылки