您没有说明您要询问的操作系统。无论如何,让我尝试一个答案。
CPU 指令不应与系统调用的概念syscall
及其在各自操作系统中的表示相混淆。sysenter
通过阅读英特尔® 64 和 IA-32 架构开发人员手册第 2A 卷(对于,请参阅第 3-392 页)和第2B卷(对于请参阅第 4-463 页)。也不要忘记看看它。 int
sysenter
iretd
sysexit
随意计算操作的伪代码会得出:
注意:尽管现有的答案是正确的,sysenter
并且syscall
不是中断或与中断有任何关系,但 Linux 和 Windows 世界中的旧内核使用中断来实现其系统调用机制。在 Linux 上,这曾经是int 0x80
在 Windows 上int 0x2E
。因此,在那些内核版本上,IDT 必须准备好为相应的中断提供中断处理程序。在较新的系统上,确实如此,sysenter
和syscall
指令已经完全取代了旧的方式。使用sysenter
它的是 MSR(机器特定寄存器)0x176
,它使用处理程序的地址进行初始化sysenter
(请参阅下面链接的阅读材料)。
在 Windows ...
就像在 Linux 上一样,Windows 上的系统调用会导致切换到内核模式。NT 的调度程序不提供关于授予线程的时间的任何保证。它还从线程中抽出时间,甚至可能最终导致线程饥饿。一般来说,可以说用户模式代码可以被内核模式代码抢占(除了极少数非常具体的例外情况,您肯定会在“高级驱动程序编写课程”中获得这些例外情况)。如果我们只看一个例子,这是完全有道理的。用户模式代码可以被换出——或者,就此而言,它试图访问的数据。现在 CPU 一点也不知道如何访问交换/分页文件中的页面,因此需要一个中间步骤。这也是为什么内核模式代码必须能够抢占用户模式代码的原因。IRQL_NOT_LESS_OR_EQUAL
. 这意味着当无法抢占触及该内存的代码时,驱动程序访问了分页内存。
进一步阅读
- Geoff Chappell在 Windows 中的 SYSENTER 和 SYSEXIT(根据我的经验总是值得一读!)
- Linux 2.6 中基于 Sysenter 的系统调用机制
- Windows NT 平台特定讨论:Windows NT 系统调用如何真正工作?
- Windows NT 平台特定讨论:使用 SYSENTER 指令优化系统调用
- Windows Internals,第 5 版,Russinovich 等人。人。- 第 125 至 132 页。
- ReactOS 的实现
KiFastSystemCall