Почему Linux не использует аппаратное переключение контекста через TSS?

Я прочитал следующее утверждение:

Архитектура x86 включает в себя определенный тип сегмента, называемый сегментом состояния задачи (TSS), для хранения контекстов оборудования. Хотя Linux не использует аппаратные переключатели контекста, тем не менее, он вынужден устанавливать TSS для каждого отдельного процессора в системе.

Мне интересно:

  • Почему Linux не использует аппаратную поддержку для переключения контекста?
  • Разве аппаратный подход не намного быстрее, чем программный?
  • Есть ли ОС, которая использует аппаратное переключение контекста? Windows использует это?

Наконец и как всегда, спасибо за ваше терпение и ответ.

----------- Добавлена ​​--------------

http://wiki.osdev.org/Context_Switching получил некоторое объяснение.

Люди, столь же растерянные, как и я, могли взглянуть на это. 8^)

3 ответа

Решение

X86 TSS очень медленный для аппаратной многозадачности и практически не дает преимуществ по сравнению с программным переключением задач. (На самом деле, я думаю, что делать это вручную намного лучше TSS)

TSS известен также тем, что с ним надоедает и утомительно работать, и он не переносим даже на x86-64. Linux стремится работать с несколькими архитектурами, поэтому они, вероятно, решили использовать программную коммутацию задач, потому что она может быть написана машинно-независимым способом. Кроме того, переключение между программными задачами обеспечивает гораздо больше возможностей по сравнению с тем, что может быть сделано, и, как правило, его легче настроить, чем TSS.

Я считаю, что Windows 3.1 использовала TSS, но, по крайней мере, ядро ​​NT >5 этого не делает. Я не знаю ни одной Unix-подобной ОС, которая использует TSS.

Обратите внимание, что TSS является обязательным. Однако операционная система создает единственную запись TSS (на процессор), и каждый раз, когда им нужно переключать задачи, они просто меняют эту единственную TSS. А также единственные поля, используемые в TSS при переключении программных задач: ESP0 а также SS0, Это используется для получения звонка 0 из кода звонка 3 для прерываний. Без TSS не было бы известного стека Ring 0, который, конечно, привел бы к GPF и в конечном итоге к тройному отказу.

В Linux раньше использовалась коммутация на основе HW, до временного интервала до 1.3. Я считаю, что переключение контекста на основе SW оказалось более быстрым и более гибким.

Другая причина, возможно, сводила к минимуму специфичный для арки код. Первым портом Linux для архитектуры, отличной от x86, был Alpha. У Alpha не было TSS, поэтому можно было бы поделиться большим кодом, если бы все арки использовали переключение SW. (Только предположение.) К сожалению, журналы изменений ядра за период 1.2-1.3 не сохранились, поэтому я не могу быть более конкретным.

Linux не использует модель сегментированной памяти, поэтому эта особенность сегментации не используется.

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

Linux настолько сосредоточен на эффективности, что вы можете поспорить, что кто-то профилировал все возможные варианты, и что используемые в настоящее время варианты являются наилучшим доступным компромиссом.

Другие вопросы по тегам