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