ворота задачи, ворота прерывания, ворота вызова - PullRequest
6 голосов
/ 13 июля 2011

Я пытался прочитать больше о различных воротах в архитектуре x86. Если я правильно понимаю, то прерывания и trap gate используются для обработки прерываний hw и sw соответственно. Принимая во внимание, что CALL gate, вероятно, больше не используется, поскольку ppl предпочитает заменять SYSENTER и SYSEXIT.

Мне было интересно, как используются ворота задач (я знаю, что они используются для переключения задач hw). Что это значит? Относится ли задача hw к задаче / процессу ОС. Или это больше похоже на переключение между двумя разными экземплярами операционной системы. (Может быть на серверах.)?

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

Спасибо

Ответы [ 2 ]

7 голосов
/ 14 июля 2011

Все, что вы можете знать о прерываниях и гейтах, содержится в руководстве разработчика Intel, том 3 . Короче говоря:

  • Ворота задач изначально разрабатывались как опосредованный процессором способ выполнения переключения задач; CPU может автоматически записывать состояние процесса во время операции переключения задач. Они обычно не используются в современных операционных системах; ОС обычно выполняет операции сохранения состояния самостоятельно.
  • По крайней мере в Linux все обработчики прерываний находятся в пространстве ядра и выполняются в кольце 0. Если вы хотите обработать исключение деления на ноль, вы регистрируете обработчик сигнала пользовательского пространства для SIGFPE; обработчик прерываний пространства ядра генерирует сигнал SIGFPE, косвенно вызывая код обработчика пользовательского пространства (код пользовательского пространства выполняется после возврата из обработчика прерываний).
5 голосов
/ 23 декабря 2012

Ситуация такова, что на самом деле использовались только шлюзы прерываний и ловушек, и теперь они используются.Теоретически, они оба могут использоваться как для обработки событий, так и для обработки событий.Единственная разница между ними заключается в том, что вызов шлюза прерываний автоматически запрещает будущие прерывания, что может быть полезно в некоторых случаях обработки аппаратных прерываний.По умолчанию люди пытаются использовать шлюзы-ловушки, потому что ненужное отключение прерываний - это плохо, потому что отключение прерываний увеличивает задержки обработки прерываний и увеличивает вероятность потери прерываний.Вызов ворот никогда не был в фактическом использовании.Это неудобный и неоптимальный способ реализации системных вызовов.Вместо вызова 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 для каждого переключателя задач, что приведет к значительному снижению производительности.Если вы хотите обрабатывать прерывания таким же образом, вы будете вынуждены делить обработчики прерываний между всеми задачами с одинаковыми адресами.Как нежелательное последствие, любая задача в системе сможет повредить обработчик.

...