在类似于Unix的系统中,我们有一个用户模式和一个内核模式。有些指令在用户模式下无法访问。然而,当我们执行sudo时,我们可以访问操作系统的许多关键部分,执行关键操作。我的问题是:当一个程序在sudo模式下执行时,整个程序是否在内核模式下运行?或者,sudo模式仅仅是一个管理用户,其权限仅仅是内核可以执行的操作的子集?
sudo
72qzrwbm1#
是的,sudo和kernel模式有很大的不同。内核模式与CPU modes相关。大多数处理器(特别是所有处理器都运行通用的Linux内核,而不是µCLinux内核),例如您笔记本电脑中的英特尔处理器有几种操作模式,至少有两种:特权(或管理)模式,其中所有机器指令都是可能的(包括最不安全的指令,如配置MMU、禁用interrupts、停止机器、执行物理I/O,即在网络上或向打印机或磁盘发送字节)和user mode模式,其中禁止某些机器指令(特别是物理I/O指令、MMU配置、中断禁用等)。在Linux上,只有内核代码(包括内核模块)在内核模式下运行。其他一切都处于用户模式。应用程序(甚至是以根用户身份运行的命令)在用户模式下执行,并通过syscalls(2)中列出的system calls(这是应用程序与内核交互的唯一方式)与Linux内核交互。因此,应用程序代码看到一个能够执行系统调用和执行用户模式指令的“virtual machine”。内核管理身份验证和凭据(参见credentials(7)和capabilities(7)...)sudo只是(使用setuid技术)向命令提供根用户(即用户id 0)的权限。然后,更多的系统调用是可能的..。但该命令(即运行该命令的process)仍在用户模式下运行,并使用virtual memory并具有其address space。
xwbd5t1u2#
没有sudo模式这回事。只有用户空间和内核空间。正如您所说,内核模式可以执行CPU提供的任何指令,并对硬件执行任何操作。用户模式程序只能访问Map到运行进程的内存,并且它们被阻止进行任何直接硬件访问。通过系统调用机制,用户模式程序可以调用内核代码,内核代码将代表其执行硬件访问,并将结果返回到用户空间。在用户空间中,对非根用户(root是用户ID号0)有其他限制。例如,它们只能访问某些文件,并且只能侦听编号大于1024的TCP端口。运行sudo将以根用户身份启动一个进程,该用户没有实施这些限制。但是作为根用户(通过sudo)运行的进程仍然在用户空间中运行,并且仍然受到所有相同的限制。
root
0
2条答案
按热度按时间72qzrwbm1#
是的,
sudo
和kernel模式有很大的不同。内核模式与CPU modes相关。大多数处理器(特别是所有处理器都运行通用的Linux内核,而不是µCLinux内核),例如您笔记本电脑中的英特尔处理器有几种操作模式,至少有两种:特权(或管理)模式,其中所有机器指令都是可能的(包括最不安全的指令,如配置MMU、禁用interrupts、停止机器、执行物理I/O,即在网络上或向打印机或磁盘发送字节)和user mode模式,其中禁止某些机器指令(特别是物理I/O指令、MMU配置、中断禁用等)。
在Linux上,只有内核代码(包括内核模块)在内核模式下运行。其他一切都处于用户模式。
应用程序(甚至是以根用户身份运行的命令)在用户模式下执行,并通过syscalls(2)中列出的system calls(这是应用程序与内核交互的唯一方式)与Linux内核交互。因此,应用程序代码看到一个能够执行系统调用和执行用户模式指令的“virtual machine”。内核管理身份验证和凭据(参见credentials(7)和capabilities(7)...)
sudo
只是(使用setuid技术)向命令提供根用户(即用户id 0)的权限。然后,更多的系统调用是可能的..。但该命令(即运行该命令的process)仍在用户模式下运行,并使用virtual memory并具有其address space。xwbd5t1u2#
没有
sudo
模式这回事。只有用户空间和内核空间。正如您所说,内核模式可以执行CPU提供的任何指令,并对硬件执行任何操作。用户模式程序只能访问Map到运行进程的内存,并且它们被阻止进行任何直接硬件访问。通过系统调用机制,用户模式程序可以调用内核代码,内核代码将代表其执行硬件访问,并将结果返回到用户空间。
在用户空间中,对非根用户(
root
是用户ID号0
)有其他限制。例如,它们只能访问某些文件,并且只能侦听编号大于1024的TCP端口。运行sudo
将以根用户身份启动一个进程,该用户没有实施这些限制。但是作为根用户(通过
sudo
)运行的进程仍然在用户空间中运行,并且仍然受到所有相同的限制。