O Torvalds Linus

Сайт о *nix системах и всем что с ними связано

В архитектуре 80×86 имеется специальный тип сегмента для хранения аппаратных контекстов —сегмент состояния задачи, или сегмент TSS (Task State Segment). Хотя операционная система Linux не применяет аппаратное переключение контекста, она все же вынуждена устанавливать сегмент состояния задачи для каждого процессора в системе. Это делается, в основном, по двум причинам:

когда процессор 80×86 переключается из пользовательского режима в режим ядра, он извлекает адрес стека режима ядра из сегмента TSS;

когда процесс в пользовательском режиме пытается обратиться к порту ввода/вывода с помощью инструкции in или out, процессору, возможно, понадобится обратиться к битовой карте разрешений ввода/вывода, хранящейся в сегменте состояния задачи, чтобы убедиться, что процессу разрешено обращаться к этому порту; точнее говоря, когда процесс выполняет в пользовательском режиме инструкцию ввода/вывода in или out, управляющий блок производит следующие действия:

•проверяет двухбитовое поле iopl в регистре efiags. Если оно содержит 3, управляющий блок выполняет инструкции ввода/вывода. В противном случае он делает следующую проверку;

•читает регистр tr, чтобы определить текущий сегмент состояния задачи и, следовательно, нужную битовую карту разрешений ввода/вывода;

•в битовой карте разрешений ввода/вывода проверяет бит, соответствующий порту ввода/вывода, указанному в инструкции. Если бит сброшен, инструкция выполняется; в противном случае управляющий блок возбуждает исключение “Общий сбой защиты”.

Структура tss struct описывает формат сегмента TSS. Как было сказано ранее, массив init tss хранит по одному сегменту TSS на каждый процессор в системе. При переключении процессов ядро обновляет некоторые поля сегмента TSS, чтобы управляющий блок соответствующего процессора мог без опасений читать необходимую ему информацию. Таким образом, сегмент состояния задачи отражает привилегии текущего процесса на процессоре, но при этом нет необходимости сопровождать TSS – сегменты процессов, когда они не работают.

Он включает в себя 32 – битовое поле Base, которое указывает на начало сегмента TSS, и 20 – битовое поле Limit. Флаг s дескриптора TSS – сегмента сброшен, чтобы отметить тот факт, что соответствующий TSS – сегмент является системным сегментом (см. главу 2).

Поле туре равно или 9, или 11. Это означает, что сегмент является сегментом состояния задачи. Согласно оригинальному подходу Intel, каждый процесс в системе должен иметь собственный сегмент состояния задачи, и второй младший бит поля туре называется битом занятости. Он равен единице, когда процесс выполняется на процессоре, и нулю в противном случае. Согласно подходу Linux, у каждого процессора есть только один сегмент состояния задачи, и бит занятости всегда равен 1.

Дескрипторы сегментов TSS, созданных Linux, хранятся в глобальной таблице дескрипторов (Global Descriptor Table, GDT), базовый адрес которой хранится в регистре gdtr каждого процессора. Регистр tr каждого процессора содержит селектор дескриптора соответствующего сегмента TSS. Этот регистр также имеет два скрытых непрограммируемых поля, поля Base и Limit дескриптора сегмента TSS. Это позволяет процессору обращаться к сегменту состояния задачи напрямую, не извлекая его адрес из глобальной таблицы дескрипторов.

Add A Comment