Windows 如何在系统调用期间切换到超级用户模式?我听说过一些关于“trap 0”的事情,但这甚至不像 x86 指令。我逐步完成了一些系统调用,但找不到任何系统调用。很多 Windows 系统调用都在用户模式下运行吗?哪个 DO 在主管模式下运行?
2 回答
x86 CPU 提供SYSENTER
和SYSEXIT
指令。这些指令执行从用户模式到内核模式并返回的非常快速的切换,并且在现代 CPU 上运行的现代操作系统很可能使用这些指令,而不是非常昂贵的中断或远程调用。
您可以在英特尔的软件开发人员手册中查看更多详细信息,特别是第 2B 卷
系统调用也称为软件中断。调用软件中断的 x86 指令具有助记符INT。数据如何传递到操作系统由操作系统 ABI 定义。据我所知,Windows 的所有例程都使用立即数 0x80 并通过寄存器发送附加数据,但我不确定。0x20 是第一个可用的立即数,因为范围 0 到 31 被保留并用于一般异常,例如整数除以零和内存故障。
基本上发生的是 CPU 更改为特权模式并读取IDTR (中断描述符表寄存器)。它在那里找到 IDT(中断描述符表)的物理内存地址,并根据嵌入到软件中断指令中的 8 位立即数对 IDT 进行查找。IDT 可以存储在内存中的任何位置。IDTR 可以通过指令 LIDT 和 SIDT 读/写。IDT 可以存储各种信息,但对于中断,它存储与 INT 立即数相关的服务程序的地址。
触发软件中断的win32函数示例..嗯。printf和朋友肯定会这样做,EnterCriticalSection也是如此。在 Windows Vista 和 Windows 7 中,由于新的复合管理器,一些 OpenGL 和 DirectX API 调用现在需要往返内核域。对于 OpenGL,这适用于读取当前后台缓冲区的所有函数,例如 glReadPixels、glCopy(Sub)TexImage2D 等。
PS:拿这个帖子加点盐。自从我以这种方式弄乱 Windows 以来已经有一段时间了,而且我没有进行大量的事实检查。欢迎编辑和评论。
这里是原始英特尔 386 手册的链接(无论如何我都引用了)