winapi - 在 WindowsNT(最近的 x86 版本,Vista 和 Win7)下从用户模式切换到内核模式时,线程做了什么?

标签 winapi operating-system

据我了解,在用户模式下执行的线程最终可以进入切换到内核模式(使用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/

相关文章:

delphi - 在工作线程中使用 SHFileOperation 是否安全?

c++ - 捕获全局鼠标滚动,并将自定义鼠标滚动事件发送到应用程序

assembly - jmp 在汇编中如何工作? (操作系统开发)

c# - 如何通过用 StringBuilder 声明的 P/Invoke 传递 nullptr?

windows - 在运行时更改进程名称

winapi - 是否有用于选择 Active Directory 用户的通用对话框?

memory - 有关可执行程序(进程)的内存布局的更多信息

c - 设计shell时如何处理Control-C信号?

multithreading - 条件变量与信号量

c - fork调用后父进程id不一致?