我正在研究Linux中CPU如何从用户模式变为内核模式。我遇到了两种不同的方法:中断和使用sysenter
.
我无法理解它是如何sysenter
工作的。sysenter
有人可以解释一下指令运行时cpu到底发生了什么吗?
我正在研究Linux中CPU如何从用户模式变为内核模式。我遇到了两种不同的方法:中断和使用sysenter
.
我无法理解它是如何sysenter
工作的。sysenter
有人可以解释一下指令运行时cpu到底发生了什么吗?
程序想要进入内核(也称为“系统调用”)时面临的问题是用户程序无法访问任何与内核相关的内容,但程序必须以某种方式将 CPU 切换到“内核模式”。
在中断时,这是由硬件完成的。
它也会在发生(CPU 而非 C++)异常时自动发生,例如访问不存在的内存、被零除或在用户代码中调用特权指令。或尝试执行未实现的指令。最后这件事实际上是实现“调用内核”接口的一种不错的方式:CPU 在一条 CPU 不知道的指令上运行,因此它引发了一个异常,使 CPU 进入内核模式并进入内核。然后内核代码可以检查是否使用了“正确的”未实现的指令,如果是,则执行系统调用,或者如果它是任何其他未实现的指令,则直接终止进程。
当然,做这样的事情并不“干净”。它更像是一个肮脏的黑客,滥用应该是错误的东西来实现一个完全有效的控制流更改。因此,CPU 确实倾向于有实际的指令来做本质上相同的事情,只是以更“定义”的方式。类似“sysenter”指令的主要目的仍然相同:它将 CPU 更改为“内核模式”,保存调用“sysenter”的位置,并在内核中的某个位置继续执行。
至于“软件中断”和“sysenter”的区别:“sysenter”专门针对这种用例进行了优化。例如,它不像(软件)中断那样从内存中获取内核地址来调用,而是使用一个特殊的寄存器来获取地址,这样可以节省内存地址查找。它还可能在内部进行额外的优化,基于这样一个事实,即软件中断可能更像中断处理,而 sysenter 指令实际上并不需要它。我不知道在 CPU 上执行这些指令的确切细节,您可能必须阅读英特尔手册才能真正了解这些细节。