Windows在系统调用期间如何切换到管理员模式?我听说过一个关于“陷阱0”的东西,但这看起来甚至不像是x86指令。我介绍了一些系统调用,但我找不到任何系统调用。许多Windows系统调用是否以用户模式运行?哪个DO在管理员模式下运行?
答案 0 :(得分:4)
x86 CPU提供SYSENTER
和SYSEXIT
指令。这些指令执行从用户模式到内核模式的非常快速的切换,并且在现代CPU上运行的现代操作系统很可能使用这些而不是非常昂贵的中断或远程调用。
您可以在Intel's Software Developer's Manuals中看到更多详细信息,特别是volume 2B
答案 1 :(得分:3)
系统调用也称为软件中断。调用软件中断的x86指令具有助记符 INT 。如何将数据传递到操作系统由操作系统ABI定义。据我所知,Windows使用立即0x80的所有例程,并通过寄存器发送额外的数据,但我不确定。 0x20是第一个可用的立即数,因为0到31的范围被保留并用于一般异常,如整数除零和内存故障。
基本发生的是CPU更改为特权模式并读取 IDTR (Interupt Descriptor Table Register)。在那里它找到IDT(中断描述符表)的物理存储器地址,并根据软件中断指令中的8位立即数查找IDT。 IDT可以存储在内存中的任何位置。 IDTR可以通过LIDT和SIDT指令读/写。 IDT可以存储各种信息,但是对于中断,它将地址存储到与INT立即关联的服务例程。
启动软件中断的win32函数示例.. hm。 printf 和朋友肯定一样, EnterCriticalSection 也是如此。在Windows Vista和Windows 7中,由于新的复合管理器,一些OpenGL和DirectX API调用现在需要往返内核域。对于OpenGL,它适用于读取当前后台缓冲区的所有函数,如glReadPixels,glCopy(Sub)TexImage2D等。
P.S:用一小撮盐拿这个帖子。已经有一段时间了,因为我用这种方式搞砸了Windows,而且我没有进行大量的事实检查。欢迎编辑和评论。以下是原始Intel 386 manual的链接(无论如何我都引用了)