Почему потоки Windows NT имеют отдельные стеки режима пользователя и режима ядра?

В Windows Internals, 6th Edition от Microsoft Press говорится, что в Windows NT каждый поток имеет 2 стека: один используется при работе в пользовательском режиме, а другой — в режиме ядра.

Почему это так? Кажется, что стек пользовательского режима также можно использовать во время системного вызова. Есть ли какие-то преимущества в этой конструкции?


person Alex D    schedule 07.08.2014    source источник
comment
Потому что поток почти мгновенно рухнет, если этого не сделать. Код режима ядра использует совсем другое отображение виртуальной памяти. Получение кода ядра для доступа к пользовательскому адресному пространству процесса, который выполняет вызов, требует его явного сопоставления. Каждый создаваемый вами поток автоматически получает стек режима ядра размером 24 КБ, чтобы он мог выполнять системные вызовы.   -  person Hans Passant    schedule 07.08.2014
comment
@HansPassant, то есть, по сути, ядро ​​​​не может вернуться в пользовательский код, используя адрес возврата, помещенный в пользовательский стек, потому что это адрес в пространстве виртуальной памяти процесса, а не в пространстве памяти ядра? Это ответ, вы должны опубликовать его как таковой.   -  person Alex D    schedule 07.08.2014
comment
@HansPassant, точнее, поток получает стек 24 КБ в 64-битной операционной системе и 12 КБ в 32-битной операционной системе.   -  person Roy Miloh    schedule 14.09.2015


Ответы (1)


Основная причина в том, что режим ядра не может доверять пользовательскому режиму. Если бы ядро ​​использовало стек пользовательского режима, какой-нибудь другой поток пользовательского режима мог бы отслеживать значения в этом стеке и изменять их по своему желанию. Для вредоносных программ было бы тривиально получить полный контроль над системой.

person 1000 Bites    schedule 10.08.2014
comment
Это имеет большой смысл. Спасибо! - person Alex D; 12.08.2014