Бит режима ядра

Бит режима ядра

Я прочитал нижеследующее в книге «Операционные системы и концепции» Гэлвина

«Бит, называемый битом режима, добавляется к оборудованию компьютера для указания текущего режима: ядро ​​(0) или пользователь (1). С помощью бита режима мы можем различать задачу, которая выполняется от имени операционной системы, и задачу, которая выполняется от имени пользователя».

Теперь, если это многопроцессорная система, предположим, что процесс выполняет системный вызов и изменяет бит режима с 1 на 0.

Теперь в пользовательском режиме могут параллельно работать и другие процессы, поскольку это многопроцессорная система, но бит режима установлен на 0, что указывает на режим ядра, что приводит к несогласованности.

Так зависит ли количество регистров (необходимых для хранения бита режима) от количества процессоров?

решение1

Ваша книга слишком упрощает вещи. В действительности, это зависит от ЦП, как установлен режим, и это не обязательно "бит" вообще, и не обязательно есть только два режима.

Для целей вопроса предположим, что это Linux, Intel x86 и многоядерный процессор.

Многозадачность реализована с помощью переключения контекста, которое в Linux основано на программном обеспечении. Переключение контекста просто останавливает то, что делает процессор (ядро или cpu), сохраняет его состояние в RAM, а затем заменяет его другим контекстом.

x86 реализует кольца защиты, которые могут быть установлены на каждом процессоре до выполнения на уровне процесса. Ядро Linux обрабатывает это, устанавливая процессы на кольцо 3 (непривилегированный) перед началом выполнения в их пространстве памяти. Благодаря реализации переключения контекста, упомянутой ранее, ядро ​​поддерживает концепцию процесса, работающего в определенном потоке (часто 2 потока на ядро ​​с Intel), поскольку когда бы ни выполнялся код этой программы, ядро ​​всегда устанавливает кольцо обратно на 3, даже если процессор видит, что переключения контекста происходят много раз в секунду, так что многие процессы будут работать на одном и том же ядре. Оно может сделать это по сути тем же способом с одним или несколькими ядрами.

В Linux с x86, когда поток хочет переключиться с кольца 3 на кольцо 0 (супервизор), он может сделать это только с помощью программного прерывания. В кольцах 1 и 2 это также возможно с помощью специальных инструкций, но Linux не реализует это. Поскольку Linux управляет обработчиком программного прерывания, он может гарантировать, что даже если поток теперь находится в кольце 0, он выполняет только код в «пространстве ядра», то есть в коде, который является частью ядра, даже если это тот же поток, который выполнял код пользовательского пространства. На языке операционной системы это просто называется системным вызовом, поскольку это то, что он на самом деле делает. Хотите ли вы рассматривать это как «процесс», переключающийся в режим ядра и обратно, или что процесс фактически приостановлен, потому что выполняется только код пространства ядра, пока он не перейдет обратно в пространство пользователя, решать вам.

Поскольку x86 позволяет тем, кто находится в верхних кольцах, переключаться на нижние, он может затем переключиться обратно на 3 после завершения обработки прерываний. Это то, что происходит со всеми системными вызовами, поэтому все системные вызовы с точки зрения оборудования могут делать что угодно в системе. Он может выполнить каждую инструкцию вашей программы в обратном порядке, а затем удалить весь ваш код из памяти, если захочет. Или он может переключиться на кольцо 0 и начать выполнение в начале вашей программы. Как вы можете видеть, эти примеры нарушают идею режима «ядро/пользователь», поскольку такой концепции не существует в оборудовании. Однако в Linux это всегда реализовано как вызов в пространство ядра и возврат в пространство пользователя (фактически память не защищена из кольца 0 на x86).

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

Связанный контент