sudo模式和内核模式有什么区别吗?

27
在类UNIX系统中,有用户模式和内核模式。在用户模式下无法访问某些指令。但是,当我们使用sudo时,可以访问操作系统的许多关键部分,执行关键操作。
我的问题是:当一个程序在sudo模式下被执行时,整个程序是否在内核模式下运行?还是仅仅是sudo模式是一个管理用户,其权限只是内核可执行操作的一个子集?
sudo模式下执行的程序并不一定全部运行在内核模式下,而sudo模式只是一个具备更高权限的管理员用户,其可以执行一些普通用户无权操作的任务。

3
这是管理员模式,而不是内核模式。 - n. m.
3
不,作为超级用户运行的用户空间进程仍然是用户空间进程,而不是在内核上下文中运行的内容。但是,超级用户可能具有更改内核代码的能力,例如通过请求内核加载模块或修改引导时加载内核的存储器。最后,在某些情况下,超级用户可以执行调用,将原始硬件或内存暴露给用户空间访问,随后可能会从用户空间执行一些通常只能从内核空间执行的操作。 - Chris Stratton
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Keith Thompson
2个回答

35

是的,sudo内核模式之间有很大区别。

内核模式与CPU模式有关。大多数处理器(特别是所有运行常见Linux内核而不是µCLinux的处理器)如您笔记本电脑中的英特尔处理器都有多种操作模式,至少有两种:特权(或监督)模式,在此模式下可以执行所有机器指令(包括最不安全的指令,例如配置MMU、禁用中断、停止机器、进行物理I/O即将字节发送到网络、打印机或磁盘),以及用户空间,其中一些机器指令被禁止(特别是物理I/O指令、MMU配置、中断禁用等)

在Linux上,只有内核代码(包括内核模块)在内核模式下运行。其他所有东西都在用户模式下。

应用程序(即使是以root身份运行的命令)在用户模式下执行,并通过系统调用与Linux内核进行交互(这是应用程序与内核交互的唯一方式),这些调用列在syscalls(2)中。因此,应用程序代码看到一个能够进行系统调用和执行用户模式指令的“虚拟机”。内核管理验证和凭据(请参见credentials(7)capabilities(7)...)。

sudo只是使用setuid 技术为命令授予root(即用户ID 0)权限。然后,更多的系统调用就变得可能了...但是该命令(即运行该命令的进程)仍在用户模式下运行,并使用虚拟内存和其地址空间


18

没有所谓的sudo模式,只有用户空间和内核空间。

正如您所说,内核模式可以执行CPU提供的任何指令并对硬件进行任何操作。用户空间程序只能访问映射到运行进程的存储器,并且无法直接访问任何硬件。通过系统调用机制,用户空间程序可以调用内核代码,后者将代表其执行硬件访问并将结果返回到用户空间。

在用户空间中,还有一些针对非根用户(root用户ID号为0)的附加限制。例如,它们只能访问某些文件,并且只能监听编号大于1024的TCP端口。sudo将以root用户身份启动进程,该用户不会受到这些限制的影响。

但是作为root用户(通过sudo)运行的进程仍然在用户空间中运行,并且仍然受到所有相同的限制的约束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接