2015-10-15 98 views
-2

想象用户空间线程(通过WinApi创建)。用户线程(OS Windows)的内核模式堆栈是什么?

旁边:

  • 线程环境块
  • GDI处理,OpenGL的处理
  • 用户空间的栈
  • Therad内核(寄存器)

听说其持有的堆栈内核模式 - 12 KB - x86,24 KB - x64

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

据我了解,当我们执行系统调用我们:

  1. 填入值,或在我们的上下文指针

  2. 启动寄存器通过INT中断甚至CALL(远调用保护模式)

  3. 在这里,我们是在内核中断服务例程。

Q2:我觉得 OS阻止用户线程,直到OS未完成的任务。是这样吗?

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

Q3:我认为,内核线程共享任何用户空间线程谁发起这一切工作。我错了吗?

+0

你的第(3)步是错误的 - 线程没有被阻止,它继续运行在内核模式,使用它的内核模式堆栈。如果操作需要I/O或不能立即完成的IPC,则*线程将被阻塞。但在很多情况下,线程会自行执行请求的操作,并在完成时转换回用户模式。 (对于每次转换到内核模式,要求上下文切换到另一个线程的速度要慢得多)。 –

+0

谢谢,但对我来说,内核由4个线程(kerels数)组成,用户空间可以由10个进程组成每个100个线程....为什么os需要在内核上存储1000个内核?我认为操作系统可以推动任务到队列中,阻止你的线程...... – bruziuz

+0

我在内核模式下工作,但我没有创建线程他们....所以我不能说精确 – bruziuz

回答

0

我调查的问题了一下:

Q1:现在的问题是什么内核堆栈?

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

Q2:我觉得OS阻止用户线程,直到OS未完成的任务。是这样吗?

a:如果用户线程执行系统调用或“陷阱”,那么我们进入内核模式,内核代码将在上下文中执行,并调用“异常上下文的陷阱”,而且这段代码可以看到用户进程的所有内存,线程启动它。真的可以说它是类似的线程。

Q3:我觉得这线程共享任何用户空间线程谁发起这一切工作。我错了吗?

一个:在这种“异常上下文的陷阱”的kenrel代码看到用户空间线程进程所有者的用户空间充满存储器。当用户空间的线程执行I/O请求时,I/O分派器(在内核模式下)执行工作驱动程序例程之一的调用...(它将在用户空间线程的上下文中执行)。它的目的是使....

但它在内核中存在另外两个方面:

  1. 中断背景下,有大约马培德内存

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


文学:

  1. Windows 2000设备驱动程序的书,第二版,艺术贝克,杰里洛萨诺 第3章,内核模式I/O处理

  2. InsideMicrosoft®Windows®2000,Third Edition,David A. Solomon和Mark E. Russinovich,第6章。

p.s.我不会提供书籍链接,因为它受到了计算器策略的限制。有人给我更多的缺点,我会在这个论坛,由于愚蠢的问题和愚蠢的链接被阻止...