Открыть сервис

Task State Segment

Task State Segment (TSS, сегмент состояния задачи) — это аппаратная структура данных в архитектуре x86 (начиная с процессора 80286), используемая для хранения контекста выполнения задачи (потока или процесса) и поддержки механизма аппаратного переключения задач. TSS является ключевым элементом системы защиты и многозадачности в защищённом режиме работы процессора.

Назначение и роль в архитектуре

TSS предназначен для сохранения полного состояния процессора (регистров, сегментных указателей, флагов) при переключении между задачами. В отличие от программного сохранения контекста (через стек), аппаратное переключение через TSS выполняется одной инструкцией (JUMP или CALL с селектором TSS), что обеспечивает атомарность и быстродействие. Однако на практике, начиная с процессоров Pentium, операционные системы чаще используют программное переключение (через прерывания и сохранение контекста вручную), так как аппаратное переключение через TSS имеет ограничения по производительности и гибкости.

TSS также выполняет функцию сторожевого таймера (I/O Permission Bitmap) для контроля доступа к портам ввода-вывода.

Структура TSS

TSS представляет собой блок памяти фиксированного размера (104 байта для 32-битной архитектуры, 108 байт для 64-битной). Поля TSS включают:

  • Регистры общего назначения: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI (в 32-битном режиме).
  • Сегментные регистры: CS, SS, DS, ES, FS, GS.
  • Регистр флагов: EFLAGS.
  • Регистр-указатель инструкции: EIP.
  • Регистр CR3 (Page Directory Base Register) — для управления виртуальной памятью задачи.
  • Указатель на предыдущий TSS (для цепочек переключений).
  • Поля для управления стеком: SS0, ESP0 (для стека уровня 0), SS1, ESP1 (уровень 1), SS2, ESP2 (уровень 2). Используются при переключении уровней привилегий.
  • Битовая карта разрешений ввода-вывода (I/O Permission Bitmap) — массив битов, определяющих, какие порты ввода-вывода доступны задаче.

В 64-битном режиме (Long Mode) TSS упрощён: он содержит только поля для стеков привилегий (RSP0, RSP1, RSP2) и битовую карту I/O, а также поле IST (Interrupt Stack Table) для обработки прерываний. Регистры общего назначения не сохраняются — контекст задач управляется программно.

Механизм работы

Создание и инициализация

TSS создаётся операционной системой или загрузчиком в защищённом режиме. Для каждой задачи (потока или процесса) выделяется отдельный TSS. Адрес TSS загружается в дескриптор TSS в GDT (Global Descriptor Table) или LDT (Local Descriptor Table). Селектор TSS (индекс в GDT/LDT) используется для переключения задач.

Переключение задач

Переключение задач может быть инициировано:

  • Инструкцией JMP или CALL с селектором TSS.
  • Прерыванием или исключением, если в IDT (Interrupt Descriptor Table) указан селектор TSS.
  • Инструкцией IRET, если флаг NT (Nested Task) установлен в EFLAGS.

При переключении процессор:

  1. Сохраняет текущее состояние (регистры) в TSS текущей задачи.
  2. Загружает новое состояние из TSS целевой задачи.
  3. Обновляет регистр TR (Task Register), указывающий на текущий TSS.
  4. Устанавливает флаг NT (Nested Task) для отслеживания вложенных задач.

Уровни привилегий и стеки

TSS содержит указатели на стеки для каждого уровня привилегий (Ring 0, 1, 2). При переключении с менее привилегированного кольца на более привилегированное (например, при системном вызове) процессор автоматически загружает стек из TSS (SS0, ESP0 для Ring 0). Это предотвращает повреждение стека задачи при обработке исключений или прерываний.

Битовая карта ввода-вывода

Поле I/O Permission Bitmap (длиной до 8192 бит) определяет, какие порты ввода-вывода доступны задаче. Если бит установлен в 1, доступ к порту разрешён; если в 0 — запрещён. Это позволяет ограничить прямой доступ к аппаратным ресурсам для непривилегированных задач.

Применение в операционных системах

Linux

В ядре Linux TSS используется в основном для управления стеками привилегий и битовой картой I/O. Аппаратное переключение задач через TSS не применяется — контекст переключается программно через switch_to макрос. Каждое ядро процессора (CPU) имеет один TSS, который хранит стеки для уровней 0, 1, 2 и битовую карту I/O. При переключении задач на одном ядре TSS не меняется, так как контекст сохраняется в структуре task_struct.

Windows

В Windows NT TSS также используется в минимальном объёме. Ядро создаёт один TSS на процессор, который содержит стеки для Ring 0 и битовую карту I/O. Аппаратное переключение задач не применяется — контекст переключается программно через SwapContext.

FreeBSD

Аналогично Linux и Windows, FreeBSD использует TSS только для стеков привилегий и I/O bitmap. Аппаратное переключение задач не поддерживается.

Ограничения и критика

  • Размер и накладные расходы: TSS занимает 104 байта на задачу, что при большом количестве задач (тысячи) приводит к значительному расходу памяти. В 64-битном режиме размер уменьшен до 108 байт, но проблема сохраняется.
  • Производительность: Аппаратное переключение задач через TSS медленнее программного из-за необходимости сохранять/загружать все регистры, включая CR3. Современные ОС предпочитают программное переключение с выборочным сохранением регистров.
  • Гибкость: TSS жёстко задаёт формат контекста, что не позволяет ОС добавлять собственные поля (например, счётчики времени, идентификаторы задач). Программное переключение даёт полный контроль над структурой контекста.
  • Совместимость: В 64-битном режиме (Long Mode) TSS не поддерживает сохранение регистров общего назначения, что делает его бесполезным для аппаратного переключения задач. Это подтверждает отказ Intel от данной функции.

Интересные факты

  • В процессорах 80286 TSS был обязателен для работы в защищённом режиме — без него невозможно было переключение задач.
  • В архитектуре x86-64 (AMD64) TSS был переработан: удалены регистры общего назначения, добавлены поля IST (Interrupt Stack Table) для обработки прерываний.
  • Некоторые ранние операционные системы (например, OS/2) активно использовали аппаратное переключение через TSS для многозадачности.
  • В современных ОС TSS часто называют «заглушкой» (dummy TSS), так как его основная функция — управление стеками привилегий — может быть реализована через MSR (Model-Specific Registers) в 64-битном режиме.

Источники

  • Intel 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A: System Programming Guide, Chapter 7 (Task Management).
  • AMD64 Architecture Programmer’s Manual, Volume 2: System Programming, Chapter 8.
  • «Understanding the Linux Kernel» (3rd edition), Daniel P. Bovet, Marco Cesati.
  • «Windows Internals» (7th edition), Pavel Yosifovich, Mark E. Russinovich, David A. Solomon, Alex Ionescu.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →