【问题标题】:How does Windows switch to supervisor mode during a system call?Windows 如何在系统调用期间切换到超级用户模式?
【发布时间】:2010-12-13 16:29:00
【问题描述】:

Windows 如何在系统调用期间切换到超级用户模式?我听说过一些关于“陷阱 0”的信息,但这看起来甚至不像 x86 指令。我逐步完成了一些系统调用,但找不到任何系统调用。很多 Windows 系统调用都在用户模式下运行吗?哪个 DO 在主管模式下运行?

【问题讨论】:

    标签: windows winapi x86 system-calls supervisor-mode


    【解决方案1】:

    系统调用也称为软件中断。调用软件中断的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 的链接(我还是引用了)

    【讨论】:

    • Ummm...wave 回调是 Vista 及更高版本中的 100% 用户模式代码。在处理 API 期间进行了内核模式调用,但这只是因为从一个用户模式进程到另一个用户模式进程进行了 IPC 调用,并且涉及系统调用。
    • 已修复,谢谢 :-) 我很确定 Windows 3.1 到 Windows 98 都是这种情况。
    • 那么切换到管理员模式是不是我看到的那些 INT3 散落在各处?虽然从未在执行的代码中看到过。我现在使用的是 win64 (W7),在 EnterCriticalSection 中我无法检测到任何跳转到主管模式。 (slask.sys5.se/q/RtlEnterCriticalSection.png) Printf 不是 api 调用,它是一个 C 函数。
    • INT 3 保留为始终表示断点。它是具有最高优先级的中断之一。当您使用调试信息编译应用程序时,INT 3 会填充在函数和数据存储之间,以在调试器内部执行中断,而不是潜在地对未定义的内存区域进行令人讨厌的事情。标准 C 库肯定符合 API 的描述。程序员只是倾向于将 API 视为“语言规范未涵盖的所有内容”。
    • 是的,NT 似乎使用 INT2E 作为主管开关。猜猜INT3只是填充。我的意思是这不是一个 winapi 调用。
    【解决方案2】:

    x86 CPU 提供SYSENTERSYSEXIT 指令。这些指令执行从用户模式到内核模式并返回的非常快速的切换,并且在现代 CPU 上运行的现代操作系统很可能使用这些指令,而不是非常昂贵的中断或远程调用。

    您可以在Intel's Software Developer's Manuals 中查看更多详细信息,特别是volume 2B

    【讨论】:

    • 还可以阅读 Windows Internals 书籍。它们有助于理解。
    猜你喜欢
    • 2017-09-02
    • 2011-01-28
    • 1970-01-01
    • 2010-10-23
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2015-12-13
    相关资源
    最近更新 更多