Я считал следующее утверждение:
x86 архитектура включает определенный тип сегмента, названный Сегментом состояния задачи (TSS), для хранения аппаратных контекстов. Хотя Linux не использует аппаратные контекстные переключения, он, тем не менее, вынужден настроить TSS для каждого отличного ЦП в системе.
Я задаюсь вопросом:
Наконец и как всегда, спасибо за Ваше терпение и ответ.
-----------Добавленный--------------
http://wiki.osdev.org/Context_Switching получил некоторое объяснение.
Люди, столь смущенные, как я мог смотреть на него. 8^)
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 не было бы известного стека кольца 0, что, конечно, привело бы к GPF и, в конечном счете, к тройной ошибке.
Linux не использует модель сегментированной памяти, поэтому эта особенность сегментации не используется.
Процессоры x86 имеют много различных видов аппаратной поддержки для переключения контекста, поэтому различие заключается не в аппаратном и программном обеспечении, а в том, как ОС использует различные доступные аппаратные функции. Необязательно использовать их все.
Linux настолько сфокусирован на эффективности, что можно поспорить, что кто-то профилировал все возможные варианты, и что используемые в настоящее время варианты являются наилучшим доступным компромиссом.
В Linux использовалась HW-коммутация в iirc временного интервала до 1.3. Я считаю, что переключение контекста на основе SW оказалось более быстрым и более гибким.
Другой причиной могло быть сведение к минимуму кода, специфичного для архитектуры. Первым портом Linux на архитектуру, отличную от x86, была Alpha. У Alpha не было TSS, поэтому можно было бы совместно использовать больше кода, если бы все арки использовали переключение SW. (Просто предположение.) К сожалению, журналы изменений ядра для периода ядра 1.2–1.3 плохо сохранились, поэтому я не могу быть более конкретным.