Есть ли разница между режимом 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
), все еще работают в пользовательском пространстве и все еще подвержены тем же ограничениям, что и подразумевается.