O Torvalds Linus

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

В то время как адресное пространство у каждого процесса свое, всем процессам приходится делить между собой регистры процессора. Аппаратный контекст является подмножеством контекста выполнения процесса, включающего в себя всю информацию, необходимую для выполнения процесса. В Linux часть аппаратного контекста процесса хранится в дескрипторе процесса, а остальная его часть —в стеке режима ядра.

Далее в тексте мы подразумеваем, что локальная переменная prev ссылается на дескриптор процесса, с которого происходит переключение, а переменная next —на дескриптор замещающего процесса, т. е. процесса, на который происходит переключение. Тогда мы может определить переключение процессов как действия по сохранению аппаратного контекста процесса prev и замене его на аппаратный контекст процесса next.

В старых версиях Linux использовалась аппаратная поддержка, предлагаемая архитектурой 80×86. Переключение процессов производилось с помощью инструкции far jmp5, выполнявшей переход на селектор дескриптора сегмен

та состояния (задачи), принадлежащего процессу next. При выполнении этой инструкции процессор производит переключение аппаратного контекста, автоматически сохраняя старый аппаратный контекст и загружая новый. Однако в Linux 2.6 применяется программное переключение процессов, и тому есть причины:

пошаговое переключение, выполняемое с помощью последовательности инструкций mov, обеспечивает более строгий контроль допустимости загружаемых данных. В частности, имеется возможность проверить значения сегментных регистров ds и es, которые могут быть подделаны злонамеренным пользователем. Такой тип проверки невозможен, когда применяется одиночная инструкция far jmp;

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

Содержимое всех регистров, использованных процессом в режиме пользователя, уже сохранено в стеке режима ядра до переключения. Это относится и к содержимому пары регистров ss и esp, которая определяет адрес указателя на стек режима пользователя.

 

Add A Comment