2009-08-07 6 views
5

Вдохновленный этим вопросомЧто такое INT 21h?

How can I force GDB to disassemble?

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

+0

Другое сообщение, на которое вы ссылаетесь, на самом деле не имеет особого отношения к INT 21h - это не то, с чем вы столкнетесь, если не будете возиться с 16-битным DOS-кодом. Другие операционные системы также используют прерывание для системных вызовов, хотя не 21h - и не-древние процессоры OS + вместо этого используют новую инструкцию SYSCALL. – snemarch

ответ

12

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

3

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

1

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

7

Ralph Brown's interrupt list содержит много информации о том, что прерывает. int 21, как и все другие, поддерживает широкий диапазон функциональных возможностей в зависимости от значений регистра.

A non-HTML version of Ralph Brown's list также доступен.

2

Это от большого The Art of Assembly Language Programming о прерываниях:

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

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

Chapter 17 - Interrupt Structure and Interrupt Service Routines

2

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).

+1

Консоль Windows не поддерживает эмуляцию DOS - приложения в консольном режиме - это полноценные 32-битные приложения Windows. 'command.com! = cmd.exe' :) - 32-битные версии Windows имеют NTVDM, хотя и предлагают эмуляцию DOS. – snemarch

1

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

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

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

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

9

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

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

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

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

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

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

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

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

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

0

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

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

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

  • Аппаратные прерывания: устройство запрашивает у центрального процессора запрос на прерывание.
  • Исключения процессора: Если происходит какое-то ненормальное состояние ЦП, например деление на ноль, ошибка страницы, ... CPU переходит к соответствующему обработчику прерываний, поэтому ОС может делать все, что ему нужно (отправить сигнал на процесс, загрузить страницу из свопа и обновить таблицу 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. PC-AT добавлен IRQ8-15
  • 10-1F Запросы BIOS. Концептуально это можно рассматривать как системные вызовы, поскольку BIOS является частью DOS, которая зависит от конкретной машины (так было определено в CP/M).
  • 20-2F DOS-звонки. Некоторые из них мультиплексированы и предлагают множество функций. Основной из них - INT 21h, который предлагает большинство услуг DOS.
  • 30-FF В остальном для использования внешними драйверами и программами пользователей.