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