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.