Как процессор обнаруживает стек ядра, чтобы помещать в него регистры во время обработки прерываний? - PullRequest
0 голосов
/ 17 ноября 2018

Поток перехватывает ядро ​​с INT 80; шлюз прерываний используется для изменения привилегированного кольца и CS: RIP; старые значения помещаются в стек.

Я нашел это:

'Когда поток входит в ядро, текущее значение стека пользовательского режима (SS: ESP) и указатель инструкций (CS: EIP) сохраняются в стек режима ядра потока, а ЦП переключается на ядро. стек -режима - с помощью системного вызова int $ 80 это делает сам процессор. Остальные значения регистров и флаги затем также сохраняются в стеке ядра. '

Как процессор узнает адрес стека режима ядра потока, чтобы сделать это? Единственное место, где я могу думать о том, где хранится указатель стека режима ядра, - это TCB, но как CPU узнает, где найти TCB для текущего потока. Относится ли это к одному TCB в фиксированном и известном месте?

1 Ответ

0 голосов
/ 17 ноября 2018

Примечание: все это "80x86 специфично" (разные ЦП, например, ARM, разные), и для 80x86 есть (на практике незначительные) различия между защищенным режимом (используется для 32-битных ядер) и длиннымmode (используется для 64-битных ядер).

ЦП имеет регистр задач, который отслеживает (виртуальный) адрес структуры, называемой сегментом состояния задачи.Для длительного режима;эта структура содержит значение для загрузки в RSP при переходе на более высокий уровень привилегий и при использовании функции таблицы стеков прерываний CPU.

Когда происходит любое прерывание, CPU получает информацию из соответствующей записи в таблице дескрипторов прерываний (включая определение уровня привилегий для переключения и использования прерывания с использованием функции таблицы стеков прерываний);затем (если стек изменяется) использует соответствующее поле в Сегменте состояния задачи (находится через. Регистр задач), чтобы определить, что загружать в RSP.

Во время загрузки ядро ​​создает эти массивы иструктуры для CPU (IDT, TSS) и задает регистр задач;и во время переключения задач ядро ​​изменяет поле RSP0 в TSS (которое определяет, что загружать в RSP, когда ЦП переключается с более низкого уровня привилегий на CPL = 0), так что это различное значение для каждой задачи (поэтомучто каждая задача имеет свой стек ядра).Внутренне ядро ​​будет иметь некоторую другую структуру данных («блок управления задачами»), которая отслеживает значение для копирования в поле RSP0 во время переключений задач.

...