Как отображаются виртуальные адреса, соответствующие стеку ядра?

Виртуальное адресное пространство каждого процесса состоит из пространства пользователя и пространства ядра. Как указывается во многих статьях, пространство ядра всех процессов отображается на один и тот же физический адрес в памяти, то есть в физической памяти есть только одно ядро. Но у каждого процесса есть свой собственный стек ядра, который является частью пространства ядра. Как одно и то же отображение работает для всех процессов с разными стеками ядра?


person Sudeep Agarwal    schedule 10.06.2020    source источник


Ответы (1)


Примечание. Это ответ, не зависящий от ОС. Детали немного различаются в зависимости от рассматриваемой ОС (например, Darwin и продолжения ...) и, возможно, от архитектурных (ARMv8, x86 и т. Д.) Реализаций.

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

Вы правы, говоря, что существует только одно пространство ядра. Далее следует, что (теоретически) один поток в пространстве ядра может легко видеть и / или вмешиваться в работу любых других в пространстве ядра (точно так же, как одни и те же потоки процесса могут «видеть» друг друга в пространстве пользователя). Однако это (почти всегда) только теоретически, поскольку код ядра предположительно учитывает границы памяти (как предполагается, в пользовательском режиме, с локальным хранилищем потока и т. д.). Тем не менее, «почти всегда», потому что, если код ядра может быть использован, вся память ядра будет открыта для эксплуататора и потенциально может быть прочитана и / или скомпрометирована.

person Technologeeks    schedule 10.06.2020