Каждая подпрограмма, вызываемая ОС, создает свой собственный «стек»? - PullRequest
0 голосов
/ 05 февраля 2011

Извините, простой вопрос, но он всегда смущает меня, когда я говорю о теории операционных систем.

В моей книге утверждается, что вход в систему возможен благодаря использованию «стека» - означает ли это, что существует один «стек» и каким-то образом он используется всеми подпрограммами, или «стек» относится к абстрактной идее стека, и стек создается и сохраняется в основной памяти каждый раз, когда вызывается какая-то подпрограмма? (Предполагая, что это необходимо).

А как обстоят дела с указателем стека в процессоре в этом случае? Как это работает, в любом из этих случаев?

Извиняюсь за нечеткость моего описания, вся идея как бы окутана противоречивыми для меня идеями!

1 Ответ

2 голосов
/ 05 февраля 2011

Это зависит от платформы (зависит от используемого аппаратного и программного обеспечения).

Windows на x86 / x64 имеет память для системного стека, готовую для каждого потока. Он используется каждый раз, когда вы выполняете системный вызов в этом потоке.

Система возвращается, когда несколько независимых процессов или потоков могут вызывать системные подпрограммы одновременно. В этом случае каждый из этих потоков использует свой собственный системный стек. Системный стек (технически стек 0) не зависит от стека пользовательского режима (кольцо 3).

Я также могу предоставить больше информации, просто спросите, хотите ли вы знать что-то более конкретное.

Указатель стека:

  • Во время нормального выполнения каждый поток имеет свой собственный нормальный стек и собственный указатель стека. Он перемещается вниз при каждом вызове и т. Д.
  • Когда один конкретный поток вызывает подпрограмму операционной системы, текущее значение указателя стека сохраняется, а указатель стека устанавливается на всегда один и тот же адрес - стек системы (кольцо 0).
  • Каждый поток имеет свой собственный системный стек (кольцо 0).
  • Когда системный вызов завершается, восстанавливается исходное значение указателя стека. Поэтому здесь мы фактически отказываемся от системного стека и возвращаемся к обычному стеку.
  • Размер "нормального" стека устанавливается в компиляторе / компоновщике. Это может вырасти до мегабайт. Но системный стек имеет ограниченный статический размер, и вы никогда не сможете изменить его местоположение или размер. Он создан точно настолько большой, что подойдет любой системный вызов.
  • Если одна системная подпрограмма внутренне вызывает другую системную подпрограмму, это обнаруживается аппаратно и вызывается напрямую, т. Е. В этом случае не выполняется специальное расположение указателей стека.
...