6

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

3 ответа3

5

Хм, довольно интересный вопрос. Я постараюсь помочь ...

Кто отвечает за определение того, находится ли процесс в режиме ядра или в режиме пользователя?

Разработчики ОС решают, что :-). Все современные ОС запускают все процессы в режиме пользователя ("кольцо 3" в "защищенном режиме" в архитектуре x86), поскольку для этого необходимо использовать такие функции, как защита памяти и виртуальная память. Более старая и / или более простая ОС может запускать все процессы в режиме ядра (например, "Реальный режим" в x86); это зависит от дизайна ОС. Например, MS-DOS работал так.

Обратите внимание, что фактические имена и типы режимов процессора различаются для разных архитектур (x86, Sparc, PowerPC ...); однако все современные процессоры имеют похожие "защищенные" режимы, которые можно назвать "пользовательскими" режимами.

Я знаю, что ядро знает, к какому процессу относится какой процесс, но как процессор это определяет?

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

Например, на x86 компьютер запускается в "реальном режиме" (по соображениям совместимости). Когда загружается такая ОС, как Linux или Windows (NT и выше), первое, что она делает, - это переключается в "Защищенный режим". Затем он использует функцию "кольца" для контроля доступа каждой программы к оборудованию. Ядро ОС работает в кольце 0 (полные привилегии); ПО пользователя работает в кольце 3 (ограничено). Всякий раз, когда ОС передает управление пользовательскому программному обеспечению (т.е. когда она запускает или возобновляет пользовательский процесс), она сначала переключается на кольцо 3. Затем управление переходит обратно к ядру, процессор переключается обратно на кольцо 0.

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

Подробнее о том, как это работает в архитектуре x86, см. В этой статье: http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection

Кроме того: защита / ограничения в ограниченных режимах ЦП в основном реализуются блоком управления памятью ЦП. Старые и / или более простые процессоры (такие как Motorola 68000, используемый Amiga и Atari ST или 6510 от C64) не имеют MMU; поэтому они не могут запустить ОС, которая различает ядро и пользовательский режим. Вот почему, например, для порта Linux m68k требуется как минимум процессор Motorola 68020; более ранние 68000 и 68010 не имеют MMU.

Я имею в виду, должен ли процессор знать о режиме процесса или выполнении операторов? Если да, то как?

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

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

Очень хороший вопрос Сам процессор останавливает приложение.

Если код (приложение) выполняется в режиме с ограниченными правами (например, кольцо 3 в защищенном режиме на платформе x86), существует ряд вещей, которые код может не выполнять (например, доступ к памяти за пределами области, которой он был назначен). Процессор знает это и проверяет каждую инструкцию на возможные нарушения перед выполнением. Если нарушение обнаружено, ЦПУ прекращает выполнение кода, вызывающего сбой (это называется "исключение" или аппаратное прерывание), и переходит к специальному коду обработки ошибок (который был заранее установлен ОС).

Это эффективно передает управление обратно в ОС, которая затем может делать то, что считает нужным: извлечь память с диска, если исключение произошло из-за доступа к памяти, которая была выгружена на диск (так работает "пейджинг"), завершить процесс это незаконный доступ к памяти (страшная "ошибка защиты" или "ошибка сегментации") и т. д.

1

Ядро и пользовательский режим - это разные режимы безопасности процессора. Часто процессоры предоставляют даже больше, чем эти два режима, которые реализованы на уровне ОС.

Для получения дополнительной информации см.

Режимы процессора

а также

Взаимодействие между уровнями абстракции CPU и OS

1

Основной ответ на ваш вопрос таков: «Процессор переключается в режим ядра, когда происходит прерывание». Поскольку сама ОС устанавливает в процессе загрузки векторы прерываний (обработчики), все они указывают на ... ядро. Каждый системный вызов, выполняемый процессом, является ничем иным, как (программным) прерыванием, что означает вызов обработчика прерывания, который является ничем иным, как самим ядром (с параметрами, указанными в регистрах).

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .