【问题标题】:Does an Operating System check every Instruction?操作系统是否检查每条指令?
【发布时间】:2021-08-02 02:38:50
【问题描述】:

不确定这里是否有人可以回答这个问题。

我了解到操作系统会检查程序的指令是否更改了其分配的内存之外的内容,如果发生更改,则操作系统将不允许程序执行此操作。

但是,如果操作系统必须对每条指令进行检查,这不会占用至少 5/6 的 CPU 吗?我试图复制这个,这就是我想出多少时钟周期来检查每条指令。

如果我理解错了,请纠正我,因为我无法想象一个操作系统会占用这么多 CPU。

【问题讨论】:

  • 有硬件辅助。最简单的有两种模式,特权和用户。不允许用户接触特权寄存器或内存地址(通常由页表强制执行,只能由特权位创建)。更复杂的具有更细粒度的功能,因此某些系统寄存器可用,或提供预设值以假装它们可用。

标签: memory operating-system cpu


【解决方案1】:

有几个安全措施可以确保非特权进程正常运行。我将在 x86_64 架构的上下文中讨论其中的两个,但这些概念(大部分)扩展到其他主要平台。

权限级别

在特定的 CPU 寄存器中有一个位指示当前的特权级别。这些权限通常称为 rings,其中 ring 0 对应于内核(即最高权限),而 ring 3 对应于用户空间进程(即最低权限)。还有其他戒指,但与本介绍无关。

x86_64 中的某些指令只能由特权进程执行。当前环必须为 0 才能执行特权指令。如果您尝试在没有正确权限的情况下执行此指令,处理器将引发general protection fault。内核同步处理这个中断,几乎肯定会杀死用户空间进程。

环级别只能在环 0 中更改,因此用户空间进程不能简单地从环 3 更改为环 0。

在页表中执行权限

所有要执行的指令都存储在内存中。许多架构(包括 x86_64)使用page tables 来存储从虚拟地址到物理地址的映射。这些页表也有几个簿记条目,其中之一是执行权限位。如果与试图执行的指令相对应的页面没有设置该位,则处理器将产生一般保护错误。和以前一样,内核会同步处理这个中断,并可能杀死有问题的进程。

这些执行位何时设置?它们可以通过mmap(2) 动态设置,但在大多数情况下,编译器会在它生成的二进制文件中发出特殊的 CODE 部分,并且当操作系统将二进制文件加载到内存中时,它会在页表条目中为对应的页设置执行位到 CODE 部分。

谁在检查这些位?

您问操作系统对每条指令检查这些位的性能损失是正确的。如果操作系统这样做,那将是非常昂贵的。相反,处理器支持特权级别和页表(带有执行位)。操作系统可以设置这些位,并在进程超出其权限时依靠处理器生成中断。

这些硬件检查非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多