在 Unix 中,
如果您是访客用户并且执行了以下操作:
chmod 777 /
它将会失败。
但这在硬件层面上是如何发生的呢?
到目前为止,我认为情况如下:
- 操作系统尝试执行该指令。
- 有关权限的信息可能位于辅助存储器的某个位置。因此它会发出写入指令。
- 在 2 之前,它会检查用户是否有权限执行此操作。如果没有权限,则会发出错误消息。
情况就是这样吗?还是发生这种情况时会引发中断?主内存中的 ISR 表中是否有与非特权指令相对应的例程?
答案1
chmod
是文件系统操作,不是特权指令。文件系统权限不在硬件级别处理。这软件(特别是操作系统)发现调用系统调用的进程没有足够的权限对文件系统对象执行操作,并且系统调用返回权限错误。
答案2
实际上,你问的是两个不同的问题:
- 操作系统如何阻止非特权进程执行特权指令?
- 为什么非特权进程无法调用
chmod 777 /
?
答案 2:
chmod
内部调用 libc 中的一个函数(方便地也称为chmod()
)。此函数检查调用者是否具有足够的权限执行此操作 - 如果没有,则返回错误EPERM
。
问题 1 的答案更有趣:
确切的机制取决于操作系统和硬件平台,但基本上是这样的:所有现代处理器都具有内置安全功能。这允许操作系统告诉处理器:“运行此程序,但不要让它执行这些特权指令”。因此,处理器本身将强制执行允许指令的限制。如果程序试图执行特权指令,处理器将把控制权交还给操作系统,这通常会终止行为不当的程序。有关详细信息,请参阅例如https://en.wikipedia.org/wiki/Ring_%28computer_security%29