Что такое INT 21h? - PullRequest
       36

Что такое INT 21h?

5 голосов
/ 07 августа 2009

Вдохновленный этим вопросом

Как заставить GDB разбирать?

Я задавался вопросом о INT 21h как о концепции. Теперь у меня есть некоторые очень ржавые знания внутренних органов, но не так много деталей. Я помню, что в C64 у вас были регулярные прерывания и немаскируемые прерывания, но мои знания на этом заканчиваются. Не могли бы вы дать мне подсказку? Это стратегия, связанная с DOS?

Ответы [ 10 ]

12 голосов
/ 07 августа 2009

С здесь : Многофункциональное прерывание DOS, используемое для различных функций, включая чтение с клавиатуры и запись на консоль и принтер. Он также использовался для чтения и записи дисков с использованием более раннего метода File Control Block (FCB).

9 голосов
/ 31 августа 2009

DOS можно рассматривать как библиотеку, используемую для обеспечения абстракции файлов / каталогов для ПК (и немного больше). int 21h - это простой аппаратный «трюк», который позволяет легко вызывать код из этой библиотеки, не зная заранее, где он будет находиться в памяти. В качестве альтернативы вы можете думать об этом как о способе использования DOS API.

Теперь тема программных прерываний является сложной, отчасти потому, что концепции развивались с течением времени, когда Intel добавила функции в семейство x86, пытаясь при этом оставаться совместимым со старым программным обеспечением. Правильное объяснение займет несколько страниц, но я постараюсь быть кратким.

Основной вопрос заключается в том, находитесь ли вы в реальном режиме или в защищенном режиме .

Реальный режим - это простой, «оригинальный» режим работы процессора x86. Это режим, в котором работает DOS (когда вы запускаете программы DOS под Windows, процессор реального режима виртуализируется, поэтому в нем применяются те же правила). Текущая запущенная программа имеет полный контроль над процессором.

В реальном режиме есть таблица векторов, которая сообщает процессору, на какой адрес переходить для каждого прерывания от 0 до 255. Эта таблица заполняется BIOS и DOS, а также драйверами устройств, а иногда и программами со специальными необходимо. Некоторые из этих прерываний могут быть сгенерированы аппаратными средствами (например, нажатием клавиши). Другие генерируются определенными условиями программного обеспечения (например, делятся на 0). Любой из них можно сгенерировать, выполнив инструкцию int n.

Программы могут устанавливать / снимать флаг «разрешить прерывания»; этот флаг влияет только на аппаратные прерывания и не влияет на int инструкции.

Разработчики DOS решили использовать прерывание с номером 21h для обработки запросов DOS - номер не имеет никакого реального значения: это была просто неиспользуемая запись в то время. Есть много других (например, номер 10h - это установленная в BIOS подпрограмма прерывания, которая работает с графикой). Также обратите внимание, что все это только для IBM PC-совместимых. В процессорах x86, например, во встроенных системах программное обеспечение и таблицы прерываний могут быть расположены по-разному!

Защищенный режим - это сложный, «защищенный» режим, который был введен в процессоре 286 и значительно расширен в 386. Он обеспечивает несколько уровней привилегий. Операционная система должна настроить все это (и если операционная система ошибается, у вас есть потенциальная уязвимость). Пользовательские программы обычно ограничены режимом работы с «минимальными привилегиями», когда попытка получить доступ к аппаратным портам или изменить флаг прерывания или получить доступ к определенным областям памяти останавливает программу и позволяет ОС решать, что делать (прекратить ли она программа или дать программе то, что она хочет).

Обработка прерываний стала более сложной. Достаточно сказать, что, как правило, если пользовательская программа выполняет программное прерывание, номер прерывания не используется в качестве вектора в таблице прерываний. Скорее генерируется исключение общей защиты, и обработчик ОС для указанного исключения может (если ОС спроектирована таким образом) определить, чего хочет процесс, и обработать запрос. Я уверен, что Linux и Windows в прошлом (если не сейчас) использовали такой механизм для своих системных вызовов. Но есть и другие способы добиться этого, например инструкция SYSENTER.

7 голосов
/ 07 августа 2009

Список прерываний Ральфа Брауна содержит много информации о том, какое прерывание делает что. int 21 , как и все остальные, поддерживает широкий спектр функций в зависимости от значений регистра.

A версия списка Ральфа Брауна, отличная от HTML *, также доступна .

3 голосов
/ 07 августа 2009

Инструкция INT является программным прерыванием. Это вызывает переход к процедуре, на которую указывает вектор прерывания, который является фиксированным местом в памяти. Преимущество инструкции INT состоит в том, что она имеет длину всего 2 байта, а для JMP она может быть равна 6, и ее можно легко перенаправить путем изменения содержимого вектора прерывания.

2 голосов
/ 07 августа 2009

Int 0x21 - это программное прерывание x86 - в основном это означает, что в фиксированной точке памяти есть таблица прерываний, в которой перечислены адреса программных прерываний. Когда процессор x86 получает код операции прерывания (или иным образом решает, что должно быть выполнено определенное программное прерывание), он ссылается на эту таблицу для выполнения вызова этой точки (функция в этой точке должна использовать iret вместо ret для вернуть).

Возможно переназначить Int 0x21 и другие программные прерывания (даже внутри DOS, хотя это может иметь отрицательные побочные эффекты). Одним интересным программным прерыванием для сопоставления или цепочки является Int 0x1C (или 0x08, если вы осторожны), которое является системным тиковым прерыванием, которое вызывается 18,2 раза каждую секунду. Это можно использовать для создания «фоновых» процессов даже в однопоточном реальном режиме (процесс реального режима будет прерываться 18,2 раза в секунду для вызова вашей функции прерывания).

В операционной системе DOS (или системе, которая обеспечивает некоторую эмуляцию DOS, например консоль Windows), Int 0x21 отображается на то, что фактически является основным "API" операционных систем DOS. Предоставляя различные значения в регистр AH, можно выполнять различные функции DOS, такие как открытие файла (AH = 0x3D) или печать на экран (AH = 0x09).

2 голосов
/ 07 августа 2009

Это из великого Программирование на языке ассемблера о прерываниях:

На 80x86 существует три типа событий, обычно известных как прерывания: прерывания, исключения и прерывания (аппаратные прерывания). Эта глава опишет каждую из этих форм и обсудит их поддержка на 80x86 процессорах и ПК-совместимых машинах.

Хотя термины ловушка и исключение часто используются как синонимы, мы будет использовать термин «ловушка» для обозначения инициатора и ожидаемого передача управления специальному обработчику Во многом trap - это не что иное, как специальный вызов подпрограммы. Много текстов называть ловушки программными прерываниями. Инструкция 80x86 int основное средство для выполнения ловушки. Обратите внимание, что ловушки обычно безусловный; то есть при выполнении инструкции int управление всегда переходит к процедуре, связанной с ловушкой. поскольку ловушки выполняются с помощью явной инструкции, это легко определить какие именно инструкции в программе будут вызывать обработку ловушек рутина.

Глава 17 - Структура прерываний и подпрограммы обработки прерываний

1 голос
/ 07 августа 2009

Это «программное прерывание»; так что не аппаратное прерывание вообще.

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

Системное программное обеспечение (например, DOS и BIOS) предоставляет свои API-интерфейсы приложению в виде программных прерываний.

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

1 голос
/ 07 августа 2009

(Почти) весь интерфейс DOS стал доступен в виде команд INT21h с параметрами в различных регистрах. Это небольшая хитрость, использующая встроенную аппаратную таблицу для перехода к нужному коду. Также INT 33h был для мыши.

0 голосов
/ 24 сентября 2010

На самом деле, здесь много понятий. Давайте начнем с основ.

Прерывание - это способ запросить внимание у ЦП, прервать текущий поток программы, перейти к обработчику прерываний (ISR - Interrupt Service Routine), выполнить некоторую работу (обычно ядром ОС). или драйвер устройства) и затем вернитесь.

Каковы типичные способы использования прерываний?

  • Аппаратные прерывания: устройство запрашивает внимание у ЦПУ, выдавая запрос на прерывание.
  • Исключения ЦП: если происходит какое-то ненормальное состояние ЦП, такое как деление на ноль, сбой страницы, ... ЦП переходит к соответствующему обработчику прерываний, чтобы ОС могла сделать все, что должна (отправить сигнал на процесс, загрузите страницу из свопинга и обновите таблицу TLB / page, ...).
  • Программные прерывания. Поскольку прерывание в конечном итоге вызывает ядро ​​ОС, простой способ реализовать системные вызовы - использовать прерывания. Но вам не нужно, в x86 вы могли бы использовать инструкцию вызова для некоторой структуры (своего рода TSS IIRC), а на более новых x86 есть взаимодействия SYSCALL / SYSENTER.

Процессоры решают, куда перейти к просмотру таблицы (векторы исключений, векторы прерываний, IVT в реальном режиме x86, IDT в защищенном режиме x86, ...). Некоторые процессоры имеют один вектор для аппаратных прерываний, другой - для исключений и т. Д., И ISR должен проделать определенную работу для определения источника прерывания. Другие имеют много векторов и переходят непосредственно к очень специфическим ISR.

x86 имеет 256 векторов прерываний. На оригинальных ПК они были разделены на несколько групп:

  • 00-04 Исключения процессора, включая NMI. В более поздних процессорах (80186, 286, ...) этот диапазон расширился, перекрыв следующие диапазоны.
  • 08-0F Это аппаратные прерывания, обычно называемые IRQ0-7. ПК-AT добавил IRQ8-15
  • 10-1F вызовы BIOS. Концептуально это можно считать системными вызовами, поскольку BIOS является частью DOS, которая зависит от конкретной машины (именно так она была определена в CP / M).
  • 20-2F DOS звонки. Некоторые из них мультиплексированы и предлагают множество функций. Основным является INT 21h, который предлагает большинство услуг DOS.
  • 30-FF Остальное, для использования внешними драйверами и пользовательскими программами.
0 голосов
/ 24 сентября 2010

Если быть точным, вот прямая ссылка на список команд INT 21H Р. Брауна: http://www.ctyme.com/intr/int-21.htm

...