【发布时间】:2010-12-13 16:29:00
【问题描述】:
Windows 如何在系统调用期间切换到超级用户模式?我听说过一些关于“陷阱 0”的信息,但这看起来甚至不像 x86 指令。我逐步完成了一些系统调用,但找不到任何系统调用。很多 Windows 系统调用都在用户模式下运行吗?哪个 DO 在主管模式下运行?
【问题讨论】:
标签: windows winapi x86 system-calls supervisor-mode
Windows 如何在系统调用期间切换到超级用户模式?我听说过一些关于“陷阱 0”的信息,但这看起来甚至不像 x86 指令。我逐步完成了一些系统调用,但找不到任何系统调用。很多 Windows 系统调用都在用户模式下运行吗?哪个 DO 在主管模式下运行?
【问题讨论】:
标签: windows winapi x86 system-calls supervisor-mode
系统调用也称为软件中断。调用软件中断的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 等。
P.S: 用少许盐来处理这篇文章。自从我以这种方式弄乱 Windows 以来已经有一段时间了,而且我没有进行大量的事实检查。欢迎编辑和 cmets。
这里是原始Intel 386 manual 的链接(我还是引用了)
【讨论】:
x86 CPU 提供SYSENTER 和SYSEXIT 指令。这些指令执行从用户模式到内核模式并返回的非常快速的切换,并且在现代 CPU 上运行的现代操作系统很可能使用这些指令,而不是非常昂贵的中断或远程调用。
您可以在Intel's Software Developer's Manuals 中查看更多详细信息,特别是volume 2B
【讨论】: