sudo
时,可以访问操作系统的许多关键部分,执行关键操作。我的问题是:当一个程序在
sudo
模式下被执行时,整个程序是否在内核模式下运行?还是仅仅是sudo
模式是一个管理用户,其权限只是内核可执行操作的一个子集?在
sudo
模式下执行的程序并不一定全部运行在内核模式下,而sudo
模式只是一个具备更高权限的管理员用户,其可以执行一些普通用户无权操作的任务。sudo
时,可以访问操作系统的许多关键部分,执行关键操作。sudo
模式下被执行时,整个程序是否在内核模式下运行?还是仅仅是sudo
模式是一个管理用户,其权限只是内核可执行操作的一个子集?sudo
模式下执行的程序并不一定全部运行在内核模式下,而sudo
模式只是一个具备更高权限的管理员用户,其可以执行一些普通用户无权操作的任务。是的,sudo
和内核模式之间有很大区别。
内核模式与CPU模式有关。大多数处理器(特别是所有运行常见Linux内核而不是µCLinux的处理器)如您笔记本电脑中的英特尔处理器都有多种操作模式,至少有两种:特权(或监督)模式,在此模式下可以执行所有机器指令(包括最不安全的指令,例如配置MMU、禁用中断、停止机器、进行物理I/O即将字节发送到网络、打印机或磁盘),以及用户空间,其中一些机器指令被禁止(特别是物理I/O指令、MMU配置、中断禁用等)
在Linux上,只有内核代码(包括内核模块)在内核模式下运行。其他所有东西都在用户模式下。
应用程序(即使是以root身份运行的命令)在用户模式下执行,并通过系统调用与Linux内核进行交互(这是应用程序与内核交互的唯一方式),这些调用列在syscalls(2)中。因此,应用程序代码看到一个能够进行系统调用和执行用户模式指令的“虚拟机”。内核管理验证和凭据(请参见credentials(7)和capabilities(7)...)。
sudo
只是使用setuid 技术为命令授予root(即用户ID 0)权限。然后,更多的系统调用就变得可能了...但是该命令(即运行该命令的进程)仍在用户模式下运行,并使用虚拟内存和其地址空间。
没有所谓的sudo
模式,只有用户空间和内核空间。
正如您所说,内核模式可以执行CPU提供的任何指令并对硬件进行任何操作。用户空间程序只能访问映射到运行进程的存储器,并且无法直接访问任何硬件。通过系统调用机制,用户空间程序可以调用内核代码,后者将代表其执行硬件访问并将结果返回到用户空间。
在用户空间中,还有一些针对非根用户(root
用户ID号为0
)的附加限制。例如,它们只能访问某些文件,并且只能监听编号大于1024的TCP端口。sudo
将以root用户身份启动进程,该用户不会受到这些限制的影响。
但是作为root用户(通过sudo
)运行的进程仍然在用户空间中运行,并且仍然受到所有相同的限制的约束。