在系统调用期间,Windows如何切换到主管模式?

在系统调用期间,Windows如何切换到主管模式?,windows,winapi,x86,system-calls,supervisor-mode,Windows,Winapi,X86,System Calls,Supervisor Mode,在系统调用期间,Windows如何切换到主管模式?我听说了一些关于“陷阱0”的事情,但这似乎不像x86指令。我进行了一些系统调用,但找不到任何调用。很多Windows系统调用是否在用户模式下运行?哪一个在监控模式下运行?系统调用也称为软件中断。调用软件中断的x86指令具有助记符INT。数据如何传递到操作系统由操作系统ABI定义。据我所知,Windows对其所有例程使用立即0x80,并通过寄存器发送额外数据,但我不确定。0x20是第一个可用的立即数,因为0到31的范围是保留的,用于一般异常,如整数

在系统调用期间,Windows如何切换到主管模式?我听说了一些关于“陷阱0”的事情,但这似乎不像x86指令。我进行了一些系统调用,但找不到任何调用。很多Windows系统调用是否在用户模式下运行?哪一个在监控模式下运行?

系统调用也称为软件中断。调用软件中断的x86指令具有助记符INT。数据如何传递到操作系统由操作系统ABI定义。据我所知,Windows对其所有例程使用立即0x80,并通过寄存器发送额外数据,但我不确定。0x20是第一个可用的立即数,因为0到31的范围是保留的,用于一般异常,如整数除零和内存故障

基本上发生的是CPU更改为特权模式并读取IDTR(中断描述符表寄存器)。它在那里找到IDT(中断描述符表)的物理内存地址,并根据烘焙到软件中断指令中的8位立即数查找IDT。IDT可以存储在内存中的任何位置。IDTR可通过LIDT和SIDT指令进行读/写。IDT可以存储各种信息,但对于中断,它将地址存储到与INT immediate关联的服务例程

触发软件中断的win32函数示例。。嗯,printf和他的朋友们确实是这样,EnterCriticalSection也是这样。在WindowsVista和Windows7中,由于新的复合管理器,一些OpenGL和DirectXAPI调用现在需要往返到内核区。对于OpenGL,这适用于读取当前backbuffer的所有函数,如glReadPixels、glCopy(Sub)TexImage2D等

附言:对这篇文章稍加注意。我已经有一段时间没有用这种方式乱动Windows了,我也没有做很多事实检查。欢迎编辑和评论


这里有一个到原始版本的链接(我还是引用了它)

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


您可以在中看到更多详细信息,特别是

嗯。。。wave回调是Vista及更高版本中的100%用户模式代码。在处理API的过程中,有一个内核模式调用,但这只是因为有一个IPC调用从一个用户模式进程调用到另一个用户模式进程,这涉及到系统调用。修复,谢谢:-)我很确定在Windows3.1到Windows98中是这样的。那么切换到管理模式的INT3是不是到处都是?但在执行的代码中从未见过。我现在在win64(W7)上,在EnterCriticalSection中检测不到任何跳转到主管模式的情况。()Printf不是一个api调用,它是一个C函数。INT 3被保留为始终表示断点。它是优先级最高的中断之一。当您使用调试信息编译应用程序时,函数和数据存储之间会填充INT 3,以便在调试器内部执行中断,而不是使用未定义的内存区域进行潜在的有害操作。标准C库肯定符合API的描述。程序员只是倾向于认为API是“语言规范中未涵盖的所有内容”。没错,似乎NT使用INT2E作为管理器开关。我猜Int3只是在填充。我的意思是,这不是一个winapi调用。还要阅读Windows内部的书籍。它们有助于理解。