в ядре Linux структура данных thread_struct содержит поля esp0 и esp, в чем разница? - PullRequest
3 голосов
/ 17 января 2011

Это мое предположение:

esp0 инициализируется с помощью topr стека ядра. когда стек ядра выделен и используется во время переключения процессов для инициализации tss-> esp0, так что когда контекст переключается из режима пользователя в режим ядра, может быть найден стек ядра; в то время как esp используется для сохранения вершины стека ядра процесса, который должен быть запланирован во время переключения процесса.

Таким образом, esp0 в thread_struct не изменяется после инициализации, в то время как esp изменяется.

Правильно ли мое предположение?

1 Ответ

1 голос
/ 19 января 2011

Структура 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, чтобы обеспечить беспрепятственный доступ к вводу / выводу, не позволяя отключить ядро.

...