根和内核之间是什么关系?

Ron*_*nce 8 root kernel permissions

基于这个问题的第一个答案的一部分:

从文件中读取(内核必须检查权限是否允许您从该文件中读取,然后内核对磁盘执行实际指令以读取文件)

它需要具有 root 权限才能更改文件的权限。拥有 root 权限,用户可以访问任何文件而无需担心权限问题。那么,root 和 kernel 之间有什么关系吗?

Ste*_*n D 13

首先澄清一下:

它需要具有 root 权限才能更改文件的权限。

man 2 chmod我们可以看到 chmod() 系统调用将返回 EPERM(权限错误),如果:

有效的 UID 与文件的所有者不匹配,并且该进程没有特权(Linux:它没有 CAP_FOWNER 能力)。

这通常意味着你要么需要在文件或root用户的所有者。但是我们可以看到,Linux 中的情况可能要复杂一些。

那么,root 和 kernel 之间有什么关系吗?

正如您引用的文本所指出的那样,内核负责检查进行系统调用的进程的 UID(即运行它的用户)是否允许执行它所要求的操作。因此,root 的超能力来自这样一个事实,即内核已被编程为始终允许 root 用户 (UID=0) 请求的操作。

在 Linux 的情况下,大多数发生的各种权限检查都会检查给定的 UID 是否具有必要的能力。能力系统允许更精细地控制谁可以做什么。

但是,为了保留“root”用户的传统 UNIX 含义,以 0 的 UID 执行的进程具有所有功能。

请注意,虽然以 UID=0 运行的进程具有超级用户权限,但它们仍然必须通过系统调用接口向内核发出请求。

因此,用户空间进程,即使以 root 身份运行,在它可以做的事情上仍然受到限制,因为它在“用户模式运行,而内核在“内核模式运行,这实际上是 CPU 本身的不同操作模式。在内核模式下,进程可以访问任何内存或发出任何指令。在用户模式下(在 x86 CPU 上实际上有许多不同的保护模式),一个进程只能访问自己的内存,并且只能发出一些指令。因此,以 root 身份运行的用户空间进程仍然只能访问内核向其公开的内核模式功能。