基于第一个答案的部分内容这个问题:
从文件读取(内核必须检查权限是否允许您从该文件读取,然后内核对磁盘执行实际指令以读取该文件)
它需要具有 root 权限才能更改文件的权限。凭借 root 权限,用户可以访问任何文件,而无需担心权限问题。那么,root 和 kernel 之间有什么关系吗?
答案1
首先澄清一下:
它需要具有 root 权限才能更改文件的权限。
从人 2 chmod我们可以看到,如果满足以下条件,chmod() 系统调用将返回 EPERM(权限错误):
有效 UID 与文件所有者不匹配,并且该进程没有特权(Linux:它没有 CAP_FOWNER 功能)。
这通常意味着您任何一个需要是文件的所有者或 root 用户。但我们可以看到Linux中的情况可能会更复杂一些。
那么,root 和 kernel 之间有什么关系吗?
正如您引用的文本所指出的那样,内核负责检查进行系统调用的进程(即运行它的用户)的 UID 是否被允许执行它所要求的操作。因此,root 的超能力来自这样一个事实:内核已被编程为始终允许 root 用户 (UID=0) 请求的操作。
对于 Linux,大多数发生的各种权限检查都会检查给定的 UID 是否具有必要的权限能力。能力系统可以更细粒度地控制谁可以做什么。
然而,为了保留“root”用户的传统 UNIX 含义,以 UID 0 执行的进程具有所有功能。
请注意,虽然以 UID=0 运行的进程具有超级用户权限,但它们仍然必须通过系统调用接口向内核发出请求。
因此,用户空间进程,即使以 root 身份运行,它的功能仍然受到限制,因为它运行在“用户模式“并且内核正在运行”内核模式“这实际上是CPU本身不同的操作模式。在内核模式下,进程可以访问任何内存或发出任何指令。在用户模式下(在x86 CPU上实际上有许多不同的保护模式),进程只能访问它拥有自己的内存,并且只能发出一些指令,因此以 root 身份运行的用户空间进程仍然只能访问内核向其公开的内核模式功能。