据我了解,在用户模式下执行的线程最终可以进入切换到内核模式(使用sysenter)的代码。但是,从用户代码发出的线程如何执行内核代码?
例如:我正在调用 CreateFile(),然后它委托(delegate)给 NtCreateFile(),后者又调用 ZwCreateFile(),而不是 ZiFastSystemCall()...比 sysenter...利润,内核访问?
编辑 这个问题: How does Windows protect transition into kernel mode有一个帮助我理解的答案,请参阅引用: “用户模式线程导致异常,该异常被 Ring 0 代码捕获。用户模式线程暂停,CPU 切换到内核/ring 0 线程,然后可以检查上下文(例如,调用堆栈和寄存器)用户模式线程来弄清楚要做什么。”另请参阅此博客文章,信息量很大:http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection
最佳答案
简短的回答是不能。
当您创建用户模式线程时,内核会创建一个匹配的内核模式线程。当“你的”线程需要在内核模式下执行一些代码时,它实际上是在匹配的内核模式线程中执行的。
免责声明:我最后一次真正仔细观察它可能是在使用 Win2K 甚至 NT4 时——但我怀疑在这方面已经发生了很大变化。
关于winapi - 在 WindowsNT(最近的 x86 版本,Vista 和 Win7)下从用户模式切换到内核模式时,线程做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18427617/