Ситуация такова, что на самом деле использовались только шлюзы прерываний и ловушек, и теперь они используются.Теоретически, они оба могут использоваться как для обработки событий, так и для обработки событий.Единственная разница между ними заключается в том, что вызов шлюза прерываний автоматически запрещает будущие прерывания, что может быть полезно в некоторых случаях обработки аппаратных прерываний.По умолчанию люди пытаются использовать шлюзы-ловушки, потому что ненужное отключение прерываний - это плохо, потому что отключение прерываний увеличивает задержки обработки прерываний и увеличивает вероятность потери прерываний.Вызов ворот никогда не был в фактическом использовании.Это неудобный и неоптимальный способ реализации системных вызовов.Вместо вызова gate, большинство операционных систем используют команды trap gate (int 0x80 в Linux и int 0x2E в Windows) или инструкции sysenter / sysexit syscall / sysrt.Ворота задач тоже никогда не использовались.Это не оптимальная, неудобная и ограниченная функция, если не уродливая.Вместо этого операционные системы обычно реализуют переключение задач на собственной стороне путем переключения стеков задач режима ядра.Первоначально Intel предоставила аппаратную поддержку многозадачности, внедрив TSS (Task State Segment) и Task Gate.Согласно этим функциям, процессор может автоматически сохранять состояние одной задачи и восстанавливать состояние другой в ответ на запрос, полученный от hw или sw.Запрос Sw может быть выполнен путем выдачи инструкций call или jmp с селектором TSS или селектором ворот задачи, используемым в качестве операнда команды.Запрос Hw может быть выполнен аппаратным подключением к воротам задач в соответствующей записи IDT.Но, как я уже упоминал, никто не использует его.Вместо этого операционные системы используют только один TSS для всех задач (TSS должен использоваться в любом случае, потому что во время передачи управления из менее привилегированного сегмента в стеки коммутатора ЦП с более привилегированным сегментом и он захватывает адрес стека для более привилегированного сегмента изTSS) и выполнить переключение задач вручную.
Теоретически прерывания и исключения могут обрабатываться в пользовательском режиме (кольцо 3), но на практике это бесполезно, и операционная система обрабатывает все такие события на стороне ядра.(в кольце 0).Причина проста: обработчики прерываний и исключений должны всегда находиться в памяти и быть доступными из любого адресного пространства.Часть ядра адресного пространства является общей и одинаковой во всех адресных пространствах всех задач в системе, но пользовательская часть адресного пространства связана с конкретной задачей.Если вы хотите обработать исключение в пользовательском режиме, вам придется перепрограммировать IDT для каждого переключателя задач, что приведет к значительному снижению производительности.Если вы хотите обрабатывать прерывания таким же образом, вы будете вынуждены делить обработчики прерываний между всеми задачами с одинаковыми адресами.Как нежелательное последствие, любая задача в системе сможет повредить обработчик.