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