有一些关于发生在处理器级别和操作系统的特权的概念。对于处理器来说,有些指令只能在超级程序模式下执行。同样,在操作系统中,有些操作不经过内核就无法执行(系统调用)。
问题:这两个概念如何相互映射?我们可以完全在用户空间重写系统调用吗?如果不是,是否是因为系统调用隐藏了上述特权指令?
答案1
简单来说,特权指令通常是与硬件设备的I/O或内存保护相关的指令。从任意进程访问这些进程而不通过某些中央逻辑将使进程有可能破坏其他进程的内存,弄乱文件系统等。无论是偶然还是故意的。
如果我们考虑一些常见的系统调用,例如open()
、read()
和write()
其他访问文件并最终导致对磁盘或其他设备的 I/O 的调用。或者fork()
这mmap()
会影响一个进程或其他进程的内存。
当然像制定流程之类的东西不是调用系统调用不需要特权,并且可以通过库来完成。伪造系统调用的结果也是如此。当然,像向后更改两周的所有时间戳(如示例libfaketime
)之类的事情需要首先找出正确的时间,而这必须通过系统调用来实现。除了libfaketime
和之外libeatmydata
,还有例如fakeroot
假装进程在 UID 0 下运行。