в ядре linux структура данных thread_struct содержит как поля esp0, так и esp, в чем разница?

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

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

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

Верна ли моя догадка?


person Infinite    schedule 17.01.2011    source источник


Ответы (1)


Структура thread_struct содержит два из этих ESP полей: esp0 и esp. Однако они относятся к четырем полям в структуре tss_segment_32: esp0, esp1, esp2 и esp.

На самом деле они существуют в TSS, так что это скорее что-то от Intel, чем от Linus et al.

Что касается того, почему TSS содержит их, цифры логичны, если вы знаете, как работает модель защиты под x86. На самом деле это уровни кольца (кроме esp, который соответствует уровню кольца 3, несмотря на то, что на самом деле он не называется esp3).

Другими словами, они содержат указатель стека для использования в кольце, в котором вы выполняете. Поскольку Linux использует только кольцо 0 (режим ядра) и кольцо 3 (режим пользователя), esp0 и esp — единственные, которые должны быть спасен.


Кроме того, я думаю, что единственной ОС, которую я когда-либо видел, использующей другое кольцо, была OS/2, которая использовала кольцо 2 для определенных операций ввода-вывода. Процессы, которым разрешено выполнять эти операции, должны были быть специально помечены, и ОС должна была запускать их в кольце 2, чтобы обеспечить беспрепятственный доступ к вводу-выводу, не допуская остановки ядра.

person paxdiablo    schedule 19.01.2011