Сначала уточнение:
Для изменения прав доступа к файлу требуется иметь привилегию root.
Из man 2 chmod мы видим, что системный вызов chmod () вернет EPERM (ошибка прав доступа), если:
Действующий UID не соответствует владельцу файла, и процесс не является привилегированным (Linux: у него нет возможности CAP_FOWNER).
Как правило , это означает , что вы либо нужно быть владельцем файла или суперпользователя. Но мы видим, что ситуация в Linux может быть немного сложнее.
Итак, существуют ли какие-либо отношения между root и kernel?
Как указано в цитируемом вами тексте, ядро отвечает за проверку того, что UID процесса, выполняющего системный вызов (то есть пользователя, с которым он работает), может выполнять то, что запрашивает. Таким образом, суперспособности root происходят от того факта, что ядро было запрограммировано так, чтобы всегда разрешать операцию, запрошенную пользователем root (UID = 0).
В случае Linux большинство различных проверок разрешений проверяют, обладает ли данный UID необходимой возможностью . Система возможностей позволяет более детально контролировать, кому и что разрешено делать.
Однако, чтобы сохранить традиционное значение UNIX «root», у процесса, выполняемого с UID 0, есть все возможности.
Обратите внимание, что хотя процессы, выполняющиеся с UID = 0, имеют привилегии суперпользователя, им все равно приходится отправлять запросы ядру через интерфейс системных вызовов.
Таким образом, процесс в пользовательском пространстве, даже выполняющийся от имени пользователя root, по-прежнему ограничен в том, что он может делать, поскольку он работает в « пользовательском режиме », а ядро работает в « режиме ядра », которые фактически являются различными режимами работы самого ЦП. В режиме ядра процесс может получить доступ к любой памяти или выполнить любую инструкцию. В пользовательском режиме (на процессорах x86 на самом деле существует несколько различных защищенных режимов), процесс может получить доступ только к своей собственной памяти и может выдавать только некоторые инструкции. Таким образом, процесс пользовательского пространства, работающий от имени пользователя root, по-прежнему имеет доступ только к функциям режима ядра, которые ему предоставляет ядро.