在系统调用期间,Windows如何切换到pipe理员模式? 我听说过有关“陷阱0”的一些事情,但这似乎不是x86指令。 我通过一些系统调用,但我找不到任何。 在用户模式下运行很多Windows系统调用吗? 哪些在监督模式下运行?
系统调用也被称为软件中断 。 调用软件中断的x86指令具有助记符INT 。 如何将数据传递给操作系统由操作系统ABI定义。 据我所知,Windows使用即时0x80为其所有例程,并通过寄存器发送额外的数据,但我不知道。 0x20是第一个可用的立即数,因为范围0到31被保留并用于一般的例外,如整数除零和内存故障。
基本上发生的是,CPU变为特权模式并读取IDTR (中断描述符表寄存器)。 在那里,它找到IDT(Interupt Descriptor Table)的物理内存地址,根据8位立即数烧入软件中断指令,查找IDT。 IDT可以存储在内存中的任何地方。 IDTR可以通过指令LIDT和SIDT来读/写。 IDT可以存储各种信息,但是对于中断,它将地址存储到与INT立即数相关联的服务例程中。
启动软件中断的win32函数的例子.. hm。 printf和朋友确实如同EnterCriticalSection一样 。 在Windows Vista和Windows 7中,由于新的组合管理器,现在一些OpenGL和DirectX API调用需要往返于内核的土地。 对于OpenGL,适用于读取当前后缓冲区的所有函数,如glReadPixels,glCopy(Sub)TexImage2D等
PS:拿一小撮盐拿这个帖子。 我用这种方式搞砸了Windows已经有一段时间了,而且我没有进行大量的事实检查。 欢迎编辑和评论。
这里是一个链接到原来的英特尔386手册 (反正我引用)
x86 CPU提供了SYSENTER
和SYSEXIT
指令。 这些指令执行从用户模式到内核模式的非常快速的切换,并且在现代CPU上运行的现代操作系统很可能使用这些操作而不是非常昂贵的中断或远程调用。
您可以在“ 英特尔软件开发人员手册”中看到更多详细信息,特别是第2B卷