Есть ли разница между режимом sudo и режимом ядра?

В UNIX-подобной системе у нас есть режим пользователя и режим ядра. Есть некоторые инструкции, которые невозможно получить в пользовательском режиме. Однако, когда мы делаем sudo, мы можем получить доступ ко многим критическим разделам нашей ОС, выполнять критические действия.

Мой вопрос: когда программа выполняется в режиме sudo, работает ли вся программа в режиме ядра? Или это так, что режим sudo - это просто административный пользователь, полномочия которого являются простым подмножеством операций, которые могут выполняться ядром?

Ответ 1

Да, огромная разница между режимом sudo и kernel.

Режим ядра связан с режимами ЦП. Большинство процессоров (в частности, все работает с общим ядром Linux, а не с μCLinux), например, ваш процессор Intel внутри вашего ноутбука имеет несколько режимов работы, по крайней мере два: режим привилегированного (или супервизора), где возможны все машинные инструкции (в том числе большинство небезопасных устройств, таких как конфигурация MMU, отключение прерываний, остановка устройства, выполнение физических операций ввода-вывода, т.е. отправка байтов в сети или на принтер или диск) и пользовательский режим, когда некоторые машинные инструкции запрещены (в частности, физические Инструкции ввода/вывода, конфигурация MMU, отключение прерывания и т.д.)

В Linux в режиме ядра работает только код ядра (включая модули ядра). Все остальное находится в пользовательском режиме.

Приложения (даже команды, выполняемые с правами администратора) выполняются в пользовательском режиме и взаимодействуют с ядром Linux через системные вызовы (и это единственный способ взаимодействия приложения с ядром), перечисленные в syscalls (2). Таким образом, код приложения видит " виртуальную машину ", способную выполнять системные вызовы и выполнять инструкции пользовательского режима. Ядро управляет аутентификацией и учетными данными (см. Учетные данные (7) и возможности (7)...)

sudo просто дает команду (используя методы setuid) разрешения для root (т.е. идентификатор пользователя 0). Тогда возможны и другие системные вызовы... Но команда (т.е. процесс, выполняющий эту команду) все еще работает в пользовательском режиме и использует виртуальную память и имеет адресное пространство.

Ответ 2

Нет такой вещи, как режим sudo. Существует только пространство пользователя и пространство ядра.

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

В пользовательском пространстве существуют дополнительные ограничения для пользователей, которые не являются root (root - это идентификатор пользователя 0). Например, они могут обращаться только к определенным файлам, и они могут прослушивать только порты TCP с номером выше 1024. Запуск sudo начнет процесс как пользователь root, у которого нет этих ограничений.

Но процессы, которые запускаются как пользователь root (через sudo), все еще работают в пользовательском пространстве и все еще подвержены тем же ограничениям, что и подразумевается.