Структура thread_struct
содержит два из этих полей ESP
: esp0
и esp
. Однако они относятся к четырем полям в структуре tss_segment_32
, к которым относятся esp0
, esp1
, esp2
и esp
.
Они действительно существуют в TSS, так что это в значительной степени что-то от Intel, а не что-то от Линуса и др.
Относительно того, почему TSS содержит их, цифры логичны, если вы знаете, как работает модель защиты в x86. Фактически это уровни вызова (за исключением esp
, который предназначен для уровня вызова 3, несмотря на то, что он на самом деле не называется esp3
).
Другими словами, они содержат указатель стека, который будет использоваться в кольце, в котором вы выполняете. Поскольку Linux использует только кольцо 0 (режим ядра) и кольцо 3 (режим пользователя), esp0
и esp
единственные, которые нужно сохранить.
Кроме того, я думаю, что единственной операционной системой, которую я когда-либо видел, использующей другое кольцо, была OS / 2, которая использовала кольцо 2 для определенных операций ввода-вывода. Процессы, которым было разрешено выполнять эти операции, должны были быть специально помечены, и ОС запускала их в кольце 2, чтобы обеспечить беспрепятственный доступ к вводу / выводу, не позволяя отключить ядро.