Переход из пространства пользователя в пространство ядра

Переход из пространства пользователя в пространство ядра

Как физически (аппаратно, кольца) и логически (программно) происходит переход из пространства пользователя в пространство ядра? И наоборот.

Или, в более общем смысле, что происходит, когда происходит "пространственный" (или кольцевой) переход? И что делает его дорогостоящим (одна из главных проблем Minix)?

Этот вопрос следует за комментариями нижеэтототвечать.

решение1

С точки зрения операционной системы, пользовательское пространство — это выполнение кода из процесса, а пространство ядра — это выполнение кода из ядра. Переход из пользовательского пространства в пространство ядра — это вход всистемный вызов, а переход из пространства ядра в пространство пользователя — это возврат из системного вызова.

С точки зрения процессора, пользовательское пространство и пространство ядра являются уровнями привилегий. «Кольцо 3» и «кольцо 0» — это названия, используемые в процессорах Intel x86 (есть кольца 1 и 2, но большинство unice-систем их не используют, поскольку они не так уж и востребованы). Другие типы ЦП используют другие названия, например, пользовательский режим и привилегированный (или системный) режимы в ARM.

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

Переход из пользовательского режима в режим ядра должен перейти на фиксированный адрес, который был установлен ядром. Для поддержания безопасности системы коду в пользовательском режиме не может быть разрешено переключать процессор в режим ядра, за исключением вызова фрагмента кода (точки входа системного вызова), который был специально создан для безопасной работы независимо от того, что делал код пользовательского режима. Точка входа системного вызова сначала сохраняет значения регистров в назначенной области памяти и выполняет любые другие необходимые учетные операции, затем считывает параметры системного вызова и отправляет системный вызов соответствующей функции. В зависимости от типа процессора учетные операции могут включать установкуММУтаблицы соответствующим образом. Ядро может в любой момент решить приостановить вызывающий процесс и запланировать другой процесс.

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

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