什么是用户线程的内核模式堆栈(OS Windows)?

时间:2015-10-15 16:29:28

标签: windows

想象一下用户空间线程(通过WinApi创建)。

除了:

  • 线程环境阻止
  • GDI句柄,OpenGL句柄
  • 用户空间堆栈
  • Therad内核(注册)

我听说它拥有内核模式堆栈 - 12 KB - x86,24 KB - x64

q1:什么是内核堆栈的问题?

据我所知,当我们进行系统调用时:

  1. 在我们的上下文中使用值或指针填充寄存器

  2. 通过INT或甚至CALL(保护模式下的远程呼叫)启动中断

  3. 这里我们处于内核的中断服务程序中。

  4. q2:我想 OS阻止用户线程,直到OS未完成任务。是这样吗?

    也许我们现在部分是设备I / O控制管理器(如果我们发送irp数据包)。也许在其他一些(如果我们决定创建信号量)。如果这段代码是可重入的,那么系统我认为可以从池中获取一个内核线程。

    q3:我认为内核线程与启动所有这些工作的用户空间线程没有任何共享。我错了吗?

1 个答案:

答案 0 :(得分:0)

我对问题进行了一些调查:

q1:什么是内核堆栈的问题?

a:与用户线程相关的内核堆栈。由于异常纤维不是 一个真正的线程,不包含内核堆栈。

问题2:我认为操作系统会阻止用户线程,直到操作系统未完成任务。是这样吗?

a:如果用户线程执行syscall,或者“陷阱”,那么我们进入内核模式,内核代码将在上下文中执行,称为“异常上下文陷阱”,而且这段代码可以看到用户空间进程的所有内存,线程发起它。实际上可以说它是类似的线程。

q3:我认为这个线程与启动所有这些工作的用户空间线程没有任何关系。我错了吗?

a:在这种“异常上下文陷阱”中,kenrel代码查看用户空间线程进程所有者的完整用户空间内存。当来自用户空间的线程执行I / O请求时,I / O Dispatcher(在内核模式下)执行一个工作驱动程序例程的调用...(它将在用户空间线程的上下文中执行)。它的设计就是......

但它在内核中存在其他两个上下文:

  1. 中断上下文,没有关于maped内存的保证

  2. Kerenel模式线程上下文。如msdn中所述,关于PsCreateSystemThread “这样的系统线程没有TEB或用户模式上下文,只能在内核模式下运行。”

  3. 文献:

    1. Windows 2000设备驱动程序书,第二版,Art Baker,Jerry Lozano 第3章,内核模式I / O处理

    2. Microsoft®Windows®2000,第三版,David A. Solomon和Mark E. Russinovich,第6章。

    3. p.s。我不会提供书籍链接,因为它受到stackoverflow策略的限制。有人给了我更多的弊端,由于愚蠢的问题和愚蠢的链接,我将在这个论坛中被封锁......